Как получить лучшие n членов с наибольшим счетом tf-idf - большая разреженная матрица - PullRequest
2 голосов
/ 21 июня 2019

Есть этот код:

feature_array = np.array(tfidf.get_feature_names())
tfidf_sorting = np.argsort(response.toarray()).flatten()[::-1]

n = 3
top_n = feature_array[tfidf_sorting][:n]

из этого ответа.

Мой вопрос: как мне эффективно это сделать в случае, когда моя разреженная матрица слишком велика для одновременного преобразования в плотную матрицу (с response.toarray())?

По-видимому, общий ответ заключается в разделении разреженной матрицы на фрагменты, выполнении преобразования каждого фрагмента в цикле for и последующем объединении результатов по всем фрагментам.

Но я хотел бы увидеть конкретно код, который делает это в общей сложности.

1 Ответ

1 голос
/ 22 июня 2019

Если у вас есть глубокий взгляд на этот вопрос, они заинтересованы в знании лучших tf_idf баллов для одного документа.

когда вы хотите сделать то же самое для большого корпуса, вам необходимо суммировать баллы каждой функции по всем документам (но это не имеет смысла, поскольку баллы l2 нормализованы в TfidfVectorizer(), читайте здесь ). Я бы порекомендовал использовать .idf_ баллов, чтобы узнать особенности с высокой частотой инверсий документов.

В случае, если вы хотите узнать основные функции, основанные на количестве вхождений, используйте CountVectorizer()

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
corpus = [
    'I would like to check this document',
    'How about one more document',
    'Aim is to capture the key words from the corpus'
]
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(corpus)
feature_array = vectorizer.get_feature_names()

top_n = 3

print('tf_idf scores: \n', sorted(list(zip(vectorizer.get_feature_names(), 
                                             X.sum(0).getA1())), 
                                 key=lambda x: x[1], reverse=True)[:top_n])
# tf_idf scores : 
# [('document', 1.4736296010332683), ('check', 0.6227660078332259), ('like', 0.6227660078332259)]

print('idf values: \n', sorted(list(zip(feature_array,vectorizer.idf_,)),
       key = lambda x: x[1], reverse=True)[:top_n])

# idf values: 
#  [('aim', 1.6931471805599454), ('capture', 1.6931471805599454), ('check', 1.6931471805599454)]

vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(corpus)
feature_array = vectorizer.get_feature_names()
print('Frequency: \n', sorted(list(zip(vectorizer.get_feature_names(), 
                                         X.sum(0).getA1())),
                            key=lambda x: x[1], reverse=True)[:top_n])

# Frequency: 
#  [('document', 2), ('aim', 1), ('capture', 1)]
...