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算法将的博文和其他的博文匹配为相似文章,额,算了,我就不细谈了。
可从此处完成的操作:
- 使用 Google 阅读器订阅白杨 baiyang
- 开始使用 Google 阅读器,轻松地与您喜爱的所有网站保持同步更新
没有评论:
发表评论