Функция для вычисления расстояния Левенштейна - PullRequest
0 голосов
/ 24 июня 2019

Я создал функцию для вычисления расстояния Левенштейна (L.distance) двух переменных в python при использовании пакета Левенштейна. Тем не менее, я получаю TypeError («ожидаемое расстояние двух строк или двух Unicodes»), когда я пытаюсь применить функцию. Однако обе переменные, которые я использую для вычисления L.distance, являются строками.

Я попробовал цикл for, затем снял его, посмотрев на другой онлайн-скрипт, который реализует L.distance. Я создал тестовый фрейм данных, в котором используются только отдельные слова, сравниваемые друг с другом, поскольку я подумал, что это может быть проблемой (я сравниваю названия компаний, которые могут иметь много слов, а не только отдельные слова)

lst=['bear', 'tomato', 'green', 'snake']
lst2 =['baear', 'tomato', 'grean', 'snake']
dftest=pd.DataFrame(list(zip(lst,lst2)), columns =['lst1', 'lst2'])

result= []
def distancefinder(string1, string2):
    for string1, string2 in something:
        stringdist = lv.distance(string1, string2)
        result.append(stringdist)
    return (result)
dftest['lv_matchscore'] = distancefinder(dftest.lst1, dftest.lst2)

Ожидаемый результат - это расчетное расстояние L. двух переменных.

1 Ответ

0 голосов
/ 24 июня 2019

Вот как вы должны это сделать:

# Imports
import pandas as pd
import Levenshtein as lv

lst=['bear', 'tomato', 'green', 'snake']
lst2 =['baear', 'tomato', 'grean', 'snake']
dftest=pd.DataFrame(list(zip(lst,lst2)), columns =['lst1', 'lst2'])

result= []
def distancefinder(lst1, lst2):
    # Create the list you will populate with the results
    results = []
    # Loop through your records (Levenshtein uses strings, not pandas.Series)
    for i in range(len(lst1)):
        # Calculate the distance 
        stringdist = lv.distance(lst1[i], lst2[i])
        # Append the result
        results.append(stringdist)
    # Return the results list
    return results
dftest['lv_matchscore'] = distancefinder(dftest.lst1, dftest.lst2)

EDIT

for i in range(len(lst1)):

  • lst1 - это панда. Сериалы, которые вы хотите сравнить (lst2 - это другой)
  • len(lst1) возвращает длину ряда в виде целочисленного значения (в данном примере это значение равно 4)
  • range(len(lst1)) (в данном случае это будет range(4)) возвращает список целых чисел, начиная с 0 и до 3. Итак: [0, 1, 2, 3]
  • for i in range(len(lst1)) будет for i in [0, 1, 2, 3] в этом случае. i будет использоваться в качестве индекса для получения каждого элемента из серии, которую вы хотите сравнить. На первой итерации вы будете сравнивать lst1[0] и lst2[0]; во втором lst1[1] и lst2[1] и т. д.
...