我已经在倒排索引中计算单词邻近性中提出了类似的问题。但是我觉得这个问题太笼统了,不够精致。所以在这里。
我有一个列表,其中包含文档中令牌的位置。 对于每个令牌,它都作为
public List<int> hitLocation;
假设文档是
Java programming language has a name similar to java island in Indonesia however
local language in java bears no resemblance to the programming language called java.
查询是
java island language
所以假设我锁定了Java HitList,并尝试直接计算Java HisList,Island HitList和Language Hitlist之间的距离。
现在第一个问题是句子中有 4 个 java 标记出现。我选择哪一个。假设我选择第一个。
我进入岛屿令牌列表,比较后发现它与java的第二次出现相邻。所以我改变了我的选择并锁定了第二次出现的 java。
继续使用第三种令牌语言,我发现它与我们的选择相距甚远,但我发现它非常接近第一次出现 java。
所以你会看到这里的困境,如果现在再次恢复到原始选择,即第一次出现 java,到第二个令牌"岛"的距离增加,如果我坚持我当前的选择,第二次出现的绝对距离令牌"语言"将使相关性被破坏。
以前有点积的建议,但是我不知道如何继续使用该选项。
任何其他解决办法也将受到欢迎。
我知道这个问题很详细。但是,我已经搜索了很长时间,并且没有找到有关此主题的任何问题。
我觉得如果这个问题得到回答,它将是对社区的一个很好的补充,并且会让任何正在设计与相关性相关的东西的人都非常高兴。
谢谢。
您使用命中列表的方式似乎与它们的使用方式略有不同(至少根据我的理解(。
通常,人们会比较不同文档返回的命中列表。 这就是他们将一个文档评为比另一个文档"更相关"的方式。
也就是说,如果您想找到一些多词短语(如"爪哇岛"(的所有位置,给定"java"和"岛"的位置,您将......
- 获取"java"的位置列表
- 获取"岛屿"的位置列表
- 对两个列表进行排序
- 同时循环访问这两个列表。 您开始获得两个列表的第一个条目。 现在测试这对条目。 也就是说,如果这些条目"偏离一个",你就找到了"java岛"(或者可能是"岛爪哇"(的一个实例。 获取列表中当前显示最小值的下一个条目。 测试这对新条目。 重复。
顺便说一句 -- 点积在比较 2 个不同的文档时更有用。
好吧,既然你明确询问了点积建议,我将尝试更正式地解释我的想法。请记住,它不是很有效,因为它可能会将基于命中列表长度的复杂性转换为基于文本长度的东西(除非有一些技巧可以削减它(。
我最初的想法是将每个命中列表转换为文本长度的一系列二进制值,在有命中的地方高,否则低。
例如.java会看起来
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
但是由于您想要接近,请将每个事件转换为金字塔,例如 -
3 2 1 0 0 0 1 2 3 2 1 0 0 0 1 2 3 2 0 0 0 0 0 1 2 3
岛屿也一样——
0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
现在,点积会给你两个向量之间的某种邻近"分数",因为它会累积两个单词接近的所有位置(越近越好(。爪哇岛和岛屿可以说是16分。对于更高的阈值,您可以进一步拉伸金字塔,或者玩转形状。
现在,在这里您添加了另一个建议,即此方法不太适合,您还想捕获最接近的确切位置,恕我直言,这不是很好定义,如果 word1 与位置 2 中的 word2(在某种程度上(匹配,但 word2 在位置 3 中与 word2 匹配同一级别 - 你想要什么位置?
另外,请记住,这种方法是 O(text_length * words^2(,在某些情况下可能是好的,但对其他人来说非常糟糕(例如,如果您正在搜索圣经(。