Как использовать функцию process.extract от fuzzywuzzy для обработки списка объектов по определенному атрибуту? - PullRequest
0 голосов
/ 21 мая 2018

Я создал объект с именем Issuer, который содержит член с именем issuer_name.

Я хочу воспользоваться функцией process.extract() fuzzywuzzy, но она принимает только список строк.Моя цель - найти совпадения и вернуть список объектов, которые совпадают по issuer_name.

. Я пришел к этому методу ниже, но он работает очень медленно.Список эмитентов содержит более 100 000 элементов.

# (string, list of issuers , integer)
def fuzzyMatchWordToIssuers(word, issuers, threshold):
    limit = 5
    count = 0
    res = []
    for issuer in issuers:
        calc = fuzz.token_set_ratio(word,issuer.issuer_name)
        if calc >= threshold:
            res.append(issuer)
            count += 1
        if count == limit:
            return res
    return res

Можно ли каким-либо образом использовать process.extract() или ускорить это?

Для справки, вот пример github:

process.extract("new york jets", choices, limit=2)

1 Ответ

0 голосов
/ 23 августа 2018

Предисловие

Мое решение было проверено на правильность.Мне нужно иметь возможность поиска по списку объектов, и это решение, которое сработало для меня.Однако мое решение не было проверено на производительность, и меня это не волнует, поскольку мои наборы данных довольно малы.Для больших наборов данных я настоятельно рекомендую использовать сторонний инструмент, вероятно, какой-то облачный инструмент поиска будет масштабируемым и с приемлемой производительностью.

Решение

нечеткий процесс.может обрабатывать словарь, в котором ищутся только значения, а результатом является список кортежей со следующей структурой

(query, score, key)

Где query и score такие же, как при использовании экстракта со списками и key - это ключ, который соответствует строковому значению (значения должны быть только строками).Итак, вам нужно будет создать обработанный словарь имен эмитентов с ключами в качестве индексов, например

issuer_names_dict = dict(enumerate([issuer.name for issuer in issuers]))

Затем вы можете передать этот словарь в process.extract (я думаю, что вы должны использовать extractBests, так как вы используете обрезкупорог)

best_issuers = process.extractBests(word, issuer_names_dict, score_cutoff=threshold, limit=5)

Наконец вам нужно собрать список результатов

res = [issuers[z] for (x,y,z) in best_issuers]
...