Ошибка с FuzzyWuzzy: StringProcessor.replace_non_letters_non_numbers_with_whitespace (s) - PullRequest
1 голос
/ 11 апреля 2019

Я не могу запустить следующую функцию:

match, match_score = process.extractOne(score, pct_dict.keys())

Я получаю ошибку пробела, которую я не могу устранить.Любая идея, что вызывает это?

Что он должен делать: если счет равен 15, он должен вернуть 0,026

Ошибка:

Ошибка: выход = self.func (* resolved_args, ** resolved_kwargs) wnas1
|Файл "/code/cleveland/templatetags/percentiles_ratings.py", строка 32, в get_percentile_standard wnas1 |match, match_score = process.extractOne (оценка, pct_dict.keys ()) wnas1 |Файл "/usr/local/lib/python3.7/site-packages/fuzzywuzzy/process.py", строка 220, в extractOne wnas1 |вернуть max (список лучших, ключ = лямбда i: i [1]) wnas1 |Файл "/usr/local/lib/python3.7/site-packages/fuzzywuzzy/process.py", строка 78, в extractWithoutOrder wnas1 |processing_query = процессор (запрос) wnas1 |Файл "/usr/local/lib/python3.7/site-packages/fuzzywuzzy/utils.py", строка 95, в full_process wnas1 |string_out = StringProcessor.replace_non_letters_non_numbers_with_whitespace (s) wnas1 |Файл "/usr/local/lib/python3.7/site-packages/fuzzywuzzy/string_processing.py", строка 26, в replace_non_letters_non_numbers_with_whitespace wnas1
|return cls.regex.sub ("", a_string)

Код:

from __future__ import unicode_literals
from django import template
from fuzzywuzzy import fuzz
from fuzzywuzzy import process


register = template.Library()


@register.simple_tag
def get_perc(score):
    MATCH_THRESHOLD = 80
    pct_dict = {14: 0.016, 14.7: 0.021, 15.3: 0.026, 16: 0.034, 16.7: 0.04, 17.3: 0.05, 18: 0.07, 18.7: 0.09,
                    19.3: 0.11, 20: 0.13, 20.7: 0.17, 21.3: 0.21, 22: 0.26, 22.7: 0.31, 23.3: 0.38, 24: 0.47}
    if not score:
        return '--'
    elif score < 26.7:
        return '<1'

    match, match_score = process.extractOne(score, pct_dict.keys())

    if match_score >= MATCH_THRESHOLD:
        return pct_dict[match]
    else:
        return '--'

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Спасибо, это сработало.Спасибо за разъяснения относительно строковых значений.Это позволило мне установить str (оценка) для преобразования значения оценки в строку.

Вот код функции:

@register.simple_tag
def get_perc(score):
    MATCH_THRESHOLD = 80
    pct_dict = {'14': '0.016', '14.7': '0.021', '15.3': '0.026', '16': '0.034', '16.7': '0.04', '17.3': '0.05', '18': '0.07', '18.7': '0.09', '19.3': '0.11', '20': '0.13', '20.7': '0.17', '21.3': '0.21', '22': '0.26', '22.7': '0.31', '23.3': '0.38', '24': '0.47'}
    if not score:
        return '--'
    elif score < 24:
        return '<1'

    match, match_score = process.extractOne(str(score), pct_dict.keys())

    if match_score >= MATCH_THRESHOLD:
        return pct_dict[match]
    else:
        return '--'
0 голосов
/ 11 апреля 2019

Согласно документации fuzzywuzzy , вам нужно сравнить две строки.Это означает, что вам нужно преобразовать значения в строку, чтобы сравнить их.Тогда вам нужно сделать это так:

match, match_score = process.extractOne(str(score), pct_dict.keys())

Я бы не рекомендовал этот подход, потому что он не будет точным.

>>> x = ['1','2','3']
>>> y='2'
>>> process.extractOne(y,x)
('2', 100)
>>> y='2.2'
>>> process.extractOne(y,x)
('2', 90)
>>> y = '2.9'
>>> process.extractOne(y,x)
('2', 90)

Здесь в последних 2 записях вы увидите оценку 90 как для 2,2, так и для 2,9, где 2,9 намного ближе к 3 *.

Поскольку у вас есть числаи я бы порекомендовал вам просто сравнить их так:

value = min(pct_dict, key=lambda x:abs(x - score))
# then some logics to see if value is close to score or put some static threshold value like `abs(value-score) < .3`

Есть несколько SO ответов , которые могут помочь вам в этом.

...