Алгоритм сопоставления «шумных» имен - PullRequest
10 голосов
/ 02 августа 2010

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

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

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

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 03 августа 2010

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

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

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

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

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

1 голос
/ 02 августа 2010

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

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

Man Utd -> Манчестер Юнайтед

Манчестер Юнайтед ФК -> Манчестер Юнайтед

0 голосов
/ 02 августа 2010

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

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

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

0 голосов
/ 02 августа 2010

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

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

...