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

时间:2018-08-25 10:42:20

标签: nlp 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)

这种方法正确吗?或者我缺少什么?

2 个答案:

答案 0 :(得分:1)

函数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)

答案 1 :(得分:1)

Th 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