Используйте sklearn's CountVectorizer :
from sklearn.feature_extraction.text import CountVectorizer
df = pd.DataFrame({'texts': ["This is one text (the first one)",
"This is the second text",
"And, finally, a third text"
]})
cv = CountVectorizer()
cv.fit(df['texts'])
results = cv.transform(df['texts'])
print(results.shape) # Sparse matrix, (3, 9)
Если корпус достаточно мал, чтобы поместиться в вашей памяти (а 2000+ достаточно мал), вы можете преобразовать разреженную матрицу вpandas dataframe следующим образом:
features = cv.get_feature_names()
df_res = pd.DataFrame(results.toarray(), columns=features)
df_res
- это результат, который вы хотите:
df_res
index and finally first is one second text the third this
0 0 0 1 1 2 0 1 1 0 1
1 0 0 0 1 0 1 1 1 0 1
2 1 1 0 0 0 0 1 0 1 0
Если вы получаете MemoryError
, вы можете уменьшить словарьслова для рассмотрения использования различных параметров CountVectorizer
:
- Установить параметр
stop_words='english'
, чтобы игнорировать английские стоп-слова (например, the
и `and) - Использовать
min_df
и max_df
, что заставляет CountVectorizer
игнорировать некоторые слова на основе частоты документа (слишком частые или редкие слова, которые могут быть бесполезны) - Используйте
max_features
, чтобы использовать только самые распространенные n
слова.