Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python脚本中检测相似文档的算法_Python_Algorithm_Diff - Fatal编程技术网

python脚本中检测相似文档的算法

python脚本中检测相似文档的算法,python,algorithm,diff,Python,Algorithm,Diff,我需要编写一个模块来检测类似的文档。我读过很多关于文档指纹技术和其他方面的文章,但我不知道如何编写代码或实现这样的解决方案。该算法应适用于中文、日文、英文和德文,或与语言无关。我怎样才能做到这一点呢?您可以使用Python的stdlib编写代码,或者至少学习一下它 它非常灵活,并且有算法来查找字符串列表之间的差异,并指出这些差异。然后您可以使用get\u close\u matches()查找类似的单词: >>> get_close_matches('appel', ['ape

我需要编写一个模块来检测类似的文档。我读过很多关于文档指纹技术和其他方面的文章,但我不知道如何编写代码或实现这样的解决方案。该算法应适用于中文、日文、英文和德文,或与语言无关。我怎样才能做到这一点呢?

您可以使用Python的stdlib编写代码,或者至少学习一下它

它非常灵活,并且有算法来查找字符串列表之间的差异,并指出这些差异。然后您可以使用
get\u close\u matches()
查找类似的单词:

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']

这不是解决办法,但可能只是一个开始。

你需要让你的问题更具体一些。如果您已经阅读了指纹文件,那么您已经了解了工作原理,因此在这里描述常见方法将不会有好处。如果你还没有,你也应该看看关于“重复检测”的论文,以及斯坦福大学、谷歌、雅虎和微软近年来发表的各种与网络垃圾邮件检测相关的论文

您在编码所描述的算法时是否存在特定问题

开始有困难吗


我可能要做的第一件事是将标记化(提取“单词”或其他合理序列的过程)与重复检测逻辑分开,因此,很容易为不同的语言插入不同的解析器,并保持重复检测片段不变。

如果您准备为要搜索的文件编制索引,Xapian是一个优秀的引擎,并提供Python绑定:


如果这些是纯文本文档,或者您有一种从文档中提取文本的方法,那么您可以使用一种称为shingling的技术

首先计算每个文档的唯一哈希。如果这些都是相同的,你就完了

如果不是,则将每个文档分解为更小的块。这些是你的“木瓦”

一旦有了木瓦,就可以计算每个木瓦的标识散列,并比较木瓦的散列,以确定文档实际上是否相同

您可以使用的另一种技术是生成整个文档的n-gram,计算每个文档中相似的n-gram的数量,并为每个文档生成加权分数。基本上,n-gram就是把一个单词分成更小的块“苹果”将成为“a”、“ap”、“app”、“ppl”、“ple”、“le”。(从技术上讲,这是一个3-gram)对于大量文档或两个非常大的文档,这种方法在计算上可能会变得非常昂贵。当然,普通的n-克'the','th','th'等需要加权,以便得分更低

我已经在我的博客上发布了关于这一点的文章,文章中还有一些关于这个主题的其他文章的链接


祝你好运

如果您试图检测正在谈论同一主题的文档,您可以尝试收集最常用的单词,扔掉这些单词。最常用词分布相似的文档可能谈论的是类似的事情。如果您想要更高的准确性,您可能需要做一些工作并将概念扩展到。要了解更先进的技术,请查看机器学习。

Google Techtalks上有一个相当不错的平台,介绍如何使用分层Boltzmann机器为文档生成特征向量,然后用于测量文档距离。主要问题是需要设置一个大样本文档,以训练网络发现相关功能。

我认为Jeremy一针见血——如果你只是想检测文件是否不同,像MD5或SHA1这样的哈希算法是一个不错的方法


Linus Torvalds的Git源代码控制软件正是以这种方式使用SHA1哈希来检查文件何时被修改。

贝叶斯过滤器正是为了这个目的。这就是你在大多数识别垃圾邮件的工具中可以找到的技术

例如,要检测语言(从):


但它可以检测任何你将训练它的类型:技术文本、歌曲、笑话等。只要你能提供足够的材料让工具了解你的文档是什么样子。

无需分类就可以很容易地找到相似性。试试这个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

您可能需要研究中概述的防尘算法

从纸上看,他们甚至不用检查页面内容就可以检测到重复页面。当然,检查内容可以提高效率,但是使用原始服务器日志就足以检测重复页面


与使用MD5或SHA1散列的建议类似,DustBuster方法主要依赖于将文件大小作为主要信号进行比较。虽然听起来很简单,但它对于初次通过非常有效。

FYI,这在Python3中是通过在集合中删除复数s(集合->集合)来实现的。谢谢。类似的问题和其他答案:
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