如何检测文本文档中的重复项并返回重复项的相似性?

时间:2014-04-14 06:50:24

标签: algorithm information-retrieval text-analysis

我正在编写一个抓取工具来从某个网站获取内容,但内容可以重复,我想要 避免这种情况。所以我需要一个函数可以在两个文本之间返回相同的百分比来检测两个内容可能重复示例:

  • 文字1:"我正在将抓取工具写入"
  • 文字2:"我正在写一些文字抓取工具来获取"

比较函数将文本2作为相同的文本1返回5/8%(其中5是文本的字数2相同的文本1(按字顺序比较),8是文本2的总字数)。如果删除"某些文字"然后将文本2作为相同的文本1(我需要检测情况)。我该怎么做?

3 个答案:

答案 0 :(得分:8)

您遇到的问题已在Information Retrieval字段中称为近似重复检测

其中一个已知的解决方案是使用 Jaccard-Similarity 来获取两个文档之间的差异。

Jaccard基本相似 - 从每个文档中获取单词集,让这些集合为s1s2 - 并且jaccard相似度为|s1 [intersection] s2|/|s1 [union] s2|

通常在面临重复时 - 但是单词的顺序有一些重要性。为了处理它 - 在生成集s1s2时 - 你实际上生成了k-shinglings集合,而不是单词集合。
在您的示例中,使用k=2,集合将为:

s1 = { I'm write, write a, a crawler, crawler to }
s2 = { I'm write, write a, a some, some text, text crawler, crawler to, to get }
s1 [union] s2 = { I'm write, write a, a crawler, crawler to, a some, some text, text crawler, to get } 
s1 [intersection] s2 = { I'm write, write a, crawler to }

在上文中,jaccard相似性将为3/8。如果你使用相同方法的单个单词,(k = 1个shinglings)你将得到你想要的5/8 - 但这是我(以及大多数IR专家)意见中更糟糕的解决方案。

这个过程可以很好地扩展,以便非常有效地处理大型集合,而无需检查所有对并创建大量集合。更多细节可以在these lecture notes中找到(我几个月前根据作者的笔记给出了这个讲座)。

答案 1 :(得分:2)

比较两个文本的好算法是tf-idf。它将给出两个文件之间的相似性。

1. calculate tf-idf for the document
2. calculate cosine similarity for two given text
3. the cosine similarity will indicate match between two documents.

This是一个非常好的教程,用于计算Java中的tf-idf和余弦相似度。将它扩展到C#会很简单。

答案 2 :(得分:0)

在生物信息学中,有一种算法可以完成这项工作。它被称为Needleman-Wunsch,通常用于与核苷酸序列进行全局序列比对。

使用此算法,您可以轻松计算两个字符串之间的一致性。您可以使用my code。但是这种方法只返回你自己计算一致性的对齐方式。