假設我有一個關於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矩陣和項目文件來獲得載體?我是否必須將巨大的矩陣存儲在服務器上的某個地方,並在每次查詢文檔時提取它,或者對於大數據實際應用程序是否存在一些近似值和啓發式?
請看看我的'text2vec'包的教程:dsnotes.com/text2vec/vectorization.html。我會幫忙,我會把它作爲答案。 –
我從你提到的那個網頁取的是特色哈希技巧,這是對Question2的回答。謝謝。 –
它應該回答這兩個問題。 a)idf只是每個字的縮放比例(我們從火車數據中得到)。 b)在基於詞彙表的新文檔向量化的情況下,我們根本不會考慮以前從未遇到的令牌。 –