【问题标题】:Bag of Words without images没有图像的词袋
【发布时间】:2015-09-08 21:10:29
【问题描述】:

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

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

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

感谢您的帮助

【问题讨论】:

  • 你的第一段听起来很接近 word2vec 已经做的。你可能想看看
  • 如果你有你的词汇,我会使用euclidean distance 来计算距离和蛮力(检查所有单词的距离并选择最接近的一个)。
  • 为了更好的定义问题,还需要多说一下词和向量的关系。向量代表什么?是手写文字的图像吗?

标签: c++ opencv image-processing machine-learning


【解决方案1】:

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

一旦您有办法将文档转换为向量,就可以测量任意两个向量之间的距离。这两个向量代表两个不同的文档。在您的情况下,一个向量将表示一个包含单个单词的文档,另一个将是您感兴趣的文本文档。为了避免文档长度在距离测量中起作用,使用cosine distance很多是文本分析,而不是euclidean distance

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

如果您需要对大量词汇量很大的向量执行此操作,则有一些算法可以使此搜索比蛮力搜索快得多。它们涉及构建索引(spatialdatastructures),允许您检查较小子集的距离以找到获胜者(您可以自动消除一大堆单词而无需明确测量距离)。如果您愿意牺牲一点准确性来更快地找到最近的单词,there are great algorithms for that as well

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

就像提到的 stan0 一样,word2vec 是开源的,并且已经完成了所有这些,所以我会试一试。 Here is a tutorial to get you started.

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 2013-04-23
    • 2021-08-25
    • 1970-01-01
    • 2023-04-06
    • 2018-07-26
    • 2012-06-27
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多