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

How to represent a new document with a TF-IDF document-term-matrix, and how to implement in production with a large matrix?

假设我有一个关于某些文档的词袋表示的文档术语矩阵,具有 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) 假设所有文档的标记在矩阵中都有列(例如上例中的 "cat and dogs are friends on mat")- 我如何计算 IDF(即如果 IDFi = log(N/ni) 其中 N是文档总数,ni 是包含标记 i 的文档数,新文档中的 IDF 是如何计算的?)

b) 当新文档包含以前从未遇到过的标记时(例如上例中的 "cat and mouse are friends")- 他们的 TF-IDF 是如何计算的?

问题2:

现在假设 DTM 矩阵虽然稀疏但很大,比如 100K 文档 X 200K 单词。一个快速的应用程序需要获取每个即将到来的文档的矢量表示 "fast"(我没有确切的定义,我说的是少于 500 毫秒),例如用于计算文档之间的余弦距离。

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

这个答案我将使用 text2vec 包 (>= 0.4) 而不是 tm。出于多种原因,我个人不建议使用 tm - 请参阅有关 SO 的大量类似问题。但我有偏见,因为我是 text2vec 的作者。

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

以下是简单的英语答案:

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