百分比相似性分析(Java)
我有以下情况:
字符串a =“网络爬虫是一种自动浏览万维网互联网的计算机程序”; 字符串b =“Web Crawler计算机程序浏览万维网”;
是否有任何想法或标准算法来计算相似性的百分比?
例如,在上述情况下,通过手动查看估计的相似度应为90%++。
我的想法是对两个字符串进行标记,并比较匹配的标记数量。 类似的东西(7个令牌/ 1个令牌)* 100.但是,当然,这种方法根本没有效果。 比较匹配的字符数也似乎无效….
任何人都可以给一些指导???
以上是我的项目Plagiarism Analyzer的一部分。
因此,匹配的单词将完全相同而没有任何同义词。
在这种情况下唯一的问题是如何计算相当准确的相似性百分比。
非常感谢任何帮助。
康拉德指出,你的问题很大程度上取决于你所说的“相似”。 一般来说,我会说以下指南应该是有用的:
- 通过将单词缩小为基本forms并将其小写来标准化输入
- 使用单词频率列表(可在网络上轻松获得)并使单词的“相似性相关性”与其在频率列表上的位置成反比
- 计算总句子相似度,作为两个句子中出现的词的总体相似度除以句子的总相似性相关性
您可以改进技术,以包括单词forms,句子单词顺序,synonim列表等之间的差异。虽然你永远不会得到完美的结果,你有很多调整的可能性,我相信,一般来说,你可能会得到非常有价值的相似度量。
这取决于你的相似性。 在forms上,您需要定义您认为“类似”字符串的度量标准,以便将统计信息应用于它们。 通常,这是通过假设的问题来完成的:“第一个字符串是第一个字符串的修改版本的可能性有多大,其中引入了错误(例如通过键入错误)?”
对于这种相似性(或者更确切地说,反向)的一种非常简单但有效的度量是两个字符串的编辑距离 ,其可以使用动态编程来计算,其通常需要时间O ( nm ),其中n和m是长度。字符串。
根据您的使用情况,可能需要更精细的措施(或完全不相关的措施,例如soundex指标 )。
在您的情况下,如果您直接应用令牌匹配(即仅仅字数),您将永远不会获得> 90%的相似性。 要以有意义的方式获得如此高的相似性,需要进行高级语义分析。 如果你完成了这个,请发表论文,因为这是一个很大程度上未解决的问题。
我是康拉德鲁道夫已经说过的第二个。
其他人可能推荐不同的距离指标 我将要说的是伴随着这些,但更多地关注匹配语义的问题。
鉴于您似乎在寻找什么,我建议您应用一些标准的文本处理方法。 所有这些都有潜在的垮台,所以我按照申请和难以做好的顺序列出它们
- 句子分裂。 找出你的比较单位。
- 停止词删除:取出a,an,the,of等。
- 词袋百分比:总词匹配的百分比,与订购无关
- (更具侵略性)您可以尝试同义词扩展,它将同义词计为匹配的单词。
这个问题的问题是:相似性可能是人性化相似性(如你所说“+ – 90%相似性”)或统计相似性(Kondrad Rudolph的答案)。
人类相似性永远不能轻易计算出来:例如这三个词
cellphone car message mobile automobile post
统计相似性非常低,而实际上它非常相似。 因此:解决这个问题很困难,我能指出的唯一想法是贝叶斯过滤或贝叶斯网络的人工智能。
一个常见的衡量标准是Levenshtein距离,这是字符串编辑距离的一个特例。 它也包含在apache字符串util库中
最长公共子序列是众所周知的字符串不相似度量,其在动态编程中实现