我可以使用什么算法来检测文章或帖子是否重复?


17

我正在尝试检测文章或论坛帖子是否是数据库中的重复条目。我已经考虑了一下,得出的结论是,重复内容的人将使用以下三种方法之一(以下降的方式很难检测):

  1. 简单复制粘贴整个文本
  2. 复制和粘贴与自己合并的部分文本
  3. 从外部站点复制文章并假扮自己

准备分析文本

基本上任何异常;目的是使文本尽可能“纯净”。为了获得更准确的结果,通过以下方式对文本进行“标准化”:

  1. 去除重复的空白并修剪前导和尾随。
  2. 换行符被标准化为\ n。
  3. HTML标签被删除。
  4. 使用称为Reging Fireball的RegEx,URL被剥离。
  5. 我在应用程序中使用BB代码,然后转到。
  6. (ä)有香味的和外来的(英式除外)均转换为非外来形式。

我将有关每篇文章的信息存储在(1)统计信息表和(2)关键字表中。

(1)统计信息表 以下是关于文本内容的统计信息(非常类似于此帖子)

  1. 文字长度
  2. 信数
  3. 字数
  4. 句子数
  5. 每句话平均字数
  6. 自动可读性指数
  7. 枪杀雾分数

对于欧洲语言,应使用Coleman-Liau和自动可读索引,因为它们不使用音节计数,因此应产生合理准确的分数。

(2)关键词表

通过排除大量停用词(常用词)(例如“ the”,“ a”,“ of”,“ to”等)来生成关键字。

样本数据

  • text_length,3963年
  • letter_count,3052
  • word_count,684
  • 句子数,33
  • word_per_sentence,21岁
  • gunning_fog,11.5
  • auto_read_index,9.9
  • 关键字1,已杀死
  • 关键字2,人员
  • 关键字3,警察

应该注意的是,文章更新后,以上所有统计信息都将重新生成,并且可能是完全不同的值。

如何使用以上信息来检测数据库中是否已存在首次发布的文章?


我知道我要设计的任何东西都不是完美的,最大的风险是(1)不是重复的内容将被标记为重复(2)系统允许重复的内容通过。

因此,算法应从0(无重复),5(可能为重复)和10(重复)生成风险评估编号。高于5的内容很可能重复。在这种情况下,内容可能会被标记并链接到文章(可能是重复项),并且人员可以决定是删除还是允许。

正如我在存储整篇文章的关键字之前所说的那样,但是我想知道是否可以在段落基础上进行相同的操作。这也意味着进一步在数据库中分离我的数据,但这也将使在我的初始帖子中检测(2)更容易。

我正在考虑统计数据之间的加权平均值,但顺序如何,其结果是什么...


如果完全匹配,则只需将字段设置为唯一。如果不是,则需要确定什么时候可以将文本视为副本或紧密衍生的作品。
James P.

2
这种分析可以有很多方向。人们围绕这种主题写整本书。如果您的目标是确定“相对紧密度”,那么您实际上别无选择,只能深入研究所谓的“ 自然语言处理机器学习”。那就是计算机科学家所说的,但实际上只是高级统计分析。一个很好的起点可能是看levenshtein距离,但是像单词/句子计数这样的“愚蠢”统计数据可能对您没有多大帮助。
rdlowrey,2012年

1
另外,在从SO迁移之前,它被标记为[php],因此您可以查看php的本地levenshtein函数
rdlowrey 2012年

进行人工检查的好主意可能重复!您可能能够自动确定> 7是重复项,而<6是不同项,并且人工检查的分数只有6或7。我知道,使用垃圾邮件识别功能可以识别并不需要机器。不知道任何一个类别;在几乎重复的作品和原始作品之间的灰色区域,您可能会做的最好的事情就是做出一个任意判断。
GlenPeterson,2012年

@rdlowrey-Levenshtein算法是我在C#中进行的类似项目中使用的算法。我同意,这是一个很好的起点,可能就足够了。
jfrankcarr 2012年

Answers:


4

NLP中有许多算法可以处理文档相似性。这是一篇描述各种算法的开创性论文。此外维基百科有一个更大的集合。我赞成Jaro Winkler测度,并将其用于凝聚聚类方法中的研究生项目。


6

看看Rabin-Karp的算法。它使用滚动哈希,类似于rsync用来最小化同步期间传输的字节。通过调整用于哈希的窗口的大小,可以使它或多或少敏感。RK除其他事项外,还用于gi窃检测,它基本上是在寻找伪造品。


4
OP所描述的问题似乎完全类似于窃检测,我建议您首先寻求帮助。(只需确保标识您的来源!)
Caleb

4

这样做的第一步可能是检测句子(或其他一些合理的数据块。获取这些块并剥离任何气象数据,html随机空白,返回等)。获取结果的MD5并将其存储在表格中。您可以然后针对这些区块进行匹配以尝试找到匹配项。

如果这不起作用,您可以尝试使用n-gram。在这里,您需要为页面上的每个单词输入一个条目,但它应该能够为您提供很好的匹配。

http://en.wikipedia.org/wiki/N-gram


基于n元语法的度量比md5哈希更好,尤其是对于半结构化数据(例如html)。
Candide

1

对于精确的数学数学,我将存储一个哈希,然后进行比较。

我认为用于考试的系统会先测量单词组,然后再测量每个大小的组的频率。例如,一个被复制的30个单词的链将得分为5个风险点,而10个单词链的5次出现将得分为5分。这样一来,您每500个字就可以得到30点的阈值。

确实,您需要一种语义算法,以便将诸如“也”和“与”之类的词解析为相同的词。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.