まず、文書ごとの用語ごとのTF-IDFスコアを抽出します。
from gensim import corpora, models, similarities
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
stoplist = set('for a of the and to in'.split())
texts = [[Word for Word in document.lower().split() if Word not in stoplist] for document in documents]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
印刷する:
for doc in corpus_tfidf:
print doc
[アウト]:
[(0, 0.4301019571350565), (1, 0.4301019571350565), (2, 0.4301019571350565), (3, 0.4301019571350565), (4, 0.2944198962221451), (5, 0.2944198962221451), (6, 0.2944198962221451)]
[(4, 0.3726494271826947), (7, 0.27219160459794917), (8, 0.3726494271826947), (9, 0.27219160459794917), (10, 0.3726494271826947), (11, 0.5443832091958983), (12, 0.3726494271826947)]
[(6, 0.438482464916089), (7, 0.32027755044706185), (9, 0.32027755044706185), (13, 0.6405551008941237), (14, 0.438482464916089)]
[(5, 0.3449874408519962), (7, 0.5039733231394895), (14, 0.3449874408519962), (15, 0.5039733231394895), (16, 0.5039733231394895)]
[(9, 0.21953536176370683), (10, 0.30055933182961736), (12, 0.30055933182961736), (17, 0.43907072352741366), (18, 0.43907072352741366), (19, 0.43907072352741366), (20, 0.43907072352741366)]
[(21, 0.48507125007266594), (22, 0.48507125007266594), (23, 0.48507125007266594), (24, 0.48507125007266594), (25, 0.24253562503633297)]
[(25, 0.31622776601683794), (26, 0.31622776601683794), (27, 0.6324555320336759), (28, 0.6324555320336759)]
[(25, 0.20466057569885868), (26, 0.20466057569885868), (29, 0.2801947048062438), (30, 0.40932115139771735), (31, 0.40932115139771735), (32, 0.40932115139771735), (33, 0.40932115139771735), (34, 0.40932115139771735)]
[(8, 0.6282580468670046), (26, 0.45889394536615247), (29, 0.6282580468670046)]
このコーパス内の単語の「顕著性」または「重要性」を検索する場合は、単純に、すべてのドキュメントのtf-idfスコアの合計を計算し、それをドキュメントの数で割りますか? =すなわち.
>>> tfidf_saliency = Counter()
>>> for doc in corpus_tfidf:
... for Word, score in doc:
... tfidf_saliency[Word] += score / len(corpus_tfidf)
...
>>> tfidf_saliency
Counter({7: 0.12182694202050007, 8: 0.11121194156107769, 26: 0.10886469856464989, 29: 0.10093919463036093, 9: 0.09022272408985754, 14: 0.08705221175200946, 25: 0.08482488519466996, 6: 0.08143359568202602, 10: 0.07480097322359022, 12: 0.07480097322359022, 4: 0.07411881371164887, 13: 0.07117278898823597, 5: 0.07104525967490458, 27: 0.07027283689263066, 28: 0.07027283689263066, 11: 0.060487023243988705, 15: 0.055997035904387725, 16: 0.055997035904387725, 21: 0.05389680556362955, 22: 0.05389680556362955, 23: 0.05389680556362955, 24: 0.05389680556362955, 17: 0.048785635947490406, 18: 0.048785635947490406, 19: 0.048785635947490406, 20: 0.048785635947490406, 0: 0.04778910634833961, 1: 0.04778910634833961, 2: 0.04778910634833961, 3: 0.04778910634833961, 30: 0.045480127933079706, 31: 0.045480127933079706, 32: 0.045480127933079706, 33: 0.045480127933079706, 34: 0.045480127933079706})
出力を見て、コーパスで最も「目立つ」単語は次のとおりであると想定できますか。
>>> dictionary[7]
u'system'
>>> dictionary[8]
u'survey'
>>> dictionary[26]
u'graph'
もしそうなら、ドキュメント全体の単語のTF-IDFスコアの合計の数学的解釈は何ですか?
コーパスのTF-IDFの解釈は、特定の用語のコーパスの最高のTF-IDFです。
corpus_tfidfで上位の単語を見つけます。
topWords = {}
for doc in corpus_tfidf:
for iWord, tf_idf in doc:
if iWord not in topWords:
topWords[iWord] = 0
if tf_idf > topWords[iWord]:
topWords[iWord] = tf_idf
for i, item in enumerate(sorted(topWords.items(), key=lambda x: x[1], reverse=True), 1):
print("%2s: %-13s %s" % (i, dictionary[item[0]], item[1]))
if i == 6: break
出力比較カート:
[〜#〜] note [〜#〜]:gensim
を使用して、corpus_tfidf
と一致するdictionary
を作成できませんでした。
ワードインディジーのみを表示できます。
Question tfidf_saliency topWords(corpus_tfidf) Other TF-IDF implentation
---------------------------------------------------------------------------
1: Word(7) 0.121 1: Word(13) 0.640 1: paths 0.376019
2: Word(8) 0.111 2: Word(27) 0.632 2: intersection 0.376019
3: Word(26) 0.108 3: Word(28) 0.632 3: survey 0.366204
4: Word(29) 0.100 4: Word(8) 0.628 4: minors 0.366204
5: Word(9) 0.090 5: Word(29) 0.628 5: binary 0.300815
6: Word(14) 0.087 6: Word(11) 0.544 6: generation 0.300815
TF-IDFの計算では、常にコーパスが考慮されます。
Pythonでテスト:3.4.2
顕著性はそれらで計算できるという2つのコンテキストがあります。
コーパス内の顕著性は、コーパス内の特定のWordの出現をカウントするか、Wordが出現するドキュメントのカウントの逆数によって簡単に計算できます(IDF = Inverted Document Frequency)。特定の意味を持つ言葉がどこにも出てこないからです。
ドキュメントの顕著性はtf_idfによって計算されます。それは2種類の情報で構成されているからです。グローバル情報(コーパスベース)およびローカル情報(ドキュメントベース)。「ドキュメント内の頻度が高いWordは現在のドキュメントでより重要である」という主張は、Wordのグローバルな顕著性に依存するため、完全に真または偽ではありません。特定のドキュメントでは、「it、is、am、is、...」のように、頻度が高い単語がたくさんあります。ただし、これらのWordはどのドキュメントでも重要ではなく、ストップワードとして使用できます。
----編集---
分母(= len(corpus_tfidf))は定数値であり、測定の基数ではなく序数を処理する場合は無視できます。一方、IDFはInverted Document Freqeuncyを意味するので、IDFは1/DFで再受信できます。 DFはコーパスレベルの値であり、TFはドキュメントレベルの値です。TF-IDFの合計は、ドキュメントレベルのTFをコーパスレベルのTFに変換します。実際、合計はこの数式に等しくなります。 :
count(Word)/ count(ドキュメントにはWordが含まれます)
この測定値は逆散乱値と呼ばれます。値が上がると、単語がドキュメントの小さなサブセットに集められ、逆も同様です。
この式はあまり役に立たないと思います。
これは素晴らしい議論です。このスレッドを開始していただきありがとうございます。 @avipにドキュメントの長さを含めるという考えは興味深いようです。実験して結果を確認する必要があります。それまでの間、少し違った方法で質問してみましょう。 TF-IDFの関連性スコアを照会するときに何を解釈しようとしていますか?
(コーパス全体で)Wordの関連性を全体的に理解しようとしている可能性があります。
# # features, corpus = 6 documents of length 3
counts = [[3, 0, 1],
[2, 0, 0],
[3, 0, 0],
[4, 0, 0],
[3, 2, 0],
[3, 0, 2]]
from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer(smooth_idf=False)
tfidf = transformer.fit_transform(counts)
print(tfidf.toarray())
# lambda for basic stat computation
summarizer_default = lambda x: np.sum(x, axis=0)
summarizer_mean = lambda x: np.mean(x, axis=0)
print(summarizer_default(tfidf))
print(summarizer_mean(tfidf))
結果:
# Result post computing TF-IDF relevance scores
array([[ 0.81940995, 0. , 0.57320793],
[ 1. , 0. , 0. ],
[ 1. , 0. , 0. ],
[ 1. , 0. , 0. ],
[ 0.47330339, 0.88089948, 0. ],
[ 0.58149261, 0. , 0.81355169]])
# Result post aggregation (Sum, Mean)
[[ 4.87420595 0.88089948 1.38675962]]
[[ 0.81236766 0.14681658 0.2311266 ]]
よく観察すると、すべてのドキュメントで発生したfeature1魔女が完全に無視されていないことがわかります。これは、idf = log [n/df(d、t)] + 1のsklearn実装が追加されているため、重要なWordたまたますべてのドキュメントで発生することは無視されません。例えば。特定のドキュメントを「オートバイ」(20_newsgroupデータセット)として分類する際に「bike」という単語が頻繁に発生します。
ここで、最初の2つの質問に関して、ドキュメントで発生する可能性のある主要な共通機能を解釈して理解しようとしています。その場合、ドキュメント内でWordが出現する可能性のあるものすべてを含む何らかの形で集計しても、数学的には何の影響もありません。 IMOのようなクエリは、データセットを探索し、データセットの概要を理解するのに非常に役立ちます。このロジックは、ハッシュを使用したベクトル化にも適用できます。
relevance_score = mean(tf(t、d)* idf(t、d))= mean((bias + inital_wt * F(t、d)/ max {F(t '、d)})* log(N/df (d、t))+ 1))
質問3は、予測モデルを構築するために選択される機能に貢献する可能性があるため、非常に重要です。機能選択にTF-IDFスコアを個別に使用するだけでは、複数のレベルで誤解を招く可能性があります。 「chi2」とTF-IDFの関連性スコアを組み合わせたような、より理論的な統計的検定を採用することは、より良いアプローチかもしれません。このような統計的テストは、それぞれのターゲットクラスに関連する機能の重要性も評価します。
もちろん、そのような解釈をモデルの学習した特徴の重みと組み合わせることは、テキストから派生した特徴の重要性を完全に理解するのに非常に役立ちます。
**問題は、ここで詳細に説明するためにもう少し複雑です。しかし、上記が役立つことを願っています。他の人は何を感じますか?
どういうわけか同じ問題に出くわしました。ここで私の解決策を共有しますが、それがどれほど効果的であるか本当にわかりません。
Tf-idfを計算すると、基本的に、用語対ドキュメントのマトリックスのようになります。
[terms/docs : doc1 , doc2 , doc3..... docn
term1 : tf(doc1)-idf, tf(doc2)-idf , tf(doc3)-idf.....
.
.
.
termn ........ ]
列doc1、doc2 ... docnは、n個の異なるメトリックに従ってすべての用語に与えられるスコアと考えることができます。列全体で合計すると、単純にスコアを平均化することになります。これは単純な方法であり、取得した情報を完全に表すものではありません。これはトップkの検索問題なので、もっと良いことができます。効率的なアルゴリズムの1つはFaginのアルゴリズムであり、この考えに基づいて機能します。
並べ替えられたリストは、すべてのリストで見られたk個のデータアイテムが見つかるまでスキャンされます。その後、アルゴリズムが停止し、すべてのリストに存在しなかったものも含めて、これまでに見られたすべてのデータアイテムの間で保証されます。上位k個のデータ項目が見つかります。
ここで並べ替えられたリストとは、特定のドキュメントの1つの列がリストになり、n個のリストがあることを意味します。だから、それらのそれぞれを並べ替えてから、その上で手抜きをする。
それについてもっと読む ここ
このコーパス内の単語の「顕著性」または「重要性」を見つけたい場合、すべてのドキュメントにわたるtf-idfスコアの合計を単純にして、それをドキュメントの数で除算できますか?もしそうなら、文書全体の単語のTF-IDFスコアの合計の数学的解釈は何ですか?
ドキュメント全体でtd-idfスコアを合計した場合、そうでなければスコアが低い用語はブーストされ、スコアが高い用語はスコアが低くなる可能性があります。
ドキュメントの総数で単純に除算するだけでは、これに対処するのに十分な正規化になるとは思いません。おそらくドキュメントの長さを正規化係数に組み込むのでしょうか?いずれにせよ、そのような方法はすべてドメインごとに調整する必要があると思います。
したがって、一般的に言えば、数学的には望ましくない平均化効果が得られると思います。