web-dev-qa-db-ja.com

Scikit Learn TfidfVectorizer:最高のtf-idfスコアを持つ上位n個の用語を取得する方法

キーワード抽出の問題に取り組んでいます。非常に一般的なケースを考えます

tfidf = TfidfVectorizer(tokenizer=tokenize, stop_words='english')

t = """Two Travellers, walking in the noonday Sun, sought the shade of a widespreading tree to rest. As they lay looking up among the pleasant leaves, they saw that it was a Plane Tree.

"How useless is the Plane!" said one of them. "It bears no fruit whatever, and only serves to litter the ground with leaves."

"Ungrateful creatures!" said a voice from the Plane Tree. "You lie here in my cooling shade, and yet you say I am useless! Thus ungratefully, O Jupiter, do men receive their blessings!"

Our best blessings are often the least appreciated."""

tfs = tfidf.fit_transform(t.split(" "))
str = 'tree cat travellers fruit jupiter'
response = tfidf.transform([str])
feature_names = tfidf.get_feature_names()

for col in response.nonzero()[1]:
    print(feature_names[col], ' - ', response[0, col])

そしてこれは私に与えます

  (0, 28)   0.443509712811
  (0, 27)   0.517461475101
  (0, 8)    0.517461475101
  (0, 6)    0.517461475101
tree  -  0.443509712811
travellers  -  0.517461475101
jupiter  -  0.517461475101
fruit  -  0.517461475101

どっちがいい。入ってくる新しいドキュメントについて、最高のtfidfスコアを持つ上位n個の用語を取得する方法はありますか?

24
AbtPst

行列を代わりにnumpy配列として取得するには、少し歌と踊りをする必要がありますが、これはあなたが探していることをするはずです:

_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]
_

これは私に与えます:

_array([u'fruit', u'travellers', u'jupiter'], 
  dtype='<U13')
_

argsort呼び出しは本当に便利なものです ここにそのドキュメントがありますargsortは小から大へのソートのみをサポートするため、_[::-1]_を実行する必要があります。 flattenを呼び出して、次元を1dに縮小し、ソートされたインデックスを使用して1dフィーチャ配列のインデックスを作成できるようにします。 flattenへの呼び出しを含めることは、一度に1つのドキュメントをテストする場合にのみ機能することに注意してください。

また、別のメモでは、tfs = tfidf.fit_transform(t.split("\n\n"))のようなものを意味しましたか?それ以外の場合、複数行の文字列の各用語は「ドキュメント」として扱われます。代わりに_\n\n_を使用するということは、実際には4つのドキュメント(各行に1つ)を参照していることを意味します。

26
hume

スパース行列自体を使用したソリューション(.toarray()なし)!

tfidf = TfidfVectorizer(stop_words='english')
corpus = [
    'I would like to check this document',
    'How about one more document',
    'Aim is to capture the key words from the corpus',
    'frequency of words in a document is called term frequency'
]

X = tfidf.fit_transform(corpus)
feature_names = np.array(tfidf.get_feature_names())


new_doc = ['can key words in this new document be identified?',
           'idf is the inverse document frequency caculcated for each of the words']
responses = tfidf.transform(new_doc)


def get_top_tf_idf_words(response, top_n=2):
    sorted_nzs = np.argsort(response.data)[:-(top_n+1):-1]
    return feature_names[response.indices[sorted_nzs]]

print([get_top_tf_idf_words(response,2) for response in responses])

#[array(['key', 'words'], dtype='<U9'),
 array(['frequency', 'words'], dtype='<U9')]
1
Venkatachalam N