5 May 2015

Извлечение упоминаний сущностей и поиск в Textocat API

Textocat corporate blogSearch enginesSemanticsData MiningAPI
Textocat API — это облачный SaaS анализа текстов. Качественное извлечение полезной информации из текстов — сложная задача и требует серьезной экспертизы. Миссия команды Textocat — сделать процесс обработки текстов настолько легким для использования, чтобы его мог включить в свой арсенал любой современный разработчик. Используя Textocat API, вы можете быстро прототипировать приложения на основе текстовой аналитики и превращать их в свой бизнес. В данной публикации мы покажем, насколько легко интегрировать в любое приложение возможности Textocat API по распознаванию упоминаний сущностей (объектов) и поиску документов на русском языке.

Возможности Textocat API Beta


В начале апреля мы запустили бета-тестирование Textocat API. В этой версии мы предлагаем разработчикам бесплатно использовать часть функционала сервиса со следующими возможностями:
  • распознавание упоминаний сущностей (entity recognition) в коллекциях документов на русском языке;
  • хранение обработанных коллекций;
  • полнотекстовый поиск с учетом выделенных типов сущностей.


пример распознавания упоминаний сущностей


Распознавание упоминаний сущностей

Задача распознавания упоминаний сущностей, в том числе именованных сущностей (named entity recognition, NER), состоит в том, что бы выделить и классифицировать определенные фрагменты текста на заранее известные типы. Например, текущая версия Textocat поддерживает семь типов:
  • PERSON (люди),
  • ORGANIZATION (организации),
  • GPE (геополитические сущности),
  • LOCATION (географические объекты),
  • FACILITY (объекты инфраструктуры),
  • TIME (временные единицы)
  • и MONEY (денежные единицы).


Почему качественное решение этой задачи сложно? Ведь можно просто взять словари, методы из университетского курса по теории алгоритмов и получить такой же результат? Дело в том, что естественный язык, в особенности русский, богат различными нюансами:
  1. Флективность: для аккуратного сопоставления с учетом возможных форм слова и окончаний вам нужен хороший морфологический анализатор.
  2. Лексическая многозначность: как отличить упоминания банка «Россия» (ORGANIZATION) и России как страны (GPE)?
  3. Многозначность имени: как отличить упоминания Сергея Иванова, руководителя Администрации Президента Российской Федерации, от упоминаний его полного тезки — председателя государственного комитета Республики Татарстан по туризму?

В ядре нашего подхода на основе машинного обучения — собственные технологии сбора данных для аннотирования от асессоров по принципу краудсорсинга и собственные разработки по улучшению актуальных методов применения вероятностных графических моделей для этих задач. Аккуратность такого решения будет на порядок выше прямолинейного подхода на основе ключевых слов. Кроме того, все реализованные технологии Textocat масштабируются по числу машин без переписывания исходного кода.

Ознакомиться с тем, как работает технология Textocat для этой задачи на разных текстах, даже не начав программировать, можно на странице нашего интерактивного демо. Отметим, что текущие результаты — это далеко не предел возможностей, и качество распознавания будет значительно улучшено уже в ближайшее время. Сейчас технология показывает свои наилучшие результаты на новостных текстах.

Выгрузка документов и поиск

После обработки документы становятся доступны для выгрузки (и только клиенту с данным токеном авторизации). Textocat API также позволяет пользователю искать среди всех загруженных документов, поддерживая полнотекстовые запросы по ключевым словам (например, «тинькофф банк»). Кроме того, Textocat API предоставляет расширенный синтаксис запросов, накладывающих ограничение на тип аннотации, в которых должны встречаться ключевые слова. Например, запрос «ORGANIZATION: форд» дает возможность искать документы, в которых ключевое слово «форд» упоминается в контексте организации («Форд Моторс»), отделяя упоминания имени известного американского промышленника Генри Форда. В полной версии сервиса доступна функция отслеживания в документах конкретных объектов из словаря или базы знаний клиента (entity linking или named entity disambiguation).

Принципы работы с API


Textocat API — это классический RESTful API, то есть работа с сервисом производится через стандартные запросы по протоколу HTTP. JSON — пока единственный поддерживаемый формат для входных и выходных данных в Textocat API. Для удобства работы со многими документами Textocat API позволяет собирать документы в пакеты (batches) и отправлять их на обработку. В принципе, это позволяет разбить большую коллекцию на пакеты и отправлять их на обработку параллельно (premium feature). Время обработки пакетов зависит от их размеров и текущей нагрузки, создаваемой всеми пользователями. Поэтому на клиента возложена необходимость периодически проверять статус пакета, отправляя соответствующий запрос. Как только пакет документов будет обработан, он сохраняется в системе в структурированном виде и будет храниться в течение всего периода подписки клиента. С этого момента клиент имеет возможность выгрузить обработанные документы. Textocat API позволяет фильтровать и сортировать выдаваемые документы через описанные средства поиска.

