如何使用TF-IDF文档 - 术语矩阵表示新文档,以及如何使用大矩阵在生产中实现?

时间:2016-09-26 11:53:53

标签: r sparse-matrix tm tf-idf

假设我有一些关于某些文件的词袋表示的文档术语矩阵,具有TF-IDF加权。例如。在R:

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) {{1} }}是文件总数,N是包含令牌ni的文件编号,IDF如何在新文件中计算?)

b)当新文档包含之前从未遇到过的令牌时(例如上图中的“猫与老鼠是朋友”) - 他们的TF-IDF如何计算?

问题2:

现在假设DTM矩阵虽然很稀疏,但像100K文件X 200K字一样。并且快速应用程序需要“快速”获取每个即将到来的文档的向量表示(我没有确切的定义,我说的不到500毫秒),例如,用于计算文档之间的余弦距离。

这是一个生产应用程序,不一定在R中。是否有一种常见的方法来存储这样大的DTM矩阵和项目文档以获取向量?我是否必须将巨大的矩阵存储在服务器上并在每次我想查询文档时将其提取出来,或者对于大数据实际应用程序是否有一些近似值,启发式算法?

1 个答案:

答案 0 :(得分:0)

这个答案我将使用text2vec包(&gt; = 0.4 )而不是tm。我个人不建议使用tm有很多原因 - 在SO上看到大量类似的问题。但我有偏见,因为我是text2vec的作者。

有关涵盖所有问题的完整文章请查看this tutorial

以下简明的答案:

    • idf只是我们从列车数据得到的每字缩放。您可以将完全相同的转换应用于看不见的数据。
    • 如果基于词汇表的新文档矢量化,我们只是不会考虑以前从未遇到的令牌
  1. 您必须保持idf稀疏对角矩阵(或者您可以将其视为权重向量)。对于基于词汇表的特征散列矢量化,您可能很容易实现很少ms个响应时间。请参阅上面链接的教程。