У меня недавно была похожая проблема, но я не был вынужден использовать 20 самых важных слов.Скорее, я мог бы выбрать слова, у которых показатель ци был выше установленного порога.Я дам вам метод, который я использовал для решения этой второй задачи.Причина, по которой это предпочтительнее, чем просто использование первых n слов в соответствии с их хи-баллом, заключается в том, что эти 20 слов могут иметь крайне низкий балл и, таким образом, почти ничего не вносят в задачу классификации.
Здеськак я это сделал для задачи бинарной классификации:
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_selection import chi2
THRESHOLD_CHI = 5 # or whatever you like. You may try with
# for threshold_chi in [1,2,3,4,5,6,7,8,9,10] if you prefer
# and measure the f1 scores
X = df['text']
y = df['labels']
cv = CountVectorizer()
cv_sparse_matrix = cv.fit_transform(X)
cv_dense_matrix = cv_sparse_matrix.todense()
chi2_stat, pval = chi2(cv_dense_matrix, y)
chi2_reshaped = chi2_stat.reshape(1,-1)
which_ones_to_keep = chi2_reshaped > THRESHOLD_CHI
which_ones_to_keep = np.repeat(which_ones_to_keep ,axis=0,repeats=which_ones_to_keep.shape[1])
В результате получается матрица, содержащая единицы, в которых термины имеют показатель хи выше порогового значения, и нули, где они имеют показатель хи ниже, чемпорог.Тогда эта матрица может быть np.dot
либо с матрицей cv, либо с матрицей tfidf и впоследствии передана методу fit
классификатора.
Если вы сделаете это, столбцы матрицы which_ones_to_keep
соответствуют столбцам объекта CountVectorizer
, и таким образом вы можете определить, какие термины были релевантными для данных меток, сравнив ненулевые столбцы матрицы which_ones_to_keep
с индексами .get_feature_names()
, или вы можете простозабудьте об этом и передайте прямо в классификатор.