2010-03-06 165 views
4

我有以下情况:百分比相似度分析(Java)

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

有什么想法或标准算法来计算相似度的百分比是多少?

例如,上述情况下,通过手动估计的相似性寻找应为90%++。

我的想法是来标记字符串和比较匹配的令牌的数量。类似于 (7令牌/ 1令牌)* 100.但是,当然,这种方法根本无效。比较字符数匹配似乎也没有效....

谁能给一些指导方针???

以上是我的项目剽窃分析仪的一部分。

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

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

非常感谢您的帮助。

回答

5

Konrad指出,你的问题在很大程度上取决于你的意思是“相似”。 在一般情况下,我会说以下指导原则应该是有用的:

  • 通过减少一个字可将其归一化输入的基本形式和小写它
  • (在网络上获得的容易)用字频度表并使字的“相似性相关性”反比于它的频率列表上的位置
  • 计算总句子相似度为出现在两个句子由句子总相似的相关性划分的话聚集相似

您可以对技巧进行改进,以包括词形,句子顺序,synonim列表等之间的差异。虽然您永远不会获得完美的结果,但您有很多调整的可能性,并且我相信一般情况下您可能会收到相当有价值的措施的相似性。

+1

是的,包括反频率加权是一个好方法。停止词去除可能是对此的一阶近似。 – 2010-03-06 17:10:35

+0

谢谢Tomislav〜!我会采取这些建议.... – 2010-03-06 17:15:26

4

这取决于你的相似性的想法。在形式上,你需要定义一个你认为是“相似”字符串的度量标准,以便将统计信息应用于它们。 “可能性有多大第一串是第一串的修改版本,其中的错误(例如,通过键入它)介绍?”

一个非常简单而有效的措施为:通常情况下,这是通过假设性的问题做这种相似性(或更确切地说,逆)是两个串可以使用动态编程来计算的edit distance,这需要时间ø纳米)在一般情况下,其中ñ是的长度字符串。

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

对于您的情况,如果您直接应用令牌匹配(即单纯的字数统计),您将会从永不获得> 90%的相似度。要以有意义的方式获得如此高的相似性,需要先进的语义分析。如果你完成这项工作,请发表论文,因为这是一个尚未解决的问题。

+0

其实我问现在是我抄袭分析仪项目的一部分的问题... 我已经成功地执行,其中一个句子送去分析相似性分析..... 例如,在10个字,7词被发现匹配... 因此,这最后的结果将百分比相似性,这是我的脖子疼痛。 你可以关于O(* nm *)的例子吗? – 2010-03-06 16:12:49

+0

在我的情况下,拼写等肯定没有错误。 无论如何,我会尽量写出一个尽可能准确的计算百分比...... 感谢您的信息.. – 2010-03-06 16:14:14

+0

@Mr CooL:您的用例可能会排除编辑距离,因为它总是基于字符相似性。对于剽窃分析仪,约翰的答案可能是最好的,易于实施的解决方案。但是,我预测假阳性率非常高,因为只有很多方式可以简洁地表达技术属性。因此,在计算相似性时,我会考虑考虑词序。 – 2010-03-06 16:17:27

1

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

人类的相似性不能简单地计算:比如这三个字

cellphone car message 

mobile automobile post 

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

2

我第二个是Konrad Rudolf已经说过的。

其他人可能会推荐不同的距离度量标准。我要说的是伴随这些,但更多地看待匹配语义的问题。

鉴于您似乎在寻找什么,我建议您应用一些标准的文本处理方法。所有这些具有潜在的挫折,所以我列出了他们的应用程序和难度为了做好

  1. 句子拆分。找出你的比较单位。
  2. 停止词删除:拿出一,一个字百分比的等
  3. 袋:有多大比例的整体匹配的话,自主订货
  4. 的(更加积极),你可以尝试同义词扩展,将同义词作为匹配词进行计数。
+0

非常感谢John。 我想过你提到的那些人。 我可以问你的意见,我有这个想法: 1)计算每个字符串的记号(词),并进行比较。 2)I意识到如果该差在1至10个,百分比的几率为约70°〜90° 我用普通简单的if else以确定的百分比。因为这里提出的问题只是我项目的一部分,所以我的项目有点耗时。 – 2010-03-06 16:29:55

+0

如果你真的没有时间了,我的建议是1.删除停用词2.通过编辑dist计算包含词的百分比和依赖于词的顺序(做任何一种看起来最容易实现的方法) 3.创建百分比阈值(与简单的if-else一样)4.比较实际的文本文本与非文本文本并手动修复百分比(如果您有大量样本,首先对文档的子集进行调整,然后使用休息一下,看看它是如何工作的)。我的建议是尽可能快地迭代到最后,然后找出如何更复杂,因为你有时间 – 2010-03-06 16:47:42

+0

好的。感谢您的建议和想法。 ;) – 2010-03-06 17:14:57