没有图像的词袋

Bag of Words without images

我正在尝试构建一个词袋 class,它可以创建一个词汇表并为词汇表中的给定向量找到最近的词。 例如,我加载一个浮点向量或矩阵并想找到最近的单词。

在 openCV 中我只找到了 BOWImgDescriptorExtractor,但这只适用于图像。

有人可以向我解释一下如何在我的词汇表中找到与给定向量最接近的词吗?我读了很多关于 FlannBasedMatcher 和 BruteforceMatcher 的文章,但我不知道如何将矢量转换为我的词汇表的格式。

感谢您的帮助

您想将文本文档转换为向量,其中每个特征对应一个词(或一个 n-gram,即一系列 n 个词),每个特征的值是该词的计数在文档中,或者它的频率,或者更好的是,它是 tf-idf.

一旦可以将文档转换为矢量,就可以测量任意两个矢量之间的距离。这两个向量代表两个不同的文档。在您的情况下,一个向量将代表一个包含单个单词的文档,另一个向量将是您感兴趣的文本文档。为了避免文档的长度在距离测量中发挥作用,cosine distance is used a lot in text analysis, rather than euclidean distance .

要找到与给定向量最近的单词,您基本上可以通过计算每个单词的向量与查询向量之间的余弦距离来进行强力搜索。给你最小距离的单词就是赢家。

如果您需要对词汇量很大的大量向量执行此操作,可以使用一些算法使此搜索比蛮力搜索快得多。它们涉及建立索引 (spatial data structures) that allow you to check the distance of a smaller subset to find the winner (you get to automatically eliminate a whole bunch of words without explicitly measuring the distance). If you're willing to lose a little bit of accuracy to get much much faster in finding the nearest word, there are great algorithms for that as well.

要实现文本文档到矢量转换器,首先您需要遍历整个语料库并记录每个唯一的单词,制作一个散列 table 为您看到的每个单词定义一个整数 ID。这是你的词汇。假设有 50K 个单词。您的每个文档都将由一个 50K 长的向量表示。每个向量都非常稀疏,大多数特征都为 0(大多数文档只包含整个词汇表的一小部分)。您将检查每个文档并计算文档中每个单词的值(计数、频率或 tf-idf),并将此值记录在与相关单词相关的列下的向量中。这就是将文本转换为矢量的方式。单词本身就是最简单的向量,当然:对应列中为 1,其他列中为 0。

就像提到的 stan0,word2vec is open source and already does all this, so I'd give it a try. Here is a tutorial to get you started.