首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测文本文档之间的重复,并返回副本的相似度?

如何检测文本文档之间的重复,并返回副本的相似度?
EN

Stack Overflow用户
提问于 2014-04-14 06:50:24
回答 3查看 3K关注 0票数 5

我正在写一个爬虫从一些网站获取内容,但内容可以重复,我想避免这种情况。因此,我需要一个函数可以在两个文本之间返回相同的百分比来检测两个内容--可能是重复的示例:

  • 课文1:“我在写爬虫给”
  • 课文2:“我正在写一个文本爬行器来获取”

比较函数将文本2作为同一文本返回1乘5/8%(5为文本的字数2相同的文本1(按词序比较),8为文本2的总单词2)。如果删除“一些文本”,那么文本2与相同的文本1(我需要检测情况).How我可以这样做吗?

EN

回答 3

Stack Overflow用户

发布于 2014-04-14 06:58:50

您正面临一个在信息检索领域称为近重复检测的问题。

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

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

通常,当面对接近重复时--然而,单词的顺序有一定的重要性。为了处理这个问题--在生成集合s1s2时--您实际上生成了k-shingling集合,而不是只生成了一组单词。

在您的示例中,对于k=2,这些集合将是:

代码语言:javascript
复制
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专家)的意见中,这是更糟糕的解决方案。

这一过程可以很好地缩放,以非常有效地处理庞大的集合,而无需检查所有对和创建大量的集合。更多的细节可以在这些讲稿上找到(几个月前,我根据作者的笔记做了这个讲座)。

票数 9
EN

Stack Overflow用户

发布于 2014-04-14 07:20:12

比较两个文本的一个很好的算法是tf。这将使两个文件之间产生相似之处。

代码语言:javascript
复制
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#很简单。

票数 2
EN

Stack Overflow用户

发布于 2014-04-14 07:15:10

在生物信息学中,有一种算法应该完成这项工作。它被称为尼德曼-温施,通常用于与核酸序列的全局序列比对。

使用此算法,您可以很容易地计算出两个字符串之间的关系。您可以使用我的代码。但是这个方法只返回你需要自己计算的对齐。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23053688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档