有此代码:
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]
来自this答案。
我的问题是,在我的稀疏矩阵太大而无法立即转换为密集矩阵(使用response.toarray()
的情况下,如何有效地做到这一点?
显然,一般的答案是将稀疏矩阵分成多个块,在for循环中进行每个块的转换,然后将结果组合到所有块中。
但是我想特别看看总共执行此操作的代码。
答案 0 :(得分:1)
如果您深入了解that问题,他们会对了解单个文档的最高tf_idf
分数感兴趣。
当您想对大型语料库执行相同的操作时,您需要对所有文档中每个功能的得分求和(仍然没有意义,因为得分在l2
中已标准化,TfidfVectorizer()
阅读here)。我建议使用.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)]