Одна из первых концепций обрабтки естественных языков Bag-of-Words — это статистический анализ, анализирующий количественное вхождение слов в документах. Не смотря на то, что подход сформирован весьма давно, он отлично подходит для первичной обработки текстов и быстрого прототипирования.
Модуль CountVectorizer в sklearn как раз подзволяет сконвертировать набор текстов в матрицу токенов, находящихся в тексте. Также имеется много полезных настроек, например можно задать минимальное количество необходимое для появления токена в матрице и даже получить статистику по n-граммам. Следует учитывать, что CountVectorizer по умолчанию сам производит токенизацию и выкидывает слова с длиной меньшей чем два.
Пример:
from sklearn.feature_extraction.text import CountVectorizer import numpy as np # инициализируем vectorizer = CountVectorizer() # составляем корпус документов corpus = [ 'слово1 слово2 слово3', 'слово2 слово3', 'слово1 слово2 слово1', 'слово4' ] # подсчитываем X = vectorizer.fit_transform(corpus) # таким образом будет подсчитана следующая структура: # | слово1 | слово2 | слово3 | слово4 # текст1 | 1 | 1 | 1 | 0 # текст2 | 0 | 1 | 1 | 0 # текст3 | 2 | 1 | 0 | 0 # текст4 | 0 | 0 | 0 | 1 # чтобы получить сгенерированный словарь, из приведенной структуры CountVectorizer, стоит отметить что порядок совпадает с матрицей vectorizer.get_feature_names() # ['слово1', 'слово2', 'слово3', 'слово4'] # чтобы узнать индекс токена в словаре vectorizer.vocabulary_.get('слово3') # вернет 2 # показать матрицу X.toarray() # теперь можно быстро подсчитать вектор для нового документа vectorizer.transform(["слово1 слово4 слово4"]) # результат [[1 0 0 2]] # чтобы узнать количественное вхождение каждого слова: matrix_freq = np.asarray(X.sum(axis=0)).ravel() final_matrix = np.array([np.array(vectorizer.get_feature_names()), matrix_freq])
Один из минусов, что добавлять новые слова в словарь не получится, необходимо сразу указать все документы.
Второй из минусов, отчасти идущий от первого — плохая масштабируемость на большой набор текстов. Есть вероятность натолкнуться на MemoryError уже при десятке тысяч документов. Поэтому либо надо ограничивать количество фич/токенов для попадания в словарь с помощью настройки max_features или же использовать другую библиотеку. Однако для нескольких тысяч можно весьма быстро получить результат и далее использовать фичи например для классификации или кластеризации документов.