【问题标题】:python compute closeness of stringspython计算字符串的接近度
【发布时间】:2013-08-01 04:20:18
【问题描述】:

我想比较 3 位或 4 位整数的字符串表示形式。我想将它们分组为成对的“亲密关系”。也就是说,pc_dud[3] 应该与 dud[0] 配对。

dud = ['3433', '3467', '3551', '345', '345', '3613'] 
pc_dud = ['3401', '3402', '3430', '0342', '3584']

有没有人知道那里有一个很好的工具来做到这一点(我在想自己可能是像水母这样的东西)?当然,另一种解决方案是使用算术差异作为“接近度”的指标。有什么想法吗?

【问题讨论】:

  • difflib 模块。
  • 差异会更容易,因为它们只是数字。如果它们是字母数字字符串,那么您将执行等效的 levenshtein 距离。
  • 这取决于您希望将差异最小化的程度,例如是否可以牺牲一对以使所有其他人更接近...如果不是,我会对列表进行排序并压缩两者。
  • 不过,这些列表的长度不同。
  • 或者,您可能希望最小化平均差异、最大差异,...有多种方法,具体取决于您想用它做什么。

标签: python string-comparison


【解决方案1】:

您可以采用的一种方法是计算 dud 中的每个整数字符串与 pc_dud 中的每个整数字符串之间的Levenshtein Distance。该算法将为您提供每个数字序列之间的编辑距离。编辑距离数字表示将给定序列转换为另一个序列所需的最小步数。它考虑了插入、删除和替换。

您还需要一个数据结构来存储相对于比较序列的编辑距离结果。然后,您可以调查哪个编辑距离最小,然后将它们分组。

这是一个视觉示例,说明与 levenshtein 相比,您的数组中的两个数字序列会是什么样子。我使用这个工具来生成屏幕截图。 http://www.let.rug.nl/kleiweg/lev/

http://imgur.com/OTJia7W

右下角的数字是最小编辑距离。

【讨论】:

  • 实际上,我最初并没有注意到对算术差异的强调。这可能不是最好的解决方案,但可能是一个不错的选择。
【解决方案2】:

如果您正在寻找算术上的接近性,那么 pc_dud[3] 将与 dud[0] 不匹配。

如果您只想保留唯一的对,请使用:

dud_ = dud[:]
pc_dud_ = pc_dud[:]

while dud_:
    d1, d2 = min(itertools.product(dud, pc_dud), key=lambda d1,d2: abs(int(d1) - int(d2)))
    dud_.remove(d1)
    pc_dud_.remove(d2)
    print d1, d2

【讨论】:

    【解决方案3】:

    如果您按照 Paul 的建议走 Levenshtein Distance 路线,请查看 Apache 的 PyLucene - 我相信lucene的FuzzyQuery就是基于这个的。

    【讨论】:

      【解决方案4】:

      您可以使用difflib 模块:

      例子:

      >>> import difflib
      >>> dud = ['3433', '3467', '3551', '345', '345', '3613'] 
      >>> pc_dud = ['3401', '3402', '3430', '0342', '3584']
      >>> difflib.get_close_matches(dud[0], pc_dud)
      ['3430']
      

      【讨论】:

        猜你喜欢
        • 2013-10-02
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2016-12-31
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 1970-01-01
        相关资源
        最近更新 更多