在计算编辑距离时,nltk似乎没有正确考虑这些变化。例如
edit_distance(('paravati', 'selke', 'vital'), ('paravati', 'selke', 'vital'), transpositions=True)
这将返回 0,因为字符串匹配。
edit_distance(('paravati', 'selke', 'vital'), ('selke', 'paravati', 'vital'), transpositions=True)
这将返回 1,因为启用了换位。其他 2
edit_distance(('paravati', 'selke', 'vital'), ('belke', 'paravati', 'vital'), transpositions=True)
这将返回 2,因为 1 点表示换位,1 点表示替换。
edit_distance(('paravati', 'selke', 'vital'), ('belke', 'zaravati', 'vital'), transpositions=True)
但是当我更改第二个单词的拼写(从 p 到 z(时,我仍然得到值 2。期望值大于 2,因为现在更改了 2 个单词。
换句话说,这两个单词的距离是 5,包含完全相同单词的元组的距离是 3。这似乎不正确。
from nltk.metrics import edit_distance
edit_distance('vital', 'vataldedd', transpositions=True)
edit_distance(('paravati', 'selke', 'vital'), ('selke', 'zaravatiasdf', 'vataldedd'), transpositions=True)
此元组比较的预期距离为 5 或更大。
更新:
我分别比较了所有字符串,并按预期获取了返回 10 的总数。
s1, s2 = ('paravati', 'selke', 'vital'), ('selke', 'zaravatiasdf', 'vataldedd')
final=list()
for i in s1:
mylist=list()
for k in s2:
mylist.append(edit_distance(i, k, transpositions=True))
final.append(min(mylist))
sum(final)
这种方法是否正确还是我遗漏了什么?
edit_distance()
函数需要字符串作为输入。简单地说,将每个元组中的子字符串连接成一个字符串。
>>> from nltk.metrics import edit_distance
>>> x, y = ('paravati', 'selke', 'vital'), ('belke', 'zaravati', 'vital')
>>> x, y = " ".join(x), " ".join(y)
>>> x
'paravati selke vital'
>>> y
'belke zaravati vital'
>>> edit_distance(x, y)
13
>>> edit_distance(x, y, transpositions=True)
13
函数edit_distance
不支持元组计算,预期输入是一对字符串。从文档中:
:param s1, s2: The strings to be analysed
:param transpositions: Whether to allow transposition edits
:type s1: str
:type s2: str
问题是该函数不检查值是否为str
类型,因此您可以传递任何支持索引的对象,例如tuple
或list
。当您传递一对元组以edit_distance
函数会将元组的每个元素视为基本元素。这就是调用的原因:
d = edit_distance(('paravati', 'selke', 'vital'), ('belke', 'zaravati', 'vital'), transpositions=True)
返回 2,因为有两个不同的元素('paravati', 'zaravati'
( 和('selke', 'belke')
。要计算一组字符串之间的总编辑距离,您必须将代码包装在一个函数中,如下所示:
def total_edit_distance(s1, s2):
final = list()
for i in s1:
mylist = list()
for k in s2:
mylist.append(edit_distance(i, k, transpositions=True))
final.append(min(mylist))
return sum(final)