Получить ключ к API


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

Онлайн-документация


Интерактивная онлайн-документация Textocat API позволяет познакомиться с основными командами и параметрами для вызова функционала сервиса. Далее опишем цикл обработки простого пакета, состоящего из одного тестового документа, который можно повторить прямо в онлайн-документации.
Пошаговая инструкция использования онлайн-документации
  1. Открываем страницу онлайн-документации Textocat API. Для начала работы с ней необходимо вставить токен авторизации в соответствующее поле (auth_token).
  2. Начинаем с функции отправки пакета для выделения упоминаний сущностей. Кликаем на ссылку /entity/queue.

  3. В раскрывшейся форме необходимо заполнить поле body — массив документов для добавления в формате JSON. Проще всего это сделать кликнув на пример JSON справа под надписью «Model Schema» и заполнив поле text в JSON текстом тестового документа. Кликнув рядом на ссылку «Model», вы получите описание основных полей документа, обрабатываемых Textocat API.

  4. Нажимаем кнопку отправки запроса «Try it out». В случае успешной обработки запроса, форма выводит сообщение с кодом HTTP-статуса 202 и сгенерированный идентификатор для обрабатываемого пакета (см. поле «batchId» в ответном JSON). Этот идентификатор необходимо запомнить. В случае ошибки необходимо сопоставить код ошибки (например, 406) с описанием из таблицы «Response Messages» и устранить проблемы в запросе.
  5. Проверяем статус отправленного пакета (/entity/request), введя в поле batch_id идентификатор пакета, который мы запомнили на предыдущем шаге. Сервис возвратит код 200 и ответ FINISHED в поле «status», если все документы из пакета обработаны и готовы к выгрузке, или IN_PROGRESS, если пакет все еще анализируется.

  6. Если пакет обработан, мы можем перейти к его выгрузке (/entity/retrieve), указав тот же идентификатор пакета в поле batch_id и отправляем запрос. Для поиска по всем документам пользователя (/entity/search) заполняется поле search_query в синтаксисе поисковых запросов Textocat.

  7. В обоих случаях в качестве ответа сервис вернет JSON в рамках модели, состоящей из метаданных пакета, документа и выделенных сущностей. Подробное описание полей в ответе можно получить кликнув по ссылке «Model» под надписью «Response Class».



Работа с Textocat API в командной строке


Покажем, как можно работать с нашим сервисом прямо из командной строки с помощью curl, стандартной утилиты под Unix.
Инструкция для вызова Textocat API из командной строки
  1. Подготовим тестовый документ example.json с простым пакетом, состоящим из трех небольших документов:
    [
      {
        "text": "Председатель совета директоров ОАО «МДМ Банк» Олег Вьюгин — о том, чему приведет обмен санкциями между Россией и Западом в следующем году. Беседовала Светлана Сухова.",
        "tag": "doc1"
      },
    {
    "text": "Не перепутает Генри Форда и компанию «Форд» в документах",
    "tag": "doc2"
    },
    {
    "text": "Штаб-квартира компании Форд Моторс располагается в городе Дирборн.",
    "tag": "doc3"
    }
    ]
    

  2. Отправим текст Textocat API для распознавания упоминания сущностей, выполнив команду в консоли:
    curl -X POST http://api.textocat.com/entity/queue?auth_token=<YOUR_AUTH_TOKEN> -H "Content-Type: application/json" --data @example.json
    

    В ответ должны получить подобный ответ, содержащий идентификатор данного пакета batchId:
    {
      "batchId": "931da87a-fe98-4639-8cf6-570b5a3fc347",
      "status": "IN_PROGRESS"
    }
    

  3. Проверим статус пакета, передав batchId в качестве параметра:
    curl http://api.textocat.com/entity/request?auth_token=<YOUR_AUTH_TOKEN>&batch_id=931da87a-fe98-4639-8cf6-570b5a3fc347
    

    Так как пакет очень маленький и должен обработаться мгновенно, в этот раз ответ сервера будет:
    {
      "batchId": "931da87a-fe98-4639-8cf6-570b5a3fc347",
      "status": "FINISHED"
    }
    

    Значит, пакет готов для выгрузки или поиска.
  4. Выполним поиск по загруженным документом нашего пользователя, передавая параметр поискового запроса search_query со значением «ORGANIZATION: форд»:
    curl -G --data-urlencode 'search_query=ORGANIZATION:форд' --data 'auth_token=<YOUR_AUTH_TOKEN>' http://api.textocat.com/entity/search
    

    От сервера придет следующий ответ:
    {
      "searchQuery": "ORGANIZATION:форд",
      "documents": [{
        "status": "SUCCESS",
        "tag": "doc2",
        "entities": [{
          "span": "Генри Форда",
          "category": "PERSON",
          "beginOffset": 14,
          "endOffset": 25
        }, {
          "span": "компанию «Форд»",
          "category": "ORGANIZATION",
          "beginOffset": 28,
          "endOffset": 43
        }]
      }, {
        "status": "SUCCESS",
        "tag": "doc3",
        "entities": [{
          "span": "компании Форд Моторс",
          "category": "ORGANIZATION",
          "beginOffset": 14,
          "endOffset": 34
        }, {
          "span": "городе Дирборн",
          "category": "GPE",
          "beginOffset": 51,
          "endOffset": 65
        }, {
          "span": "Штаб-квартира компании Форд Моторс",
          "category": "FACILITY",
          "beginOffset": 0,
          "endOffset": 34
        }]
      }]
    }
    

    Таким образом, из обработанных пакетов Textocat API вернул только документы (см. массив documents), упоминающие слово «форд» в указанном лексическом значении, ранжируя их по релевантности.


Java SDK


Наконец, приведем пример выделения упоминаний сущностей с использованием официального Textocat Java SDK, который значительно упрощает логику работы с сервисом при реализации приложений на JVM-совместимых языках.

final EntityRecognition entityRecognition = TextocatFactory.getEntityRecognitionInstance("<AUTH_TOKEN>");
final FutureCallback<AnnotatedBatch> outputCallback = // a callback for dealing with annotated documents ...
        FutureCallback<BatchMetadata> inputCallback = new FutureCallback<BatchMetadata>() {
            public void onSuccess(BatchMetadata batchMetadata) {
               entityRecognition.retrieve(outputCallback, batchMetadata);
            }
            public void onFailure(Throwable throwable) {}
        };
entityRecognition.submit(new Batch(documents), inputCallback);


EntityRecognition — это основной интерфейс обращения к функционалу распознавания упоминаний сущностей в Textocat API. Все вызовы асинхронны, поэтому клиентский код обработчиков ответов к EntityRecognition необходимо оборачивать в FutureCallback из библиотеки Google Guava. В примере отправляется пакет документов (entityRecognition.submit) и выгружаются документы с готовыми аннотациями упоминаний сущностей (entityRecognition.retrieve). Вместо последнего можно было бы использовать метод entityRecognition.search для поиска по всем загруженным документам пользователя.

Приложения


Указанные возможности Textocat API могут использоваться в разных сферах бизнес-аналитики. Примеры некоторых интересных приложений вы можете найти среди проектов хакатона Text Analytics HackDay, который мы проводили в Казани в партнерстве с Казанским федеральным университетом. Отдельно остановимся на следующих двух кейсах.

Поиск в корпоративном документообороте

Современные BI-платформы предоставляют функции поиска по таким внутренним ресурсам компании, как системы документооборота, файловые хранилища, CRM, ERP, базы знаний в отделах технической поддержки, call-центрах, корпоративных почтах и форумах. Textocat API извлекает из текста значения величин, объекты, местоположения и временные единицы. Результаты выдаются в структурированном формате, удобном для загрузки в любое современное хранилище. Кроме того, мы предоставляем возможности полнотекстового поиска с учетом извлеченной семантики. Учет категорий имен и ключевых слов позволяет выполнять точное и качественное ранжирование результатов поиска. Попутно решается ряд низкоуровневых задач, с которыми часто сталкиваются разработчики собственных поисковых решений для русского языка, применяющие средства известных open source библиотек поиска (например, Apache Solr или Elastic Search) — это качественные токенизация, разбиение на предложения, лемматизация и т.п.

Инструмент для маркетинга

В бизнесе часто возникает потребность в анализе внешних источников и сбора фактов, мнений, отзывов о компании, продуктах, конкурентах, контрагентах, партнерах, объектах поглощения, отдельных персонах и т.п. Это позволяет принимать своевременные решения в маркетинге и корректировать планы продаж. Источниками текстов могут выступать официальные пресс-релизы, новости, сообщения в социальных сетях, отзывы и комментарии на сайтах. Данные об искомых объектах (например, названия и адреса сайтов) могут загружаться из CRM или внешних баз данных (например, реестр ФНС России). Используя возможности Textocat API, разработчики могут создавать сервисы, позволяющие получать полную картину (360-degree view) упоминаний интересующего объекта.

Анонс


В ближайших публикациях мы:
  1. приведем подробный обзор основных кейсов и историй успеха применения текстовой аналитики на рынках США, Европы и России;
  2. представим TextoKit — наш стек базовых функций обработки текста на русском языке, реализованный для платформы Apache UIMA и который мы открываем с исходным кодом под свободной лицензией для сообщества разработчиков.

Подпишитесь на наш блог и расскажите коллегам. Будет интересно!
Tags:анализ текстаинформационный поискизвлечение информации
Hubs: Textocat corporate blog Search engines Semantics Data Mining API
+22
15.7k 123
Comments 66