在计算编辑距离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)
这种方法正确吗?或者我缺少什么?
答案 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
类型,因此您可以传递任何支持索引的对象,例如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)
答案 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