#java #strin&-matchin& #fuzzywuzzy
#java #сопоставление строк #fuzzywuzzy
Вопрос:
Я запускаю алгоритм fuzzywuzzy для сравнения двух больших наборов строк друг с другом.
Строки представляют собой названия компаний из двух разных источников данных, и я нахожу это уникальным в том смысле, что есть много совпадений, которые выглядят интуитивно понятными, но не обнаруживаются.
Я получаю много отличных совпадений для оценок выше 90, но при более низких пороговых значениях много пропущенных данных. Однако установка слишком низкого порога приводит к большому количеству мусора. Например:
FuzzySearch.extractTop(tar&etName, sourceName, 3, 10)
Источник
"Coca-Cola", "Coca Cola - Other", "Coca-Cola Amatil", "Coca-Cola Company", "Coca-Cola Icecek", "Coca-Cola Services", "CocaCola Amatil", "Cola-Cola", "Colanta"
Список целей
"the coca-cola co.", "other"
Выдает следующие лучшие соответствия:
"the coca-cola co.":
Coca-Cola, score: 90
Coca Cola - Other, score: 86
Cola-Cola, score: 86
Coca-Cola Company, score: 73
Coca-Cola Icecek, score: 71
Coca-Cola Amatil, score: 68
Coca-Cola Services, score: 68
Colanta, score: 61
CocaCola Amatil, score: 58
"other":
Coca Cola - Other, score: 90
Coca-Cola Services, score: 36
Colanta, score: 33
CocaCola Amatil, score: 20
Coca-Cola Icecek, score: 19
Coca-Cola Amatil, score: 19
Cola-Cola, score: 18
Coca-Cola Company, score: 18
Coca-Cola, score: 18
В первом запуске я хотел бы надеяться, что словам и coca-cola будет придано большее значение, чтобы что-то вроде Coca-cola services получило более высокий балл «the coca-cola co.», чем 68, на котором оно находится. Кроме того, «Coca-cola — Other» больше соответствовало «Other» (90 баллов), чем «The Coca-cola co.» (86 баллов).
Могу ли я внести какие-либо изменения в нечеткий алгоритм или очистить свои данные перед его запуском? Или, может быть, есть другой алгоритм сопоставления строк, лучше подходящий для этого типа данных?
Комментарии:
1. Может быть полезно удалить специальные символы, если алгоритм их не игнорирует. Иногда лучше смешать слова вместе, но я не знаком с fuzzywuzzy, поэтому это может не помочь (или нанести активный ущерб).
2. Если вы не учитываете чувствительность к регистру, возможно, мне было бы неплохо использовать одну чувствительность к регистру при вызове алгоритма — например, все к верхнему или нижнему. Это может быть полезно, поскольку алгоритм может давать разные результаты для одних и тех же символов без учета регистра.
3. Какое использование вы используете в настоящее время? Простое соотношение, частичное соотношение …? Что-то более индивидуальное? Существует несколько различных базовых способов использования — смотрите Примеры здесь .
4. В проекте Apache Commons-Text есть другие алгоритмы подобия и расстояния, если вы хотите изучить другие подходы.
5. @IcedDante — извинения — это было всегда (взвешенное соотношение). Лучшее, что мне удавалось в прошлом, это (а) убрать знаки препинания, затем (б) преобразовать в ascii (убрать диакритические знаки), а затем (в) преобразовать в нижний регистр. Затем я использовал (коммерческий) инструмент, который реализовал первый проход Levenshtein, за которым последовал второй проход fuzzy matcher. Даже тогда были ложные срабатывания и негативы, с которыми нужно было обращаться вручную. К счастью, объем был невелик.