Мне нужна помощь в выяснении причин
fuzz.WRatio('Māne', 'mane', force_ascii=True) => 75%
а также
fuzz.WRatio('Māne', 'Mane', force_ascii=True) => 75%
Я бы ожидал, что параметр force_ascii обеспечит большую точность. Спасибо.
Мне нужна помощь в выяснении причин
fuzz.WRatio('Māne', 'mane', force_ascii=True) => 75%
а также
fuzz.WRatio('Māne', 'Mane', force_ascii=True) => 75%
Я бы ожидал, что параметр force_ascii обеспечит большую точность. Спасибо.
Есть два аргумента force_ascii
и full_process
при работе с fuzz.WRatio
в fuzzywuzzy, оба по умолчанию имеют значение True. Оба они используются для предварительной обработки строк (force_ascii используется только тогда, когда full_process имеет значение True, а в противном случае игнорируется).
1) При использовании force_ascii=False, full_process=False
строки не изменяются до их сопоставления, поэтому, например. верхний/нижний регистр имеет значение.
2) При использовании force_ascii=False, full_process=True
Все не буквенно-цифровые символы в строках заменяются пробелом, строки переводятся в нижний регистр, а пробелы с начала и конца обрезаются. Так например "Мэнэ!" -> «Мэнэ» -> «Мэнэ» -> «Мэнэ»
2) При использовании force_ascii=True, full_process=True
Это делает то же самое, что и 2), но заранее удаляет все символы, отличные от ascii. Так например "Мэнэ!" -> "Мне!" -> «Мне» -> «Мне» -> «Мне»
Я действительно не думаю, что это хорошо, что force_ascii
по умолчанию имеет значение true, так как лично я не очень хочу такого поведения в 99% случаев, но большинство людей, использующих fuzzywuzzy, даже не подозревают об этом поведении. Помимо этого, похоже, есть ошибка, так как, например,
> utils.full_process("ā", force_ascii=True)
'ā'
в то время как это явно не символ ascii и поэтому должен возвращать пустую строку.
В вашем случае, когда вы хотите, чтобы он учитывал любую разницу между двумя строками, вы должны позвонить
> fuzz.WRatio('Māne', 'mane', full_process=False)
50
> fuzz.WRatio('Māne', 'Mane', full_process=False)
75