我正在编写一个爬虫来获取某些网站的内容,但内容可以重复,我想避免这种情况.所以我需要一个函数可以在两个文本之间返回相同的百分比来检测两个内容可能重复示例:
文字1:"我正在写一个爬虫"
文字2:"我正在写一些文字抓取工具来获取"
比较函数将文本2作为相同的文本1返回5/8%(其中5是文本的字数2相同的文本1(按字顺序比较),8是文本2的总字数).如果删除"some text",则将文本2作为相同的文本1(我需要检测情况).我该怎么做?
您正面临信息检索领域中已知为近重复检测的问题.
其中一个已知的解决方案是使用Jaccard-Similarity来获得两个文档之间的差异.
Jaccard相似性基本上是 - 从每个文档中获取单词集,让这些集合s1
和s2
- 以及jaccard相似性|s1 [intersection] s2|/|s1 [union] s2|
.
通常在面临重复时 - 但是单词的顺序有一些重要性.为了对付它-生成集时s1
和s2
-你真正产生套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专家)意见的更糟糕的解决方案.
这个过程可以很好地扩展,以便非常有效地处理大型集合,而无需检查所有对并创建大量集合.更多细节可以在这些讲义中找到(我几个月前根据作者的笔记给出了这个讲座).