Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions hw_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
class CountVectorizer:
"""
Класс CountVectorizer используется для разбивки текста на слова.
Он удаляет знаки препинания и преобразует все слова в нижний регистр.
Формируется словарь известных слов, который также используется
для последующего кодирования текста.
Возвращается закодированный вектор длиной количества уникальных слов
и целым числом количества раз, когда каждое слово появлялось.

Attributes
----------
uniquewords : list
список из уникальных слов в предложенном массиве
wordcount : list[list]
массив из списков с количеством появлений каждого слова

Methods
-------
fit_transform(array_of_strings)
Выводит массив из документов с количеством появлений каждого слова в документе
get_feature_names()
Выводит список уникальных слов из предложенного массива
"""

def __init__(self):
self.uniquewords = []
self.wordcount = []

def fit_transform(self, array_of_strings: list[str]) -> list[list[int]]:
"""
Считывает массив из строк и выводит терм-документный вектор
для каждой строки из массив. На выходе получается терм-документная матрица.

Parameters
----------
array_of_strings : list
массив строк
"""
for string in array_of_strings:
for word in string.lower().split():
if word not in self.uniquewords:
self.uniquewords.append(word)
Comment on lines +40 to +42

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь получается довольно высокая сложность О(N^2)
Можно сделать оптимальнее, если хранить уникальные слова не в массиве, а в какой-то другой структуре


for string in array_of_strings:
result = []
for word in self.uniquewords:
result.append(string.lower().count(word))
Comment on lines +46 to +47

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Второй раз приводим в нижний регистр те же данные
К тому же, тут может быть баг, если мы передадим к примеру строку "bla blablabla", то в результате получим [4, 1] так как bla найдется 4 раза

self.wordcount.append(result)

return self.wordcount

def get_feature_names(self) -> list[str]:
"""
Выводит массив уникальных слов,
встречающихся хотя бы в одном документе из предложенного массива
"""
return self.uniquewords


if __name__ == '__main__':
corpus = [
'Crock Pot Pasta Never boil pasta again',
'Pasta Pomodoro Fresh ingredients Parmesan to taste'
]
vectorizer = CountVectorizer()
count_matrix = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
print(count_matrix)