0

我已经在Calculating Word Proximity in an inverted 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结果列表,直接尝试计算Java HisList,Island HitList和Language Hitlist之间的距离。

现在第一个问题是句子中有4个java令牌出现。我选择哪一个。假设我选择了第一个。

我进入岛标记列表,并在比较后发现它与第二次出现的java相邻。所以我改变我的选择并锁定到第二次出现的Java。

继续使用第三种标记语言,我发现它位于距离我们的选择很远的地方,但是我发现它距离第一个Java事件很近。

所以你看到这里的困境,如果现在再次恢复到原来的选择,即Java的第一次出现的距离第二个令牌“岛”增加,如果我留在我目前的选择第二次出现的绝对距离令牌“语言”会使相关性破坏。

以前有点产品的建议,但我对如何继续前进该选项的损失。

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

我明白这个问题很详细。不过,我已经搜索了很长时间,并且没有在这个主题上发现任何类似的问题。

我觉得如果这个问题得到解答,它将成为社区的一个很好的补充,并且会让任何设计任何与相关性相关的东西都相当开心。

谢谢。

回答

0

你似乎正在使用命中列表有点不同,然后他们打算如何使用(至少给我的理解)。

通常人们比较不同文档返回的匹配列表。这就是他们如何将一个文档排序为“比其他文档更”相关“。这就是说,如果你想找到所有的位置的单词“java”和“岛”的多个单词短语,如“java岛”的所有位置,你会......

  • 找对的“java”
  • 位置的列表,同时获得一个位置列表的“孤岛”
  • 排序两个列表,通过这两个列表
  • 迭代。你开始获得这两个列表的第一个条目。现在测试这一对条目。 I.E.,如果这些条目是“一个”,你已经找到了一个“java island”(或者“island java”)实例。获取当前显示最小值的列表中的下一个条目。测试这对新的条目。重复。

顺便说一句 - 比较2种不同文档时,点积更有用。

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和岛屿可以说有16的相互得分。对于更高的门槛,您可以进一步拉伸金字塔,或者使用形状来玩。

现在,在这里您添加另一个建议,这种方法不是非常适合,你也想捕捉最接近的确切位置,这是不是很好定义恕我直言,如果word1匹配word2(在某些level)在position1中,但word2匹配位于同一级别的word3 - 你想要什么位置?

另外,请注意,此方法是O(*长度text_length话^ 2),这可能是在某些情况下很好的,但对其他人来说很糟糕(如果你正在寻找如天书)