Как искать имя человека в тексте? (Эвристический) - PullRequest
4 голосов
/ 04 декабря 2008

У меня есть огромный список полных имен людей, которые я должен искать в огромном тексте .

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

Пример:

У меня есть "Барак Хусейн Обама" в моем списке, поэтому я должен проверить наличие этого имени в следующих текстах:

  • ... Кандидат Барак Обама был избран президентом США ... (не полностью)
  • ... Кандидат Барак Хуссейн был избран президентом США ... (не полностью)
  • ... Кандидат Барак Х. О. был избран президентом Соединенных Штатов ... (сокращенно)
  • ... Кандидат Барак Оба был избран президентом США ... (с ошибкой)
  • ... Кандидат Барак ОВама был избран президентом Соединенных Штатов ... (неправильно введено, B рядом с V)
  • ... Кандидат Джон Маккейн проиграл выборы ... (без имени Обамы)

Конечно, для этого нет детерминированного решения, но ...

Что такое хорошая эвристика для такого поиска?

Если бы вам пришлось, как бы вы это сделали?

Ответы [ 8 ]

6 голосов
/ 23 декабря 2008

Вы сказали, что это около 200 страниц.

Разделите его на 200 одностраничных PDF-файлов.

Поместите каждую страницу на Mechanical Turk вместе со списком имен. Предложите вознаграждение в размере около 5 долларов США за страницу.

5 голосов
/ 04 декабря 2008

Разделите все на пробелы, удалив специальные символы (запятые, точки и т. Д.). Затем используйте что-то вроде soundex для обработки орфографических ошибок. Или вы можете использовать что-то вроде lucene , если вам нужно найти много документов.

2 голосов
/ 20 декабря 2008

Что вам нужно, так это библиотека обработки естественного языка. Вы пытаетесь определить подмножество имен собственных. Если имена являются основным источником имен собственных, то будет легко, если в них будет смешано большое количество других имен собственных, чем будет сложнее. Если вы пишете в JAVA, посмотрите OpenNLP или C # SharpNLP. После извлечения всех имен существительных вы, вероятно, можете использовать Wordnet для удаления большинства имен, не являющихся именами. Возможно, вы сможете использовать wordnet для определения частей имен, таких как «Джон», а затем искать соседние токены, чтобы подсосать другие части имени. У вас будут проблемы с чем-то вроде «John Smith Industries». Вам придется взглянуть на свои базовые данные, чтобы узнать, есть ли функции, которые вы можете использовать, чтобы помочь сузить проблему.

Использование решения НЛП - единственная реальная надежная техника, которую я видел для подобных проблем. У вас все еще могут быть проблемы, так как 200 страниц на самом деле довольно маленькие. В идеале у вас было бы больше текста и вы могли бы использовать больше статистических методов, чтобы помочь устранить неоднозначность между именами и именами.

1 голос
/ 24 декабря 2008

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

1 голос
/ 04 декабря 2008

На первый взгляд, я собираюсь на сервер индексирования. lucene, FAST или Microsoft Indexing Server.

0 голосов
/ 04 декабря 2008

старые скрипты регулярных выражений сделают эту работу.

используйте Ruby, это довольно быстро. читать строки и сопоставлять слова.

ура

0 голосов
/ 04 декабря 2008

Оба SQL Server и Oracle имеют встроенные функции SOUNDEX.

Кроме того, для SQL Server имеется встроенная функция DIFFERENCE, которую можно использовать.

0 голосов
/ 04 декабря 2008

Лучший способ, которым я могу придумать, - это определить грамматику в python NLTK . Однако это может быть довольно сложно для того, что вы хотите.

Я бы лично использовал регулярные выражения при создании списка перестановок с некоторым программированием.

...