2016-09-26 124 views
0

假設我有一個關於TF-IDF權重的文檔詞表矩陣,用於表示某些文檔的詞袋。例如。在R:如何用TF-IDF文檔 - 術語矩陣表示新文檔,以及如何用大矩陣實現生產?

library(tm) 
x <- c("a cat sat on a mat", "cat and dog are friends", "friends are sitting on a mat") 
corpus <- Corpus(VectorSource(x)) 
dtm <- DocumentTermMatrix(corpus, control = list(weighting = weightTfIdf) 
inspect(dtm[1:3,]) 
<<DocumentTermMatrix (documents: 3, terms: 8)>> 
Non-/sparse entries: 12/12 
Sparsity   : 50% 
Maximal term length: 7 
Weighting   : term frequency - inverse document frequency (normalized) (tf-idf) 

Terms 
Docs  and  are  cat  dog friends  mat  sat sitting 
    1 0.0000000 0.0000000 0.1949875 0.0000000 0.0000000 0.1949875 0.5283208 0.0000000 
    2 0.3169925 0.1169925 0.1169925 0.3169925 0.1169925 0.0000000 0.0000000 0.0000000 
    3 0.0000000 0.1462406 0.0000000 0.0000000 0.1462406 0.1462406 0.0000000 0.3962406 

問題1:

如何獲得一個新的文檔的向量表示?

a)假設所有文檔的標記都有矩陣中的列(例如上面例子中的「貓和狗是墊子上的朋友」) - 我如何計算IDF(即如果IDFi = log(N/ni)其中N是總數爲文件和ni是包含令牌i的文件號,如何在新文件中計算IDF?)

b)當新文檔包含之前從未遇到的令牌(例如上面的「貓和老鼠是朋友」例如) - 他們的TF-IDF如何計算?

問題2:

現在假設DTM矩陣是巨大雖然稀疏,像100K文件X 200K字。一個快速的應用程序需要「快速」獲得每個即將到來的文檔的向量表示(我沒有一個確切的定義,我說話少於500毫秒),例如,用於計算文件之間的餘弦距離。

這是一個生產應用程序,不一定在R.是否有一個常見的方式來存儲這樣大的DTM矩陣和項目文件來獲得載體?我是否必須將巨大的矩陣存儲在服務器上的某個地方,並在每次查詢文檔時提取它,或者對於大數據實際應用程序是否存在一些近似值和啓發式?

+0

請看看我的'text2vec'包的教程:dsnotes.com/text2vec/vectorization.html。我會幫忙,我會把它作爲答案。 –

+0

我從你提到的那個網頁取的是特色哈希技巧,這是對Question2的回答。謝謝。 –

+0

它應該回答這兩個問題。 a)idf只是每個字的縮放比例(我們從火車數據中得到)。 b)在基於詞彙表的新文檔向量化的情況下,我們根本不會考慮以前從未遇到的令牌。 –

回答

0

這個答案我會用text2vec包(> = 0.4)而不是tm。我個人不建議使用tm有很多原因 - 請看SO上的大量類似問題。但我有偏見,因爲我是text2vec的作者。

有關涵蓋所有問題的完整文章,請查看this tutorial

下面是用簡單的英語答案:

    • idf只是每個字縮放至極,我們從訓練數據得到。您可以將完全相同的轉換應用於不可見的數據。
    • 萬一
    • 詞彙基於矢量的,我們只是之前
  1. 你必須保持idf稀疏對角矩陣(或者你可以把它作爲權重的向量)不會考慮從未遇到過的新標記文件。對於基於詞彙表的特徵散列矢量化,您可能很容易實現幾個ms響應時間。通過上面的鏈接參見教程。