Named Entity Recognition for Dummies

среда, 8 июня 2011, Александр Краковецкий

Введение

Named Entity Recognition (извлечение сущностей) – это одна из задач text mining, суть которой состоит в автоматическом определении сущностей в неструктурированных тестовых данных.

Классическими сущностями выступают имена людей и компаний (names), адреса (locations), географические объекты (locations), даты (dates) и, в более сложных случаях, связи между ними, а также события, причинно-следственные связи, хронометраж событий. Также можно добавить к этому списку такие сущности, как электронные адреса, телефоны, определенные типы данных (например, IP адреса).

В наше время Named Entity Recognition все больше находит применение в различных сферах бизнеса – начиная от маркетинговых исследований, заканчивая высокоинтеллектуальными полуавтоматическими и автоматическими системами принятия решений.

Рассмотрим на примере основную задачу Named Entity Recognition – извлечение сущностей. Пусть у нас есть некий текст:

President Obama will be present on the event in New York at 25th of September.

Из этого текста можно выделить ряд сущностей (отобразим их с помощью специальных тэгов):

President [Name: Obama] will be present on the event in [Location: New York] at [Date: 25th of September].

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

На самом деле, что-то похожее решает полнотекстовый поиск и тут вполне будет резонным вопрос, зачем примерять Named Entity Recognition?

Одной из задач NER является также распознавание «скрытых» сущностей. Например, в рассмотренном случае необходимо также добавить ассоциацию «President» и «Obama» и дальше по тексту рассматривать эти две сущности как одно целое. Это уже более сложная задача.

Где и когда можно применять Named Entity Recognition?

Первое очевидное применение – маркетинговые исследования неких кампаний или брендов. Суть таких исследований в том, чтобы получить информацию об отзывах о неком бренде или компании из различных источников (социальных сетей, блогов, комментариях на сайте, сайтах партнеров и т.д.) автоматическим способом с целью оценить эффективность кампании и удовлетворенность пользователей. Для этого нет необходимости заказывать исследования у независимых компаниях, а достаточно использовать системы, построенные с использованием подходов Named Entity Recognition.

Еще одно возможное применение NER – автоматическое тегирование специфических текстов, например, электронных писем, отзывов пользователей, запросов в службу поддержки, RSS лент т.д. Например, вы можете построить информационную систему, которая будет обрабатывать отзывы пользователей о вашем продукте, определять степень удовлетворенности тем или другим продуктом, и автоматически посылать вам отчет, если процент негатива преодолеет некий критический порог. Это один из возможных сценариев. Если вы – хостинг компания, одна из задач которой – оперативно отвечать на все тикеты пользователей, то хорошим способом добиться лояльности клиентов и уменьшить нагрузку на операторов можно с помощью предварительного анализа писем и выявления шаблонных проблем, на который можно дать предварительный ответ вообще без участия человека. И лишь сложные и нестандартные случаи перенаправлять в ваш отдел поддержки.

Вы хотите оценить, какие статьи пользуются у вас большим интересом у читателей? Уменьшить список тем можно с помощью определения ключевых слов и подсчета статистики их вхождения в наиболее читаемые / комментируемые статьи.

Как работает NER?

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

Есть несколько типов NER: первый тип алгоритмов основаны на использовании словарей – набора сущностей, которые ищутся в исходном тексте. Другой тип NER – лексический и грамматический разбор предложений с целью «угадать» с некоторой долей вероятности, какие из словосочетаний и слов могут быть сущностью.

Алгоритмы «угадывают» эти сущности, имея в памяти некоторые правила, по которым эти сущности ищутся. Эти правила могут иметь различных характер – от созданной вручную «базы знаний» до морфологических особенностей конкретного языка.

Как правило, для создания высокоэффективной NER системы необходимо ее предварительно «научить» на эталонных (подготовленных) данных. Чем большее количество, а также полнота данных – тем выше будет точность (процент угадывания сущностей) системы.

Какие системы доступны?

На данный момент есть несколько систем (некоторые даже с открытым исходным кодом), среди них:

  • Иллинойс – разработка Иллинойского университета с открытым исходным кодом, написанная на Java.
  • Стэнфорд – разработка Стэндфордского университета с открытым исходным кодом, написанная на Java.
  • OpenCalais – система компании Reuters, которая предоставляет свой NER API для всех желающих. Ознакомиться с системой можно по адресу http://viewer.opencalais.com/.
  • DbPedia – это семантическая версия википедии, которая позволяет получать информацию о сущностях в формате RDF. Недавно анонсированный сервис позволяет решать задачи NER. Эта разработка свободно доступна по адресу http://spotlight.dbpedia.org/ или через веб-сервисы.

Избавьте своих авторов от скучного добавления тэгов

Как известно, написать текст для публикации – это ползадачи. Потом его необходимо отформатировать для публикации на сайте, заполнить мета информацию (многие современные CMS уже научились это делать автоматически), а также проставить метки (тэги). Без первого никак не обойтись, а вот выполнение последней задачи можно поручить NER.

На нашем сайте в качестве теста использовалось автоматическое тегирование текстов – чтобы авторам не было необходимости заполнять их вручную. Исторически сложилось, что в русскоязычных технических текстах главные сущности – это англоязычные термины, например TDD, Visual Studio, Google, OOP и т.д. Чаще всего эти термины требуют дополнительного объяснения (для этого пользователи копируют необходимые термины и идут на википедию за разъяснениями).

Как это реализовано? Алгоритм очень простой: основной текст веб-страницы автоматически очищается от HTML тэгов и стоп-слов и результирующий текст анализируется с помощью NER. Результирующий размеченный текст разбирается с помощью библиотеки Data Extracting SDK, а полученные сущности отображались в конце статьи.

Пример кода:

    public static string GetTaggedHtmlString(string text)
    {        
        StringBuilder sb = new StringBuilder();
        try
        {
            string str = Regex.Replace(text, "<.*?>", string.Empty).Replace("\r\n", null).Replace("#", " Sharp");
            Encoding srcEncodingFormat = Encoding.ASCII;
            Encoding dstEncodingFormat = Encoding.UTF8;
            byte[] originalByteString = srcEncodingFormat.GetBytes(str);
            byte[] convertedByteString = Encoding.Convert(srcEncodingFormat, dstEncodingFormat, originalByteString);
            string finalString = dstEncodingFormat.GetString(convertedByteString).Replace("?", null);

            WebClient client = new WebClient();
            var html = client.DownloadString(
                    string.Format("http://spotlight.dbpedia.org/rest/annotate?text={0}&confidence=0.1&support=10", finalString));
            var matches = Regex.Matches(html, "(<a(.*?)</a>)");

            var links = new List<string>();

            foreach (Match link in matches)
            {
                links.Add(link.Groups[1].Value);
            }

            links = links.Distinct().ToList();

            for (int i = 0; i < links.Count(); i++)
            {
                sb.Append((i == links.Count() - 1) ? links[i] : links[i] + " | ");
            }
        }
        catch (Exception ex)
        {
            sb.Append("no tags");
        }
     return sb.ToString();
}

Современные проблемы NER

  1. Готовые NER системы разработаны для ограниченного числа языков, в их число не входит русский и украинский языки (по крайней мере информации о них в открытых источниках нет).
  2. Чем сложнее язык с грамматической и морфологической точки зрения, тем сложнее создать высокоэффективную NER систему.
  3. Необходимость обучения.

Если интересно, можно будет продолжить эту тему.


Ищите нас в интернетах!

Комментарии

Свежие вакансии