2017-02-16 81 views
16

首先讓我們提取每學期的TF-IDF得分每份文件:解讀跨文檔的單詞的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 

[OUT]:

[(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)] 

如果我們要找到「顯着性」或者這個軀體內的話,「重要性」,CAN我們簡單地將所有文檔中tf-idf分數的總和除以文檔數量? I.e.

>>> 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的總和的數學解釋文檔中的分數是多少?

+0

你可以請你的'字典'的輸出附加到你的問題。我想和我的'詞典'做比較,這樣我就可以在我的答案中更新我的輸出表。 – stovfl

+0

哎呀,對不起,我沒有保存它。字典會有所不同,因爲我使用的是Python3,而且字典不一樣,如果我重新運行它。但是單詞的排名應該是確定性的,因爲它基於靜態計數,重新運行gensim代碼,您應該得到與前3相同的「系統,調查,圖表」。 – alvas

+0

對不起,不能使用gensim。 – stovfl

回答

1

有兩種情況下可以在其中計算顯着性。

  1. 顯着性在語料庫
  2. 顯着性在單個文檔中簡單地可以通過在語料庫或文檔的計數的逆計數特定字的出現來計算語料庫

顯着性在該單詞出現在(IDF =倒置文件頻率)中。因爲具有特定含義的詞不會出現在任何地方。

文檔中的顯着性由tf_idf計算。因爲這是由兩種信息組成的。全球信息(基於語料庫的)和本地信息(基於文檔的)。因爲它取決於詞彙的全球顯着性,因此認爲「在文檔中文檔頻率較大的詞語更重要」並不完全對或不對。在一個特定的文件中,你有很多詞,比如「它,是,是,是......」,頻率很高。但是這些詞在任何文檔中都不重要,你可以把它們當作停詞!

----編輯---

分母(= LEN(corpus_tfidf))是一個恆定值,如果你要處理的序數,而不是測量的基數可以忽略不計。另一方面,我們知道IDF意味着反向文檔頻率,因此IDF可以被1/DF重新表示。我們知道DF是一個語料庫級別值,TF是文檔級別值。 TF-IDF Summation將文檔級TF轉換爲語料庫級TF。實際上,求和等於這個公式:

計數()/計數(文檔包含

該測量可以被稱爲逆散射值。當值增加時意味着文字被收集到文檔的較小子集中,反之亦然。

我相信這個公式不是很有用。

+0

文件內部和文件間的「重要性」/「顯着性」概念是TF-IDF,IDF和TFF,IDF和TF-IDF的定義是明確的。但是你沒有回答什麼是跨文件TF-IDF總和的解釋; P – alvas

0

如果我們要找到「顯着」或在 的話「重要性」這個主體,我們才能簡單的做所有 文件的TF-IDF得分總和,並通過數量除以它文件?如果是這樣,那麼跨越文檔的文字 的TF-IDF得分之和的數學解釋是什麼?

如果您將文檔中的td-idf分數相加,那麼本來分數較低的分數可能會得到提升,分數較高的分數可能會使分數下降。

我不認爲簡單地除以文件總數就足以解決這個問題。也許將文檔長度納入標準化因子?無論哪種方式,我認爲所有這些方法仍然需要根據域進行調整。

所以,一般來說,數學上我希望你會得到一個不希望的平均效應。

+0

當在文件中彙總TF-IDF最終具有與IDF相似的數字/效果時,不會對文件標準化進行文件歸檔? – alvas

+0

我認爲它會是相似的,但會期望準確度(根據人的判斷)下降。我正在考慮體重日誌N/n_term:如果文檔與上下文無關,則n_term太容易偏斜。雖然,如果N足夠大,這可能會好嗎?也許你可以對第一個文檔進行手動比較,而不用總結第一個文檔? – avip

2

語料庫中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 

輸出比較購物車:
注意:Could'n使用gensim,創建一個匹配dictionarycorpus_tfidf
只能顯示Word Indizies。

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

+0

如何定義「文檔」是一個模糊的問題。我不認爲文檔集合中的最大tf-idf分數代表了語料庫的tf-idf。 – alvas

+0

你可以給一個鏈接*「如何定義一個文檔」是一個模糊的「*。你怎麼看:Score = Sum(語料庫中每學期的tf-idf) – stovfl

+0

對於語料庫中的句子,句子是一個文件?或者是句組的文檔?在TF-IDF的情況下,如果TF是全文範圍計算(所有句子之和),那還是tf-idf?文檔在語料庫中用於句子的概念相當模糊。 – alvas

1

這是一個偉大的討論。感謝您啓動此線程。通過@avip包含文檔長度的想法看起來很有趣。將不得不實驗並檢查結果。同時讓我嘗試以不同的方式提問。當查詢TF-IDF相關性分數時,我們試圖解釋什麼?

  1. 可能試圖瞭解在文檔級別的字相關
  2. 可能試圖瞭解每類詞相關
  3. 可能試圖理解這個詞相關的整體(在整個 語料庫)

    # # 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. +1的sklearn實現這樣在所有文檔中碰巧發生的重要詞語都不會被忽略。例如。「自行車」這個詞在將特定文件歸類爲「摩托車」(20_新聞組數據集)時經常出現。

  1. 現在針對前兩個問題,一個是試圖解釋和理解可能在文檔中發生的最常見的功能。在這種情況下,以某種形式進行彙總(包括文檔中所有可能出現的詞語),即使在數學上也不會帶走任何內容。 IMO這樣的查詢對於探索數據集並幫助理解數據集的內容非常有用。該邏輯也可以應用於使用散列的矢量化。 (t,d))=平均值((偏差+ inital_wt * F(t,d)/ max {F日誌(N/df(d,t))+ 1))

  2. 問題3非常重要,因爲它可能會有助於構建預測模型。僅使用TF-IDF分數獨立進行特徵選擇可能會在多個層面產生誤導。採用更加理論化的統計檢驗,如'chi2'加上TF-IDF相關性分數可能是更好的方法。這樣的統計測試也評估了該特徵對於相應目標類別的重要性。

當然,將這種解釋與模型的學習特徵權重結合起來,對於完全理解文本派生特徵的重要性非常有幫助。

**這個問題稍微複雜一點,在這裏詳細介紹。但是,希望以上幫助。別人覺得什麼?

參考:https://arxiv.org/abs/1707.05261

相關問題