前言
项目中有一个查重的需求,就类似论文查重这种的需求,我的组长已经写好了这个Demo了,我也挺感兴趣的,所以也看了看是如何实现的,看完后,感慨一声,噢!原来是这样实现的啊!现在呢,就记录下我从中学到的知识!
需求
输入:需要查重的内容,通常是非常长的文本,对于论文来说,可能上万字。
输出:显示重复的句子,将重复句子标红,以及整体内容的重复率。
标红是次要矛盾,查重是主要矛盾,需要先解决。
发挥想象
我们想象一下,纯人工查重的办法。工作人员拿到一篇论文,阅读这篇论文(假设该工作人员的大脑是超强大脑,工作人员对论文库中的论文非常熟悉,基本能倒背如流的程度),每阅读一句就与大脑中的论文进行对比,如果发现重复的内容太多了(即重复的句子很多),那么计算下重复的内容大概占全文的多少,进而得出整篇论文的重复率。
很明显,人工查重,效率肯定是不高的。
如何通过代码实现?
已有资源:
一篇待查重的论文,假设论文内容两万字。
论文数据库中大量的论文数据,假设数据库中的每篇论文的内容也两万字左右。
思路:将输入的论文内容与论文数据库中存在的论文内容进行一一对比。
思考:
如何对比?是一句一句进行对比,还是一段一段的进行对比?
对比的时候,如何才能说明对比的内容是重复的?也就是说判断重复的标准是什么?
接触新领域:
自然语言处理(NLP),自然语言处理任务中,我们经常需要判断两篇文档是否相似、计算两篇文档的相似程度。
文本相似度算法
对于如何说明对比的内容是重复的,那么这里就涉及到文本相似度算法了。通过查找资料,我了解到文本相似度算法有挺多的。
掘金-如何计算两个字符串之间的文本相似度?
掘金-文本相似度计算之余弦定理下面我列举了几种:
Jaccard相似度算法
SorensenDice相似度系数
Levenshtein
汉明距离(海明距离)(HammingDistance)
余弦相似性
对于这些文本相似度的算法,主要就是对文本进行分词,然后再对分好的词进行相关的计算,得出两个文本的相似度。
所以,对于两个文本,计算相似度的思路是:分词-通过某种算法计算得到相似度
断句
当然,这些算法,都是两个文本进行的,这两个文本可以是句子,也可以是段落,还可以是超长文本。假设我们直接是超长文本,直接使用相似度算法去匹配相似度,那么可能会误判,毕竟超长文本,分词出来的词语,相同的数量肯定是很多的,所以重复性也就会越高。
所以,首先要解决的问题就是,对于超长的文本,我们该如何进行中文断句?
经过了解,得知BreakIterator这个类可以完成这件事。
BreakIterator: