Идентификация объекта в статье

Я работаю с Python над задачей, связанной с наукой о данных. Что мне нужно сделать, так это: я извлек несколько новостных статей, и теперь я хочу выборочно выбрать только те новостные статьи, принадлежащие конкретному человеку, и определить, является ли человек, упомянутый в статье, тем же человеком, который меня интересует.

Допустим, человека можно идентифицировать либо по его имени, либо по определенным атрибутам, которые характеризуют этого человека, например, человек с именем «Х» является политическим деятелем. Когда статья об этом человеке публикуется, мы «знаем», что она относится к этому человеку, только читая контекст статьи. Под «контекстом» я подразумеваю, содержит ли статья что-либо (или их комбинацию):

  • Имя этого человека
  • Название его политической партии
  • Имена других людей, тесно связанных с ним, упомянутых в статье
  • Другие атрибуты, которые описывают этого человека

Поскольку имена распространены, я хочу определить, какова вероятность (насколько велика вероятность) того, что в данной статье говорится только об этом человеке «X», а не о каком-либо другом человеке с таким же именем, как «X».


person Ashutosh Upadhyay    schedule 21.10.2015    source источник
comment
Вы смотрели на это: nltk.org/book/ch07.html# распознавание именованных объектов   -  person reynoldsnlp    schedule 21.10.2015
comment
@bebop, это не решит мою проблему, так как я не пытаюсь идентифицировать все текстовые упоминания названных объектов. Я хочу определить вероятность того, что человек X, упомянутый в данной статье, является тем же человеком, которого я ищу.   -  person Ashutosh Upadhyay    schedule 21.10.2015
comment
Я могу придумать решение, включающее контролируемое обучение, то есть классификацию между «Это парень» и «Это не парень». Сколько статей у вас есть с именем человека? Все они об этом человеке или это статьи о других людях с таким же именем?   -  person HugoMailhot    schedule 22.10.2015
comment
@HugoMailhot, я считаю, что вы в какой-то степени указываете правильное направление. Допустим, у меня есть большое количество статей, и, конечно, все они не об этом человеке «Х». Предположим, что «X» — очень распространенное имя, поэтому есть вероятность, что есть статьи о других людях с таким же именем. Спасибо.   -  person Ashutosh Upadhyay    schedule 22.10.2015
comment
Ха-ха-ха, это начинает звучать как вопрос для интервью! Я немного подумаю и расскажу, что у меня получилось. Я думаю, что это очень интересный вызов. С точки зрения mt, самое мощное решение потребует обучающей выборки, в которой люди вручную отмечают, действительно ли каждая статья посвящена конкретному человеку. Менее трудоемким решением было бы объединение статей в кластеры без их маркировки, затем анализ кластеров и маркировка кластеров вместо отдельных статей. Это требует меньше усилий, только если у вас МНОГО статей, так как процесс более сложный.   -  person HugoMailhot    schedule 22.10.2015
comment
@HugoMailhot, похоже, то, что вы предлагаете, на самом деле является классификацией (с использованием классификатора)?   -  person Ashutosh Upadhyay    schedule 23.10.2015


Ответы (2)


Хорошо, так что это мой лучший выстрел.

Исходные предположения

Во-первых, мы предполагаем, что у вас есть статьи, которые уже содержат упоминания людей, и эти упоминания являются либо a) упоминаниями конкретного человека, которого вы ищете, либо b) упоминаниями другие люди, носящие то же имя.

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

Общее решение: классификация текста

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

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

Какие функции использовать

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

Два примера, если предположить, что мы ищем статьи о Джастине Трюдо, недавно избранном канадском премьер-министре, а не о ком-то еще, кого также зовут Джастин Трюдо.

A) Выбор функций самостоятельно

Проведя небольшое исследование, вы узнаете, что Джастин Трюдо возглавляет Либеральную партию Канады, поэтому неплохо было бы проверить, содержит ли статья следующие строки:

Либеральная партия Канады, Либеральная партия Канады, LPC, PLC, либералы, Либеро, Жан Кретьен, Поль Мартин и т. д.

Поскольку Трюдо — политик, неплохо было бы поискать вот это:

политика, политик, закон, реформа, парламент, палата общин и т. д.

Возможно, вы захотите собрать информацию о его личной жизни, близких сотрудниках, имени жены и детях и так далее, а также добавить их.

Б) Позволить алгоритму обучения сделать всю работу

Другим вариантом было бы обучить модель n-грамм, используя каждую n-грамму, которая есть в обучающем наборе (например, использовать все униграммы и биграммы). Это приводит к более сложной модели, чем может быть более надежной, а также более тяжелой для обучения и использования.

Ресурсы программного обеспечения

Что бы вы ни выбрали, если вам нужно обучить классификатор, вы должны использовать scikit-learn. Наиболее популярным выбором будет его SVM. Наивный байесовский метод — это более классический подход к классификации документов.

person HugoMailhot    schedule 23.10.2015
comment
Хорошее решение! На самом деле, scikit-learn — очень удобное программное обеспечение, которое, несомненно, добавит часть машинного обучения. Что касается особенностей, обычно подходы сравнивают контекст упоминания (предложение, абзац, статья) с текстами, описывающими ссылки (например, статьи из Википедии). - person eldams; 24.10.2015
comment
@HugoMailhot, я думаю, ты попал в самую точку. IMO сочетание обоих ваших подходов (A) и (B) выше для построения функций должно давать более точные результаты, то есть набор подобранных вручную слов (например, путем исследования этого объекта в Википедии), смешанный с n-граммами. Я должен попытаться увидеть, что работает лучше всего, но в целом это, кажется, указывает в правильном направлении. Есть ли у вас какая-либо конкретная причина рекомендовать scikit-learn вместо NLTK? - person Ashutosh Upadhyay; 26.10.2015
comment
Кроме того, я хотел получить оценку, поэтому я считаю, что показатель точности, который я получаю в классификаторе, например, «nltk.classify.util.accuracy», может дать мне оценку точности? Спасибо! - person Ashutosh Upadhyay; 26.10.2015
comment
@AshutoshUpadhyay scikit-learn широко используется, хорошо оптимизирован и активно развивается, а знание того, как с ним играть, откроет другие возможности для приложений машинного обучения. На самом деле вы, вероятно, могли бы сделать это только с помощью NLTK, но я советую ознакомиться с лучшим модулем ML для Python. Что касается точности, вам придется читать документацию и проверять ее самостоятельно. Удачи! - person HugoMailhot; 26.10.2015

Эта задача обычно называется Связывание объектов. Если вы работаете с популярными сущностями, например. те, у которых есть статья в Википедии, вы можете посмотреть на DBpedia Spotlight или BabelNet, которые решают эту проблему.

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

person eldams    schedule 22.10.2015
comment
Спасибо за название проблемы! - person HugoMailhot; 23.10.2015