【问题标题】:Calculating levenshtein distance within a list Python计算列表Python中的levenshtein距离
【发布时间】:2015-04-04 14:35:21
【问题描述】:

我有一个字符串列表,我想根据列文斯坦距离过滤掉过于相似的字符串。所以如果lev(list[0], list[10]) < 50;然后del list[10]。有什么方法可以更有效地计算列表中每对字符串之间的距离吗?谢谢!!

data2= []
for i in data:
    for index, j in enumerate(data):
        s = levenshtein(i, j)
        if s < 50:
            del data[index]
    data2.append(i)

上面相当愚蠢的代码计算时间太长...

【问题讨论】:

  • 需要更多信息才能回答。据说 Levenshtein 算法很慢。此外,未定义 data 和 data1。你看过levenshtein.net吗?外字节?你用过python的profiler吗?
  • Levenshtein 是对称的。您可能希望相应地构建嵌套的 for 循环。见,stackoverflow.com/questions/9722022/…
  • 谢谢。我正在使用来自link 的第 5 个 Levenshtein 实现。数据是一个包含 6000 个句子的列表,我只想保留一个非常相似的句子对..
  • 您是否考虑过使用记忆版(rosettacode.org/wiki/Levenshtein_distance#Python),如果单词特别相似,这可能会为您节省很多时间。其次,如果您正在删除,枚举中的索引不会与数据索引不同步,您可以简单地存储一个列表来解决这个问题。
  • 你可以试试github.com/ztane/python-Levenshtein 基于C 版本的Levenstein 算法比Python 快得多。如果您想进一步加快速度,可以添加一些逻辑,例如比较字符串的前 10 个字符,如果它们足够相似,则在整个字符串中搜索相似度。然后您可以使用多处理模块进行并行化。有了这些基本想法,与非常原始的、顺序的、全字符串比较相比,我得到了 100 倍的巨大速度提升。

标签: python levenshtein-distance edit-distance


【解决方案1】:

如果我们只保留命中字符串的索引并稍后跳过它们会怎样?我忽略了enumerate() and del() 的重量以及命中的百分比(即必须从数据集中删除多少字符串)。

THRESHOLD = 50
data = ["hel", "how", "are", "you"] # replace with your dataset

tbr = {} # holds the index of the strings to be removed
idx = 0
for i in data:
    for j in xrange(len(data)):
        if j != idx and levenshtein(i, data[j]) < THRESHOLD:
            tbr[j] = True
    idx += 1

# print tbr
data2 = []
idx = -1
for d in data:
    idx += 1
    if idx in tbr:
        continue # skip this string
    data2.append(d)
# print data2

【讨论】:

  • 谢谢!但是“保存要删除的字符串的索引”步骤仍然像永远一样......
猜你喜欢
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2013-01-15
相关资源
最近更新 更多