Алгоритм сопоставления имен "шумных"

У меня есть приложение, которое сбрасывает результаты футбола из разных источников в Интернете. Имена команд несовместимы на разных сайтах - например, "Манчестер Юнайтед" можно назвать "Манчестер Юнайтед" на одном сайте, "Манчестер Юнайтед" - на втором, "Манчестер Юнайтед" - на третьем. Мне нужно сопоставить все возможные выводы с одним именем ( "Манчестер Юнайтед" ) и повторить процесс для каждой из 20 команд в лиге ( "Арсенал", "Ливерпуль", "Ман Сити" и т.д.). Очевидно, что мне не нужны плохие матчи [например, "Man City" сопоставляется с "Манчестер Юнайтед" ).

Прямо сейчас я задаю регулярные выражения для всех возможных комбинаций - например, "Манчестер Юнайтед" будет "человек (честер)" (u | (utd) | (объединенный)) (fc)? '; это хорошо для нескольких сайтов, но становится все более громоздким. Я ищу решение, которое позволит избежать необходимости указывать эти регулярные выражения. Например, должен быть способ "забить" Манчестер Юнайтед, поэтому он получает высокий балл против "Манчестер Юнайтед" , но низкий/нулевой балл против "Ливерпуля" [например]; Я бы тестировал образец текста на все возможные решения и выбирал тот, у которого был самый высокий балл.

Я считаю, что решение может быть похоже на классический пример обучения нейронной сети распознавания рукописного текста (т.е. существует фиксированный набор возможных результатов и степень шума в входных выборках)

У кого-нибудь есть идеи?

Спасибо.

Ответ 1

Вы можете использовать некоторую метрику подобия для задействованных строк и порог ручной настройки. В качестве альтернативы порог также может быть обучен некоторым методом машинного обучения. Какая конкретная метрика сходства работает лучше всего зависит от типа строк, которые вы хотите сопоставить. Вам также может потребоваться предварительно обработать строки, прежде чем применять к ним метрику (например, удалить символы шума, такие как пробелы и т.д., Нормализовать капитализацию, разрешить общие ранее известные сокращения,...)

Для довольно полного обзора различных показателей сходства строк и библиотеки Java см. http://www.dcs.shef.ac.uk/~sam/stringmetrics.html

Ответ 2

Кажется, что вы экранируете одни и те же источники.

Предполагая, что ваши источники согласованы с именами команд, преобразование строк будет наиболее эффективным решением.

Манчестер Юнайтед → Манчестер Юнайтед

Манчестер Юнайтед → Манчестер Юнайтед

Ответ 3

Я решил эту точную проблему в Python, но без каких-либо сложных AI. У меня есть текстовый файл, который отображает различные варианты в каноническую форму имени. Существует не так много вариантов, и как только вы перечислили их все, они редко будут меняться.

Мой файл выглядит примерно так:

man city=Manchester City
man united=Manchester United
man utd=Manchester United
manchester c=Manchester City
manchester utd=Manchester United

Я загружаю эти псевдонимы в объект словаря, а затем, когда у меня есть имя для сопоставления, я конвертирую его в нижний регистр (чтобы избежать каких-либо проблем с различной капитализацией), а затем искать его в словаре.

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

Ответ 4

Возможно, вам также понадобится провести структурный анализ текста. Парсинг-парсер может намекнуть, какие слова используются в качестве правильных существительных, давая вам дополнительные подсказки, что "mn au" был "Человек U", набираемый кем-то с дислексическими пальцами в спешке, - что-то не регулярное выражение не собирается выяснить.

Возможность "тренировать" программное обеспечение, вероятно, тоже лучше - добавление определенных описаний, как вы их находите.

Анализ естественного языка - это сложно! Удачи!