【问题标题】:nltk edit distance lower than expected for tuple元组的 nltk 编辑距离低于预期
【发布时间】:2018-08-25 10:42:19
【问题描述】:

在计算编辑距离时,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 个单词被改变了。


也就是说,这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)

这种方法正确还是我遗漏了什么?

【问题讨论】:

    标签: nlp nltk


    【解决方案1】:

    Thedit_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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        相关资源
        最近更新 更多