获取考虑删除的接近字符串匹配-python 有没有一种方法可以让字符串在字符串匹配中考虑删除呢?< /强> 我已经尝试了 DopiB.GETHOLLYEXMatHeSe()/Cyto>但它不考虑在关闭匹配输出中具有较低长度的字符串。例如 from difflib import get_close_matches as gcm x = """Erfreulich Erfreuliche Erfreulicher Erfreulicherem Erfreulicheres Erfreulicherweis Erfreulicherweise Erfreuliches Erfreulichste""" x = [i for i in x.split("\n")] for i in x: print i, gcm(i,x)

获取考虑删除的接近字符串匹配-python 有没有一种方法可以让字符串在字符串匹配中考虑删除呢?< /强> 我已经尝试了 DopiB.GETHOLLYEXMatHeSe()/Cyto>但它不考虑在关闭匹配输出中具有较低长度的字符串。例如 from difflib import get_close_matches as gcm x = """Erfreulich Erfreuliche Erfreulicher Erfreulicherem Erfreulicheres Erfreulicherweis Erfreulicherweise Erfreuliches Erfreulichste""" x = [i for i in x.split("\n")] for i in x: print i, gcm(i,x),python,string,pattern-matching,string-matching,difflib,Python,String,Pattern Matching,String Matching,Difflib,输出: Erfreulich ['Erfreulich', 'Erfreuliche', 'Erfreuliches'] Erfreuliche ['Erfreuliche', 'Erfreuliches', 'Erfreulicher'] Erfreulicher ['Erfreulicher', 'Erfreuliche', 'Erfreulicheres'] Erfreulicherem ['Erfreulicherem', 'Erfreulicheres', 'Erfreulicher'

输出:

Erfreulich ['Erfreulich', 'Erfreuliche', 'Erfreuliches']
Erfreuliche ['Erfreuliche', 'Erfreuliches', 'Erfreulicher']
Erfreulicher ['Erfreulicher', 'Erfreuliche', 'Erfreulicheres']
Erfreulicherem ['Erfreulicherem', 'Erfreulicheres', 'Erfreulicher']
Erfreulicheres ['Erfreulicheres', 'Erfreulicherweis', 'Erfreulicherem']
Erfreulicherweis ['Erfreulicherweis', 'Erfreulicherweise', 'Erfreulicheres']
Erfreulicherweise ['Erfreulicherweise', 'Erfreulicherweis', 'Erfreulicheres']
Erfreuliches ['Erfreuliches', 'Erfreuliche', 'Erfreulicheres']
Erfreulichste ['Erfreulichste', 'Erfreuliche', 'Erfreuliches']

请注意,对于字符串
Erfreulicher
Erfreulich
虽然距离仅为-1,但并不被认为是紧密匹配的。

我不是pyton开发人员,但听起来您需要计算字符串之间的levenshtein距离。发件人:

两个单词之间的Levenshtein距离最小 单字符编辑数(插入、删除、替换) 需要将一个单词更改为另一个单词

如果你计算每个单词到每个单词的距离,你总是可以根据你定义的“接近”得到最接近的匹配。现在,正如我所说,我不是pyton开发人员,因此我无法帮助您实现特定于语言的实现,但我找到了一个包。

从中,可以增加
n
参数以获得更多匹配项。有些单词比较短,所以<代码> DoffiB确实考虑删除。

difflib.get_close_matches(单词,可能性[,n][,截止])
返回最佳“足够好”匹配的列表。word是一个需要紧密匹配的序列(通常是一个字符串),而可能性是一个要匹配word的序列列表(通常是一个字符串列表)

可选参数n(默认值3)是要返回的最大接近匹配数;n必须大于0

可选参数截止(默认值为0.6)是范围[0,1]内的浮点值。不得分至少与word相似的可能性将被忽略

可能性中的最佳匹配(不超过n个)以列表的形式返回,按相似性分数排序,最相似的优先

下面是与gcm(i,x,6)相同的单词:


你应该接受马克·托洛宁的回答——他读了文件;-)

要了解更多信息,请注意
difflib
的相似性概念与Levenshtein编辑距离无关,但这可能是您真正想要的。当你说:

请注意,对于字符串Erfreulicher,不考虑Erfreulich 一场势均力敌的比赛,尽管距离只有-1

我也不知道你心目中的“距离”是什么概念。字符串相差2个字符,对吗?“-1”是神秘的

difflib
计算“相似性分数”,该分数是介于0.0到1.0之间的浮点值。下面是如何使用您的列表
x
,查看它在内部执行的操作:

import difflib
s = difflib.SequenceMatcher()
s.set_seq2("Erfreulicher")
full = []
for i in x:
    s.set_seq1(i)
    full.append((s.ratio(), i))
full.sort(reverse=True)
for score, i in full:
    print "{:20} {:.3f}".format(i, score)
以下是结果,从最高相似性分数到最低相似性分数排序:

Erfreulicher         1.000
Erfreuliche          0.957
Erfreulicheres       0.923
Erfreulicherem       0.923
Erfreuliches         0.917
Erfreulich           0.909
Erfreulichste        0.880
Erfreulicherweis     0.857
Erfreulicherweise    0.828
正如文档所说,默认情况下,
get\u close\u matches()
只返回前三名。您询问的特定单词恰好是列表中的第六个单词,如果您告诉函数返回前6个(或7个等)匹配项,就会返回该单词(请参见Mark的答案)

此外,还记录了分数的计算方法。由于“Erfreulich”是“Erfreulicher”的前缀,因此它简化为:

>>> 2.0 * len("Erfreulich") / (len("Erfreulich") + len("Erfreulicher"))
0.9090909090909091

列表中“Erfreulich”上方的所有字符串至少还有一个共同字符,这使得分子更大。分母对它们来说也更大,但是增加分子1比增加分母1对结果的影响更大。这可能与你的直觉相符,也可能与你的直觉不符,但这就是它的工作原理;-)

很好的例子和所有的写作!
>>> 2.0 * len("Erfreulich") / (len("Erfreulich") + len("Erfreulicher"))
0.9090909090909091