Статьи

Идентификация языка документа

Одной из особенностей последней версии Solr ( 3.5 ) является возможность определения языка документа во время его индексации. В сегодняшней записи мы увидим, как Apache Solr работает вместе с Apache Tika для определения языка документов.

В начале

Следует помнить, что описанная функциональность была представлена ​​в Solr 3.5.

Предположения

Мы будем использовать два поля для определения языка документа:  заголовок  и  текст . Мы хотим сохранить информацию об обнаруженном языке в  поле lang .

Структура индекса

Структура нашего индекса, конечно, упрощена и содержит только поля, необходимые для теста. Таким образом, часть определения поля в  файле schema.xml выглядит следующим образом:

<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="title" type="text_ws" indexed="true" stored="true" />
<field name="body" type="text_ws" indexed="true" stored="true" />
<field name="lang" type="string" indexed="true" stored="true" />

Все поля помечены как  сохраненные = «истина»  для простоты.

Обновление конфигурации процессора запросов

Чтобы использовать функцию идентификации языка, нам нужно настроить процессор запросов на обновление Solr. Мы будем использовать тот, который использует Apache Tika (есть вторая реализация, основанная на  http://code.google.com/p/language-detection/ ). Для настройки процесса мы добавляем в  файл solrconfig.xml следующее :

<updateRequestProcessorChain name="langid">
  <processor name="langid" class="org.apache.solr.update.processor.TikaLanguageIdentifierUpdateProcessorFactory">
    <lst name="defaults">
      <str name="langid.fl">title,body</str>
      <str name="langid.langField">lang</str>
    </lst>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

Другие параметры TikaLanguageIdentifierUpdateProcessorFactory  описаны на вики-страницах Apache Solr, доступных по следующему URL-адресу:  http://wiki.apache.org/solr/LanguageDetection .

Дополнительные библиотеки

Чтобы процессор запросов на обновление работал, нам нужны дополнительные библиотеки. Из  каталога dist из дистрибутива Apache Solr мы копируем  apache-solr-langid-3.5.0.jar  в  tikaDir  (например), который мы создаем на том же уровне, что и  каталог webapps . Затем мы добавляем следующую строку в  файл solrconfig.xml :

<lib dir="../tikaLib/" regex="apache-solr-langid-d.*.jar" />

Следующая библиотека, которая нам понадобится, — это банка Tika со всеми вкусностями (tika -app-1.0.jar ), которую мы можем скачать по следующему URL-адресу: http://tika.apache.org/ . Мы помещаем его в тот же  каталог tikaDir и затем добавляем следующую запись в  файл solrconfig.xml :

<lib dir="../tikaLib/" regex="tika-app-1.0.jar" />

Тестовые документы

Для целей тестирования я решил подготовить три документа. Первый был на английском, второй на польском и третий на немецком. Их содержание было загружено из Википедии. Они выглядят следующим образом:

tika_en.xml

<add>
<doc>
  <field name="id">1</field>
  <field name="title">Water</field>
  <field name="body">Water is a chemical substance with the chemical formula H2O. A water molecule contains one oxygen and two hydrogen atoms connected by covalent bonds. Water is a liquid at ambient conditions, but it often co-exists on Earth with its solid state, ice, and gaseous state (water vapor or steam). Water also exists in a liquid crystal state near hydrophilic surfaces.[1][2] Under nomenclature used to name chemical compounds, Dihydrogen monoxide is the scientific name for water, though it is almost never used.</field>
</doc>
</add>

tika_pl.xml

<add>
<doc>
  <field name="id">2</field>
  <field name="title">Woda</field>
  <field name="body">Woda (tlenek wodoru; nazwa systematyczna IUPAC: oksydan) – związek chemiczny o wzorze H2O, występujący w warunkach standardowych w stanie ciekłym. W stanie gazowym wodę określa się mianem pary wodnej, a w stałym stanie skupienia – lodem. Słowo woda jako nazwa związku chemicznego może się odnosić do każdego stanu skupienia.</field>
</doc>
</add>

tika_de.xml

<add>
<doc>
  <field name="id">3</field>
  <field name="title">Wasser</field>
  <field name="body">Wasser (H2O) ist eine chemische Verbindung aus den Elementen Sauerstoff (O) und Wasserstoff (H). Wasser ist die einzige chemische Verbindung auf der Erde, die in der Natur in allen drei Aggregatzuständen vorkommt. Die Bezeichnung Wasser wird dabei besonders für den flüssigen Aggregatzustand verwendet. Im festen (gefrorenen) Zustand spricht man von Eis, im gasförmigen Zustand von Wasserdampf.</field>
</doc>
</add>

Больше тестирования

Для индексации данных я использовал следующие команды оболочки:

curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary @tika_pl.xml -H 'Content-type:application/xml'
curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary @tika_en.xml -H 'Content-type:application/xml'
curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary @tika_de.xml -H 'Content-type:application/xml'
curl 'http://localhost:8983/solr/update?update.chain=langid' --data-binary '<commit/>' -H 'Content-type:application/xml'

Стоит отметить дополнительный параметр update.chain = langid,  добавленный в запрос. Этот параметр используется для указания Solr, какой процессор обновлений использовать при индексации данных. В примере мы сказали Solr, что он должен использовать наш определенный процессор обновлений.

Индексированные данные

Итак, давайте посмотрим на индексированные данные. Мы сделаем это, выполнив следующий запрос: q = *: * & indent = true .

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">0</int>
  <lst name="params">
    <str name="indent">true</str>
    <str name="q">*:*</str>
  </lst>
</lst>
<result name="response" numFound="3" start="0">
  <doc>
    <str name="body">Woda (tlenek wodoru; nazwa systematyczna IUPAC: oksydan) – związek chemiczny o wzorze H2O, występujący w warunkach standardowych w stanie ciekłym. W stanie gazowym wodę określa się mianem pary wodnej, a w stałym stanie skupienia – lodem. Słowo woda jako nazwa związku chemicznego może się odnosić do każdego stanu skupienia.</str>
    <str name="id">2</str>
    <str name="lang">pl</str>
    <str name="title">Woda</str>
  </doc>
  <doc>
    <str name="body">Water is a chemical substance with the chemical formula H2O. A water molecule contains one oxygen and two hydrogen atoms connected by covalent bonds. Water is a liquid at ambient conditions, but it often co-exists on Earth with its solid state, ice, and gaseous state (water vapor or steam). Water also exists in a liquid crystal state near hydrophilic surfaces.[1][2] Under nomenclature used to name chemical compounds, Dihydrogen monoxide is the scientific name for water, though it is almost never used.</str>
    <str name="id">1</str>
    <str name="lang">en</str>
    <str name="title">Water</str>
  </doc>
  <doc>
    <str name="body">Wasser (H2O) ist eine chemische Verbindung aus den Elementen Sauerstoff (O) und Wasserstoff (H). Wasser ist die einzige chemische Verbindung auf der Erde, die in der Natur in allen drei Aggregatzuständen vorkommt. Die Bezeichnung Wasser wird dabei besonders für den flüssigen Aggregatzustand verwendet. Im festen (gefrorenen) Zustand spricht man von Eis, im gasförmigen Zustand von Wasserdampf.</str>
    <str name="id">3</str>
    <str name="lang">de</str>
    <str name="title">Wasser</str>
  </doc>
</result>
</response>

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

Подводить итоги

Следует помнить, что функция идентификации языка не идеальна и может ошибаться. Также помните, что чем дольше документы, тем лучше функционал будет работать. Конечно, проблема в том, что мы не можем использовать идентификацию языка во время запроса, но это не только проблема с Solr и Tika. Вы можете справиться с этим, указав своего пользователя, его веб-браузер или место, в котором он находится.

Источник:  http://solr.pl/en/2012/01/23/document-language-identification/