NLTK 编辑距离低于元组的预期



在计算编辑距离时,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类型,因此您可以传递任何支持索引的对象,例如tuplelist。当您传递一对元组以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)

最新更新