Алгоритм для соответствия 'шумным' именам

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

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

Мой смысл состоит в том, что решение может быть аналогично классическому примеру нейронной сети, обучаемой распознать почерк [т.е. существует фиксированный набор возможных результатов и степень шума во входных образцах]

У кого-либо есть какие-либо идеи?

Спасибо.

11
задан Justin 2 August 2010 в 11:17
поделиться

4 ответа

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

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

0
ответ дан 3 December 2019 в 12:17
поделиться

Похоже, вы просматриваете те же источники.

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

«Манчестер Юнайтед» -> «Манчестер Юнайтед»

«Манчестер Юнайтед» -> «Манчестер Юнайтед»

1
ответ дан 3 December 2019 в 12:17
поделиться

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

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

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

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

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

1
ответ дан 3 December 2019 в 12:17
поделиться

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

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

Анализировать естественный язык сложно! Удачи!

0
ответ дан 3 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: