Нечеткое соответствие строк в Python в производительности списка - PullRequest
2 голосов
/ 08 мая 2019

Я проверяю, есть ли похожие результаты (нечеткое совпадение) в 4 одинаковых столбцах данных, и у меня в качестве примера приведен следующий код. Когда я применяю его к реальному набору данных из 40 000 строк и 4 столбцов, он продолжает работать вечно. Проблема в том, что код слишком медленный. Например, если я ограничу набор данных 10 пользователями, на вычисление уйдет 8 минут, а на 20 - 19 минут. Есть что-то, что я пропускаю? Я не знаю, почему это так долго. Я ожидаю получить все результаты, максимум через 2 часа или меньше. Любая подсказка или помощь будет принята с благодарностью.

from fuzzywuzzy import process
dataframecolumn = ["apple","tb"]
compare = ["adfad","apple","asple","tab"]
Ratios = [process.extract(x,compare) for x in dataframecolumn]
result = list()
for ratio in Ratios:
    for match in ratio:
        if match[1] != 100:
            result.append(match)
            break
print (result) 

Выход: [('asple', 80), ('tab', 80)]

1 Ответ

1 голос
/ 16 мая 2019

Значительное улучшение скорости достигается за счет написания векторизованных операций и исключения циклов

Импорт необходимого пакета

from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np

Создание кадра данных из первого списка

dataframecolumn = pd.DataFrame(["apple","tb"])
dataframecolumn.columns = ['Match']

Создание кадра данных из второго списка

compare = pd.DataFrame(["adfad","apple","asple","tab"])
compare.columns = ['compare']

Слияние - декартово произведение путем введения ключа

dataframecolumn['Key'] = 1
compare['Key'] = 1
combined_dataframe = dataframecolumn.merge(compare,on="Key",how="left")
combined_dataframe = combined_dataframe[~(combined_dataframe.Match==combined_dataframe.compare)]

Векторизация

def partial_match(x,y):
    return(fuzz.ratio(x,y))
partial_match_vector = np.vectorize(partial_match)

Использование векторизации и получение желаемого результата путем помещенияпорог по шкале

combined_dataframe['score']=partial_match_vector(combined_dataframe['Match'],combined_dataframe['compare'])
combined_dataframe = combined_dataframe[combined_dataframe.score>=80]

Результаты

+--------+-----+--------+------+
| Match  | Key | compare | score
+--------+-----+--------+------+
| apple  | 1   |   asple |    80
|  tb    | 1   |   tab   |    80
+--------+-----+--------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...