百科词条比较(4)

4. 文本相似度

相似度的度量方法有很多,例如:余弦相似度、欧几里得距离、皮尔逊相关度、jaccard系数、曼哈顿距离……

相似度是一个数值,所以不管是什么方法,首先都要把需要比较的两个文本量化,映射为空间中的两个点。不同的相似度度量方法主要区别就在于如何对两点间的距离进行计算。

在众多方法中,我选择了余弦相似度,是因为其实现方便,性能也不错。

4.1 文本量化

如何用数值来表示文本,关系最后计算结果的准确度,因为在量化的过程中,不可避免的会丢失一些原始文本的特性,所以结果的准确性依赖于量化方法能多大程度上表征原始文本。

最简单的量化方法莫过于只统计文本的字数,这样两个文本就量化为2个数字,也就是坐标轴上的两个点,可以用它们的差值(即一维欧氏距离)作为相似度。虽然这种量化方法便捷、高效,但性能大打折扣,相信没有多少人会采用这个方法。

我采用了目前计算相似度最普遍的做法,即用词项来表征原始文本。因为词是组成文章的基本元素之一,当然字和句也是,不过它们都没有使用词的效果好。把每个词项看成一个维度,把其词频看成这个维度上的值(度量大小),这样就把文本映射成了n维向量空间中的一个点。计算两个文本相似度的问题就转化为计算两个点之间的距离。

假设两个文本总共有8个词项,经过量化后就得到8维向量空间中的两个点:

  t1 t2 t3 t4 t5 t6 t7 t8
d1(点A) 2 0 0 8 7 3 0 5
d2(点B) 0 1 2 5 13 0 4 1

 

注:前面我是用未做处理的词频tf(term frequence)来表示度量大小,你可以用该词出现与否(0或1)来表示,或是加入逆文档频率(idf)等。详情参见SMART系统记号。

4.2 计算距离

当计算两点之间距离时,最直观的方法是计算两点间直线段的长度,这是现实中普遍采用的度量距离的方法,这种方法就是欧氏距离的度量方法。既然有直观的,也就有不直观的,比如曼哈顿距离计算的是两点间折线段的长度。

由于线段长度的取值没有上界,无法归一化,比较时很不方便,所以我采用的是余弦相似度,用两个向量之间夹角的余弦值来表示相似度。由于词频都为非负数,所以余弦相似度的值域是[0,1],值越接近1,越相似。

QQ截图20110821232718

其中O是坐标原点,这样就把点A和点B转化为向量OAOB,sim(d1,d2)即为相似度。

当词项很多时,维度也很高,计算起来不是很方便。这时我们可以去掉没有代表性的词,例如:停用词、词频和字数都为1的词,来实现降低维度方便计算的目的。去除词项的功能我在上一节的分词部分实现了。

5. 结果

实现了各部分的功能后,终于做出了我人生中第一个窗体程序,当它正常运行的那一刻,内心感慨万千啊。下面就是程序界面的截图。

百科词条比较(4)_第1张图片

程序完工之后,从两种百科上随机采样了一部分词条,计算了它们的相似度,发现相似度都很高,大部分都在0.8以上。这也在意料之中,毕竟计算的是同一个词条的相似度。

此外,还计算了百度正文长度(a),互动正文长度(b),百度词项个数(c),互动词项个数(d),它们之间相同词项个数(e),发现如下规律:

1. 对于近期热门事件的词条,如药家鑫,两者相似度有高有低,a和b也相差不大,内容没有明显抄袭现象。

2. 对于互动早期就有的部分词条,如名电磁波,磁场,百度存在抄袭互动的嫌疑,表现为a>b, c>d, e的数值相差无几。人工对比内容后发现,这类词条百度成段抄袭互动,打乱排版顺序,并新增一些内容。

3. 对于举报互动抄袭百科的帖子中提到的词条,计算相似度几乎都为1.0,c,d,e的数值相差无几。如穗乌毛蕨,从创建时间上来看,是互动抄袭百度的。

我认为百度和互动都有相互抄袭的现象,为了自身发展,他们也默许了各自用户这种行为。让互动无可奈何的是,百度有更高的知名度和更多的用户,虽然互动起步较早,但是挡不住百度的后来居上。

6. 后记

这篇文章断断续续了写了1个多月,没能一鼓作气写完,写到后面都差点太监了,真是汗颜啊。看来自己还是太懒,需要再接再厉。


-------------------------------------------
作者:兔纸张   来源:博客园 ( http://www.cnblogs.com/geiliCode )

你可能感兴趣的:(比较)