Difflib.SequenceMatcher isjunk可选参数查询:如何忽略空格,制表符,空行?

时间:2008-09-29 03:41:46

标签: python

我正在尝试使用Difflib.SequenceMatcher来计算两个文件之间的相似性。这两个文件几乎相同,只是一个包含一些额外的空格,空行和其他文件没有。我正在尝试使用

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

为此目的。

所以,问题是如何为这个isjunk方法编写lambda表达式,所以SequenceMatcher方法将折扣所有的空格,空行等。我试图使用参数lambda x:x ==“”,但结果不是很好。对于两个非常相似的文本,比率非常低。这非常反直觉。

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

  

什么激励jwovu做你的工作   好?好的,这是一个尝试的条目   赢得价值100美元的软件开发   尽管事实上我没有这本书   阅读

     编程书籍。为了赢得比赛   奖品你必须写一个条目和
  什么激励你做你的工作   好。因此这篇文章。第一   动机

     

钱。我知道,这听起来不像   给许多人带来很大的灵感   说钱是其中之一   动机因素可能只是打击我的   机会之遥。

     

好像金钱是编程的禁忌   世界。我知道有人   不能用钱来激励。嗯,上   另一方面,我生活在一个真实的   世界,

     房屋抵押支付,我自己   饲料和账单。所以我不能   真的从我的钱中排除钱   考虑。如果我能得到一个大的   

的总和      

做得好,然后肯定   提振我的士气。我不在乎   我正在使用旧工作站,或   被迫与他人共用房间或隔间   其他

     人们,或者不得不忍受一个   烦人的老板,或其他什么。事实   在一天结束的时候我会走路   大量的钱本身   

     

让我克服所有障碍,   忍受所有的艰难感受   伤害自负,容忍慢速电脑   甚至忍受

这是另一个字符串

  

是什么促使你做你的工作   好?好的,这是一个尝试的条目   赢得价值100美元的软件开发   书籍,尽管事实上我没有   阅读编程书籍。为了   赢得你必须写的奖品   进入并描述了激励你的动力   做好你的工作。因此这篇文章。

     

第一个动机,钱。我知道这个   听起来不像是一个伟大的灵感   对许多人而言,说钱就是一个   动机因素可能只是   把我的机会吹走了。好像钱是一个   编程世界中的禁忌。我知道   有些人不可能   以金钱为动力。感谢他们。我,   另一方面,我生活在一个真实的   世界,房屋抵押支付,   我自己要吃饭和账单。所以   我无法真正排除我的钱   考虑。

     

如果我可以获得一大笔钱   做得好,然后那就是   绝对能提振我的士气。我不会   关心我是否使用旧的   工作站,或被迫共享房间   或与其他人的隔间,或有   忍受讨厌的老板,或者   随你。最后的事实   那天我会走一大片   一堆钱本身对我来说已经足够了   忍受所有障碍,坚持下去   带着所有的艰难感受和伤害   自负,容忍慢速的电脑和   甚至忍受

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

4 个答案:

答案 0 :(得分:6)

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

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

然而,difflib对于这样的问题并不理想,因为这些是两个几乎完全相同的文档,但是拼写错误会导致difflib的差异,而人类不会看到很多。

尝试阅读tf-idfBayesian probabilityVector space Modelsw-shingling

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用您的示例字符串:

>>> 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

看起来新线的影响比空间大得多。

答案 3 :(得分:1)

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

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

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

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

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