我正在尝试建立一个单词类,它可以创建一个词汇表,并在词汇表中找到给定向量的最近单词。 例如,我加载浮点矢量或矩阵,并希望找到最近的单词。
在openCV中我只找到了BOWImgDescriptorExtractor,但这只适用于图像。
有人可以向我解释我如何在词汇表中找到给定矢量的最近单词吗?我读了很多关于FlannBasedMatcher和BruteforceMatcher的内容,但我不知道如何将矢量转换为我的词汇表格式。
感谢您的帮助
答案 0 :(得分:1)
您希望将文本文档转换为向量,其中每个要素对应一个单词(或一个n-gram,它是一系列n个单词),每个要素的值是该单词的计数。文档,或其频率,或更好,它是tf-idf。
一旦有了将文档转换为矢量的方法,就可以测量任意两个矢量之间的距离。这两个向量代表两个不同的文档。在您的情况下,一个向量将表示具有单个单词的文档,另一个向量将是您感兴趣的文本文档。为避免文档长度在距离度量中起作用,cosine distance在文本分析中使用了很多,而不是euclidean distance。
要查找给定矢量的最近单词,您基本上可以通过计算每个单词的向量和查询向量之间的余弦距离来进行强力搜索。给你最小距离的词是胜利者。
如果你需要对很多具有大词汇量的矢量执行此操作,那么有一些算法可以使这种搜索比蛮力更快。它们涉及构建索引(spatial data structures),允许您检查较小子集的距离以找到获胜者(您可以自动消除一大堆单词而无需明确测量距离)。如果你愿意失去一点准确性,以便更快地找到最近的单词there are great algorithms for that as well。
要将文本文档实现到矢量转换器,首先需要检查整个语料库并记录每个唯一的单词,从而为您看到的每个单词创建一个哈希表,定义一个整数id。这是你的词汇。假设有50K字。您的每个文档都将由一个50K长的向量表示。每个向量都非常稀疏,大多数要素都会为0(大多数文档只占整个词汇的一小部分)。您将遍历每个文档并计算文档中每个单词的值(计数,频率或tf-idf),并将此值记录在与相关单词相关的列下的向量中。这是将文本转换为矢量的方法。当然,单词本身是最简单的向量:相应列中为1,其他位置为零。
与提到的stan0一样,word2vec是开源的,已经完成了所有这些,所以我试试看。 Here is a tutorial to get you started.