3

我正在尝试使用 Difflib.SequenceMatcher 来计算两个文件之间的相似性。这两个文件几乎相同,除了一个包含一些额外的空格、空行而另一个不包含。我正在尝试使用

s=difflib.SequenceMatcher(isjunk,text1,text2)
ratio =s.ratio()

以此目的。

所以,问题是如何为这个 isjunk 方法编写 lambda 表达式,以便 SequenceMatcher 方法将忽略所有空格、空行等。我尝试使用参数 lambda x: x==" ",但结果不是一样棒。对于两个非常相似的文本,该比率非常低。这是非常反直觉的。

出于测试目的,以下是您可以在测试中使用的两个字符串:

是什么促使 jwovu 做好你的工作?好的,这是一个试图赢得价值 100 美元的软件开发书籍的条目,尽管我不读

编程书籍。为了赢得奖品,你必须写一个条目,以及
是什么促使 fggmum 做好你的工作。因此这篇文章。第一个动机

钱。我知道,这听起来对许多人来说并不是一个很好的灵感,并且说金钱是激励因素之一可能会让我失去机会。

好像金钱是编程世界的禁忌。我知道有些人不能被金钱所激励。另一方面,Mme 生活在一个真实的世界中,

有房贷要付,我自己要养活,还要付账单。所以我真的不能把钱排除在我的考虑之外。如果我能得到一大笔钱

干得好,那肯定会鼓舞我的士气。我不在乎我是在使用旧工作站,还是被迫与其他人共用房间或隔间

人,或者不得不忍受一个烦人的老板,或者其他什么。事实上,在一天结束时我会带着一大笔钱走人本身就足够了

让我克服所有的障碍,忍受所有的痛苦和伤害自尊心,忍受慢速的电脑,甚至忍受

这是另一个字符串

是什么促使你做好工作?好的,这是一个试图赢得价值 100 美元的软件开发书籍的条目,尽管我不阅读编程书籍。为了赢得奖品,你必须写一个条目并描述是什么促使你做好工作。因此这篇文章。

第一个动机,金钱。我知道,这听起来对许多人来说并不是一个很好的灵感,并且说金钱是激励因素之一可能会让我失去机会。好像金钱是编程世界的禁忌。我知道有些人不能被金钱所激励。向他们致敬。另一方面,我生活在一个现实世界中,要支付房屋抵押贷款,要养活自己,要支付账单。所以我真的不能把钱排除在我的考虑之外。

如果我能因为做好工作而得到一大笔钱,那肯定会鼓舞我的士气。我不在乎我是在使用旧的工作站,还是被迫与其他人共用房间或隔间,或者不得不忍受烦人的老板,或者其他什么。一天结束时,我会带着一大笔钱走人,这一事实足以让我克服所有的障碍,忍受所有的痛苦和伤害自尊心,容忍一台运行缓慢的电脑,甚至忍受

我运行了上面的命令,并将 isjunk 设置为 lambda x:x==" ",比率只有 0.36。

4

4 回答 4

7

如果匹配所有空格,则相似性会更好:

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio()

然而,difflib 对于这样的问题并不理想,因为这是两个几乎相同的文档,但是错别字等会在人类看不到的 difflib 中产生差异。

尝试阅读tf-idf贝叶斯概率向量空间模型w-shingling

我编写了一个tf-idf 的实现,将其应用于向量空间并使用点积作为距离度量来对文档进行分类。

于 2008-09-29T07:17:02.400 回答
2

使用您的示例字符串:

>>> s=difflib.SequenceMatcher(lambda x: x == '\n', s1, s2)
>>> s.ratio()
0.94669848846459825

有趣的是,如果 ' ' 也被列为垃圾:

>>> s=difflib.SequenceMatcher(lambda x: x in ' \n', s1, s2)
>>> s.ratio()
0.7653142402545744

看起来新行的影响比空格大得多。

于 2008-09-29T06:43:27.987 回答
2

鉴于上述文本,测试确实如建议的那样:

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio()

但是,为了稍微加快速度,您可以利用 CPython 的method-wrappers

difflib.SequenceMatcher(" \t\n".__contains__, doc1, doc2).ratio()

这避免了许多 python 函数调用。

于 2008-09-29T11:48:48.457 回答
1

我没有使用 Difflib.SequenceMatcher,但是您是否考虑过预处理文件以删除所有空白行和空格(可能通过正则表达式)然后进行比较?

于 2008-09-29T03:47:19.673 回答