百分比相似性分析(Java)

时间:2010-03-06 15:59:00

标签: java similarity

我有以下情况:

字符串a =“网络爬虫是一种自动浏览万维网互联网的计算机程序”; 字符串b =“Web Crawler计算机程序浏览万维网”;

是否有任何想法或标准算法来计算相似性的百分比?

例如,在上述情况下,通过手动观察估计的相似度应为90%++。

我的想法是将两个字符串标记化并比较匹配的标记数。就像是 (7个令牌/ 1个令牌)* 100.但是,当然,这种方法根本没有效果。比较匹配的字符数也似乎无效....

任何人都可以提供一些指导吗???

以上是我的项目Plagiarism Analyzer的一部分。

因此,匹配的单词将完全相同,没有任何同义词。

在这种情况下,唯一的问题是如何计算相当准确的相似度百分比。

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:5)

康拉德指出,你的问题在很大程度上取决于你所说的“相似”。 一般来说,我会说以下指南应该是有用的:

  • 通过将单词缩小为基本形式并将其缩小来标准化输入
  • 使用单词频率列表(可在网上轻松获取)并使单词的“相似性相关性”与频率列表中的位置成反比
  • 计算总句子相似度,作为两个句子中出现的词语的总体相似度除以句子的总相似度相关性

你可以改进技巧,包括单词形式,句子单词顺​​序,synonim列表等之间的差异。虽然你永远不会得到完美的结果,你有很多调整的可能性,我相信一般来说你可能会得到很有价值的相似度量。

答案 1 :(得分:4)

这取决于你的相似性。在形式上,您需要定义您认为“类似”字符串的度量标准,以便将统计信息应用于它们。通常,这是通过假设性问题来完成的:“第一个字符串是第一个字符串的修改版本的可能性有多大,其中引入了错误(例如通过键入错误)?”

这种相似性(或者更确切地说,反向)的一个非常简单但有效的度量是两个字符串的edit distance,可以使用动态编程计算,这需要时间 O (<通常,em> nm ),其中 n m 是字符串的长度。

根据您的使用情况,可能需要更详细的措施(或完全不相关的措施,例如soundex metric)措施。

在您的情况下,如果您直接应用令牌匹配(即单词计数),您永远不会获得&gt;相似度为90%。要以有意义的方式获得如此高的相似性,需要进行高级语义分析。如果你完成了这个,请发表论文,因为这是一个很大程度上未解决的问题。

答案 2 :(得分:2)

我是康拉德鲁道夫已经说过的第二个。

其他人可能会推荐不同的距离指标。我要说的是伴随着这些,但更多地关注匹配语义的问题。

鉴于您的目标,我建议您应用一些标准的文本处理方法。所有这些都有潜在的垮台,所以我按照申请和难以做好的顺序列出它们

  1. 句子分裂。找出你的比较单位。
  2. 停止删除词:取出a,an,the,of等。
  3. 词袋百分比:总词匹配的百分比,与订购无关
  4. (更具侵略性)你可以尝试同义词扩展,它将同义词计算为匹配的单词。

答案 3 :(得分:1)

这个问题的问题是:相似性可能是人性化的相似性(正如你所说的“+ - 90%相似性”)或统计相似性(Kondrad Rudolph的回答)。

人类相似性永远不能轻易计算出来:例如这三个词

cellphone car message

mobile automobile post

统计相似性非常低,而实际上它非常相似。因此:解决这个问题很困难,我能指出的唯一想法是Bayesian filtering或人工智能Bayesian networks

答案 4 :(得分:1)

一个常见的衡量标准是Levenshtein距离,这是字符串编辑距离的一个特例。它也包含在apache string util

答案 5 :(得分:0)

Longest Common Sub-sequence是众所周知的字符串不相似度量,在动态编程中实现