2012年5月22日星期二

simhash算法的应用

 
 

satan 通过 Google 阅读器发送给您的内容:

 
 

于 12-5-5 通过 白杨 baiyang 作者:baiyang

弄了几天的文本相似度处理,今天决定告一段落。
如何判断二个文本是否相识,如果你之前有思考过的话,还是不妨看看google simhash算法,看完之后不得不惊叹数学之美
由于ReadSelf系统的需要,我们开始在去重复文章上开始思考,因为目前发现系统在推送文章时,出现了重复的文章,影响用户体验。这或许也是因为在中国的互联网上ctrl+c和ctrl+v用的太多的习惯吧…
当然我们面临四个问题

  • 去除文本的html标签
  • 对文本进行预处理
  • 对中文文本进行分词
  • 计算文本的simhash

去除文本的html标签和对文本进行预处理
当然相应的库非常多,比如非常棒的beautifulsoup。不过在xiaoxia的建议下,我还是自己写了一个简单的去html标签的代码

 #coding: utf8 from sgmllib import SGMLParser import sys  # Remove the html tags class Cleanup(SGMLParser):     def __init__(self):         self.pure_data = ""         SGMLParser.__init__(self)      def reset(self):         self.pure_data = ""         SGMLParser.reset(self)      def handle_data(self, data):         self.pure_data += " " + data  d = Cleanup()  # remove words except chinese words and printable ascii character def _filter_trash(text):     if not isinstance(text, unicode):         text = text.decode("utf8")      zh_range = [u"\u4E00", u"\u9FA5"]     # A---Z and a---z     en_ascii = [u"\u0020", u"\u007E"]     # filter function     def in_zh_range(x):         return x>=zh_range[0] and x<=zh_range[1] or \                x>=en_ascii[0] and x<=en_ascii[1]      return filter(in_zh_range, text)  def clean_text(text_with_html):     """ remove html tags """     d.reset(); d.feed(text_with_html)     text = d.pure_data     text = _filter_trash(text)     return text  if __name__ == "__main__":     text = ""     print clean_text(text) 

这段代码中Cleanup类完成去html tags的功能,只留下纯净的文本;然后对文本进行预处理,这里只留下了中文字和可打印的ASCII。或许这个只是对于我们简单的需求。不过预处理还可以优化,因为在理解simhash的基础上,我们还可以尽量减少普通文本的共性。
对文本进行分词:
可以看看matrix67之前写的一片文章。我们用了python的smallseg库。
对特征计算,然后计算文本的simhash值:
计算文本的simhash网上有很多博文。如果我在这里又重复说一下simhash算法,那岂不是google simhash算法将的博文和其他的博文匹配为相似文章,额,算了,我就不细谈了。


 
 

可从此处完成的操作:

 
 

没有评论:

发表评论