-1

我已经在Calculating Word Proximity in an reverse Index 中提出了类似的问题。但是我觉得这个问题太笼统了,不够精致。所以这里。

我有一个列表,其中包含文档中标记的位置。对于每个令牌,它都是

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 标记。我选择哪一个。假设我选择第一个。

我进入 island 令牌列表,比较后发现它与第二次出现的 java.lang. 所以我改变了我的选择并锁定了第二次出现的java。

继续第三种标记语言,我发现它与我们的选择相距很远,但我发现它离第一个 java 出现很近。

因此,如果现在再次恢复到原始选择,即 java 的第一次出现,到第二个标记“岛”的距离增加,并且如果我保持当前选择,那么第二次出现的标记“语言”的绝对距离就会增加。 " 将使相关性破坏。

以前有过点积的建议,但是我不知道如何继续使用该选项。

任何其他解决方案也将受到欢迎。

我知道这个问题很详细。但是,我已经进行了漫长而艰苦的搜索,但在这个主题上没有发现任何这样的问题。

我觉得如果这个问题得到了回答,这将是对社区的一个很好的补充,并且会让任何设计与相关性相关的东西的人都非常高兴。

谢谢你。

4

2 回答 2

0

您似乎使用命中列表与它们的预期使用方式略有不同(至少考虑到我的理解)。

通常,人们比较不同文档返回的命中列表。这就是他们如何将一个文档列为比另一个文档“更相关”的方式。

也就是说,如果您想在给定单词“java”和“island”的位置的情况下找到某个多词短语(例如“java island”)的所有位置,您会...

  • 获取“java”的位置列表
  • 获取“岛”的位置列表
  • 对两个列表进行排序
  • 同时遍历两个列表。您开始获得两个列表的第一个条目。现在测试这对条目。IE,如果这些条目是“关闭一个”,您已经找到了一个“java island”(或者可能是“island java”)的实例。获取列表中当前显示最小值的下一个条目。测试这对新条目。重复。

顺便说一句——比较两个不同的文档时,点积更有用。

于 2013-09-26T18:00:47.227 回答
0

好吧,既然您明确询问了点积建议,我将尝试更正式地解释一下我的想法。请记住,它不是很有效,因为它可能会将复杂性从基于命中列表的长度转换为基于文本长度的东西(除非有一些技巧可以减少它)。

我最初的想法是将每个命中列表转换为文本长度的一系列二进制值,有命中的地方高,否则低。

例如 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

现在,点积会为您提供两个向量之间的某种接近度“分数”,因为它会累积两个单词接近的所有位置(越接近越好)。Java 和 island 可以说是相互得分为 16。对于更高的阈值,您可以进一步拉伸金字塔,或者玩弄形状。

现在,在这里您添加另一个建议,该方法不太适合,您还想捕捉最接近的确切位置,恕我直言,这不是很好的定义,如果 word1 在位置 1 匹配 word2(在某种程度上)怎么办,但 word2 在 position2 的同一级别匹配 word3 - 你想要什么位置?

另外,请记住,这种方法是 O(text_length * words^2),在某些情况下可能很好,但对其他人来说非常糟糕(如果你正在搜索圣经,例如)

于 2013-09-26T18:04:40.253 回答