Способы улучшения нечеткого алгоритма?

#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. Даже тогда были ложные срабатывания и негативы, с которыми нужно было обращаться вручную. К счастью, объем был невелик.