Ruby:如何测试两个文本块之间的相似性?
所以,让我说我有这些文字:
文本1:
文本2:
文字3
现在,Text1的结尾和text2的开头重叠,所以我们说文本块不是唯一的.类似地,使用Text3,Text1可以在里面找到(以及Text2),所以由于重叠,这也不是唯一的. 所以,我的问题: 如何编写可以查看连续字母或单词并确定唯一性的内容?理想情况下,我希望这样的方法返回一些值,表示相似度 – 可能是两个文本块大小的平均值匹配的单词数.当它返回0时,测试的两个文本应该是完全唯一的. 在使用Ruby的字符串方法时,我遇到了一些问题. 首先,我开始尝试找到两个字符串的交集. >> a = "nt version,there are no ch" >> b = "he current versi" >> (a.chars.to_a & b.chars.to_a).join => "nt versihc" 上述方法的问题在于它只是在结果的末尾添加了共同的字母(我们失去了字符的顺序),这将使得难以测试唯一性.但我不认为交叉是开始这种相似性比较的最佳方式.在被比较的两个文本中可以存在任意数量的单词组合.所以也许如果我创建了一系列连续的相似性……但是这需要我们在尝试短语长度时遍历其中一个文本. 我想我真的只是不知道从哪里开始,并且以一种有效而不是O(n ^ too_high)的方式. 解决方法
我相信你正在寻找的是
Longest Common Substring problem,即给定两个字符串,找到它们共有的最长子串的问题.该链接指向维基百科页面,该页面将帮助您了解域并包含在O(nm)时间内运行的算法的伪代码示例.
此外,Wikibooks的算法实现书有an implementation in Ruby.它包含一个lcs_size方法,可能就是你所需要的.简而言之,如果lcs_size(text1,text2)返回4,这意味着text1和text2只有很少的连续文本,可能只是一个单词,但如果它返回,比如40,它们可能有一个共同的整个句子. 希望有用! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |