April 22, 2008

Toy程序中很重要的一个功能是去重:即去掉那种转载流的文字,转载扩赛了信息但是也造成了相当麻烦的信息冗余,我不想看的信息逼着我看了一遍又一遍。
最牛逼的方法当然是能比较两个文章的全文,看全文的匹配度了,但是这个方法的时间代价太大。还有那种选取一部分Digest 出来比较的方法理论性远远大于使用性。最直接的方法就是看两个文章的标题的最长公共子串,亦即LCS( longest common substring).

LCS的原理非常的简单:

A串为:   A1 A2 A3 .....  An
B串为: B1 B2 B3 .....  Bm

只要反复的算下AB以各种位置叠在一起的最长连续字符个数就好了

数学上来说:就是写成这样一个矩阵:
match[n][m]=

  A1 A2 ..... ..... Am
B1 01 01 ... ... 01
B2 01 01 ... ... 01
... ... ... ... ... ...
Bn 01 01 ... ... 01

中间的值match[i][j]都是0或者1 (match[i][j]=1 means Bi=Aj),下面就在这个表中选出最长的连续对角线都是1的串,对应的子串就是AB的最大的匹配。

举个例子吧:

from:  http://www.5do8.com/blog/doc/569/index.aspx

  A= I MISS MY CODE HI

  B= One Like MY Code

  i m i s s m y c o d e h i
o 0 0 0 0 0 0 0 0 1 0 0 0 0
n 0 0 0 0 0 0 0 0 0 0 0 0 0
e 0 0 0 0 0 0 0 0 0 0 1 0 0
l 0 0 0 0 0 0 0 0 0 0 0 0 0
i 1 0 1 0 0 0 0 0 0 0 0 0 1
k 0 0 0 0 0 0 0 0 0 0 0 0 0
e 0 0 0 0 0 0 0 0 0 0 1 0 0
m 0 1 0 0 0 1 0 0 0 0 0 0 0
y 0 0 0 0 0 0 1 0 0 0 0 0 0
c 0 0 0 0 0 0 0 1 0 0 0 0 0
o 0 0 0 0 0 0 0 0 1 0 0 0 0
d 0 0 0 0 0 0 0 0 0 1 0 0 0
e 0 0 0 0 0 0 0 0 0 0 1 0 0

那个mycode就是最长匹配的串
在具体计算的时候考虑到汉字字符的多变性和英文很不一样,我们可以直接计算一个对角线上的所有的1而不用考虑联系性。
就变成了MCC(Max common characters)了,而这个MCC就是我们去判定重复的一个重要依据。
如果len(MCC) / min( len(string_A) ,len(string_B))>valve_Value就判定为转载。
-----------------------
这里可以有一个非常重要的改进,认为连续匹配会有非线性加成,如match_degree=sigma( len(common_substring[i])^2)
甚至我觉得可能某些搜索引擎就是这么干的。。【未验证】

----------------------
这样就实现了新闻的唯一性的保证,为了确保系统的效率不会被这个比较拖累的太多,可以只比较最近3个月的标题。

晚上写一个实现,能配合现在已经有的模块实现标题的唯一性。

听从Solrex的建议,在学习的时候直接看Python的tutorial和Lib,然后通过写一些简单的代码来逐步熟悉库:)
Mock Bank的测试工作已经进行的差不多了,最近要集中精力来做这个“可配置的Spider”

这个玩意的需求是具有普遍性的,我们有时候会去搜索引擎反复的搜索某个关键字,比如特别关注奥运的 可能每天都去搜索下和奥运有关的新闻。但是这么做的人倒没有想象的多,就是因为搜索引擎的重复结果太令人烦躁了。这个东西很讨厌,我举个例子就很清楚了:

单击显示大图
Google

当然这个是冗余中的一种:由于转载引起的搜索结果冗余
另外一种我管他叫挖坟,什么叫挖坟:历史沉淀引起的结果冗余。
Google下 奥运火炬就可以了。很多奥运火炬手选拔的网页由于SEO的作用很靠前,那么我最想看的敏感事件呢,基本是没有的。

现在Google news已经做得很好了,但是出于学习的态度和扩展性的态度。还是试探性的写写吧:)
-------------------------------------------