我正在尝试构建一个词袋类,它可以创建词汇表,并在词汇表中为给定的向量找到最接近的词。例如,我加载一个浮点向量或矩阵,并希望找到最接近的词。
在OpenCV中,我只找到了BOWImgDescriptorExtractor,但这仅适用于图像。
有人能向我解释如何在我的词汇表中为给定的向量找到最接近的词吗?我读了很多关于FlannBasedMatcher和BruteforceMatcher的内容,但我不知道如何将向量转换为适合我的词汇表的格式。
感谢您的帮助
回答:
您想将文本文档转换为向量,其中每个特征对应一个词(或一个n-gram,即一系列n个词),每个特征的值可以是该词在文档中的计数,或其频率,或者更好的,是它的tf-idf值。
一旦您有了将文档转换为向量的方法,您就可以测量任意两个向量之间的距离。这两个向量代表两个不同的文档。在您的案例中,一个向量将代表一个单词的文档,另一个将是您感兴趣的文本文档。为了避免文档长度在距离测量中起作用,余弦距离在文本分析中被广泛使用,而不是欧几里得距离。
要找到给定向量最接近的词,您可以基本进行暴力搜索,通过计算每个词的向量与查询向量之间的余弦距离。给出最小距离的词就是赢家。
如果您需要对大量向量和大词汇表执行此操作,有算法可以使此搜索比暴力搜索快得多。它们涉及构建索引(空间 数据 结构),允许您检查较小子集的距离以找到赢家(您可以自动消除大量词,而无需明确测量距离)。如果您愿意为了更快地找到最接近的词而牺牲一些准确性,也有很棒的算法可以做到这一点。
要实现文本文档到向量的转换器,首先您需要遍历整个语料库并记录每个独特的词,创建一个哈希表,为您看到的每个词定义一个整数ID。这就是您的词汇表。假设有5万个词。每个文档将由一个5万长的向量表示。每个向量将非常稀疏,大多数特征将为0(大多数文档只会包含您整个词汇表的一小部分)。您将遍历每个文档并计算文档中每个词的值(可以是计数、频率或tf-idf),并在与该词相关的列下记录此值在向量中。这就是您将文本转换为向量的方式。当然,一个词本身是最简单的向量:在相应的列中为1,其余地方为0。
正如stan0提到的,word2vec是开源的,并且已经完成了所有这些工作,所以我建议您尝试一下。这里有一个入门教程。