我正在写一个爬虫从一些网站获取内容,但内容可以重复,我想避免这种情况。因此,我需要一个函数可以在两个文本之间返回相同的百分比来检测两个内容--可能是重复的示例:
比较函数将文本2作为同一文本返回1乘5/8%(5为文本的字数2相同的文本1(按词序比较),8为文本2的总单词2)。如果删除“一些文本”,那么文本2与相同的文本1(我需要检测情况).How我可以这样做吗?
发布于 2014-04-14 06:58:50
您正面临一个在信息检索领域称为近重复检测的问题。
其中一个已知的解决方案是使用Jaccard-相似获取两个文档之间的差异。
Jaccard相似性基本上是-从每个文档中获取单词集,让这些集合是s1和s2 -而jaccard相似性是|s1 [intersection] s2|/|s1 [union] s2|。
通常,当面对接近重复时--然而,单词的顺序有一定的重要性。为了处理这个问题--在生成集合s1和s2时--您实际上生成了k-shingling集合,而不是只生成了一组单词。
在您的示例中,对于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专家)的意见中,这是更糟糕的解决方案。
这一过程可以很好地缩放,以非常有效地处理庞大的集合,而无需检查所有对和创建大量的集合。更多的细节可以在这些讲稿上找到(几个月前,我根据作者的笔记做了这个讲座)。
发布于 2014-04-14 07:20:12
比较两个文本的一个很好的算法是tf。这将使两个文件之间产生相似之处。
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.这是一个非常好的教程,用于计算tf和Java中的余弦相似度.将其扩展到C#很简单。
https://stackoverflow.com/questions/23053688
复制相似问题