我可以使用什么算法来确定两个文档中是否出现任何n个单词序列?

时间:2010-11-25 14:46:53

标签: string language-agnostic comparison sequence

给出两份文件:

  

现在是我们不满的冬天   在约克的这个阳光下度过了美好的夏天;   还有我们家里所有的云彩   在深海怀抱的海洋中。   现在我们的眉毛上有胜利的花圈;   我们伤痕累累的双臂挂在纪念碑上;   我们严厉的警惕变成了欢乐的会议,   我们可怕的举措令人愉快。

(理查德三世)

  理查德(约克公爵):[把他的高脚杯敲在桌子上三次]沉默!                            安静!对于国王!

     国王(理查德三世):[站立,弯腰,说话笨拙]                        现在是我们甜蜜内容的夏天,                        [制造?] [错误?] - 这些都铎式云层施放过冬天。

(BlackAdder,第1季,第1集)

可以使用哪种算法来找出两个文档中存在哪些3字序列?如果有,当然 - 它不能保证。

在此示例中,“现在是”是两个文档中唯一出现的3个字序列。

2 个答案:

答案 0 :(得分:2)

听起来你正在寻找长度为3的常见子串,除了“字符串”由你的“字符串”组成,实际上是单词,而不是单个字符。因此,“我有一个狡猾的计划”是一个长度为5的字符串。

此时通常会提到后缀树:http://en.wikipedia.org/wiki/Generalised_suffix_tree,但是否需要它取决于文本的长度。从每对字边界开始比较几个嵌套循环(每个字符串一个)将最终完成工作。

答案 1 :(得分:2)

没有蛮力,最简单的解决方案是制作一个哈希映射,其中包含一个文本的每个单词元组的条目,然后检查另一个文本中的每个元组是否存在于哈希映射中。在给定恒定窗口(3个字)的情况下,这将是线性的,但我们可以在线性时间内完成此操作,而与窗口大小无关。

为了有效地执行此操作,我们使用rolling hash。滚动哈希的输入字符将是单词的哈希值。这种技术称为Rabin-Karp algorithm