我需要编写一个检测相似文档的模块。我已经阅读了许多关于文档指纹技术和其他技术的论文,但我不知道如何编写代码或实现这样的解决方案。该算法应该适用于中文、日语、英语和德语等语言,或者是独立于语言的。我应该如何完成这个任务?
贝叶斯过滤器正是有这个目的。在大多数用于识别垃圾邮件的工具中,你会发现这种技术。
例如,为了检测语言(源自http://sebsauvage.net/python/snyppets/#bayesian):
from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french','La souris est rentrée dans son trou.')
guesser.train('english','my tailor is rich.')
guesser.train('french','Je ne sais pas si je viendrai demain.')
guesser.train('english','I do not plan to update my website soon.')
>>> print guesser.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]
>>> print guesser.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]
但是它可以用来检测你训练的任何类型:技术文本、歌曲、笑话等。只要你提供足够的材料让这个工具学习你的文档长什么样子。
不需要分类即可轻松找到相似性。尝试使用这个O(n2)算法,它可以很好地工作。
def jaccard_similarity(doc1, doc2):
a = sets(doc1.split())
b = sets(doc2.split())
similarity = float(len(a.intersection(b))*1.0/len(a.union(b))) #similarity belongs to [0,1] 1 means its exact replica.
return similarity
get_close_matches()
来查找相似的单词:>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
这不是解决方案,但也许它是一个开始。
这里有一个非常好的谈论神经网络 的Google Techtalks视频,讲解使用分层玻尔兹曼机生成特征向量来衡量文档距离。主要问题是需要一个大样本文件集来训练网络以发现相关特征。
如果你准备好对想要搜索的文件进行索引,Xapian是一个非常优秀的引擎,并且提供了Python绑定:
你可能想要查看DustBuster算法,如this paper中所述。
从这篇论文中,他们能够检测重复的网页,甚至不需要检查页面内容。当然,检查内容可以增加效力,但是使用原始服务器日志已足以使该方法检测到重复页面。
与建议使用MD5或SHA1哈希值类似,DustBuster方法主要依赖于比较文件大小作为其主要信号。尽管听起来很简单,但对于第一轮初始处理而言相当有效。
我认为Jeremy说得很对 - 如果你只想检测文件是否不同,像MD5或SHA1这样的哈希算法是一个不错的选择。
Linus Torvalds的Git源代码控制软件就是以这种方式使用SHA1哈希算法来检查文件是否被修改过。