Статьи

Эффективный китайский поиск с Elasticsearch

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

Даже с английским контентом вы можете потерять уместность из-за плохой основы, пропустить некоторые документы, если не выполняете надлежащую оценку и так далее. И это еще хуже, если вы индексируете другой язык; анализаторы по умолчанию не являются универсальными.

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

логотип (6)

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

Существуют десятки тысяч китайских иероглифов, даже если на практике письменный китайский требует знания от трех до четырех тысяч. Давайте рассмотрим пример: слово «вулкан» (火山) на самом деле является комбинацией:

  • Fire: огонь
  • 山: горский

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

Другая сложность заключается в используемых вариантах написания:

  • упрощенный китайский: 书法 ;
  • традиционный китайский, более сложный и богатый: 書法 ;
  • и пиньинь, романизированная форма мандарина: шу фу .

Анализ китайского контента

На момент написания этой статьи вот решения, доступные с Elasticsearch:

Эти анализаторы очень разные, и мы сравним их эффективность с простым тестовым словом: 手机.
Это означает «Сотовый телефон» и состоит из двух логограмм, которые означают «рука» и «машина» соответственно. 机 Логограмма также состоит из множества других слов:

  • 机票: билет на самолет
  • 机器人: робот
  • 机枪: пулемет
  • Opportunity: возможность

Наша маркировка не должна разбивать эти логограммы, потому что, если я ищу «Сотовый телефон», я не хочу, чтобы какие-либо документы о том, что Рэмбо владеет пулеметом и выглядит дурно.

Рэмбо

Мы собираемся протестировать наши решения с помощью великолепного API-интерфейса _analyze

 curl -XGET 'http://localhost:9200/chinese_test/_analyze?analyzer=paoding_analyzer1' -d '手机'

Кроме того, я уже упоминал этот удивительный шпаргалка для Elasticsearch ?

Стандартный китайский анализатор

Этот анализатор, уже доступный в вашем экземпляре Elasticsearch, использует класс Lucene для ChineseTokenizer , который разделяет только логограммы на токены. Итак, мы получаем два токена: и .

Стандартный анализатор Elasticsearch выдает точно такой же результат. По этой причине китайский устарел и скоро будет заменен на стандартный , и вам следует избегать его.

Плагин Paoding

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

 git clone [email protected]:damienalexandre/elasticsearch-analysis-paoding.git /tmp/elasticsearch-analysis-paoding
    cd /tmp/elasticsearch-analysis-paoding
    mvn clean package
    sudo /usr/share/elasticsearch/bin/plugin -url file:/tmp/elasticsearch-analysis-paoding/target/releases/elasticsearch-analysis-paoding-1.2.2.zip -install elasticsearch-analysis-paoding

    # Copy all the dic config files to the ES config path - make sure to set the permissions rights, ES needs to write in /etc/elasticsearch/config/paoding!
    sudo cp -r config/paoding /etc/elasticsearch/config/

После этого неуклюжего процесса установки (который будет выполняться на всех ваших узлах) у нас теперь есть новый токенайзер кодирования и два сборщика: max_word_len и most_word . По умолчанию никакой анализатор не выставляется, поэтому мы должны объявить новый:

 PUT /chinese_test
    {
      "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0,
        "analysis": {
          "tokenizer": {
            "paoding1": {
              "type": "paoding",
              "collector": "most_word"
            },
            "paoding2": {
              "type": "paoding",
              "collector": "max_word_len"
            }
          },
          "analyzer": {
            "paoding_analyzer1": {
              "type": "custom",
              "tokenizer": "paoding1",
              "filter": ["standard"]
            },
            "paoding_analyzer2": {
              "type": "custom",
              "tokenizer": "paoding2",
              "filter": ["standard"]
            }
          }
        }
      }
    }

Обе конфигурации обеспечивают хорошие результаты с чистым и уникальным токеном. Поведение также очень хорошо с более сложными предложениями.

Анализатор cjk

Очень простой анализатор, он превращает только текст в биграмму. «Бэтмен» становится списком бессмысленных токенов: Ba, at, tm, ma, an. Для азиатских языков этот токенизатор является хорошим и очень простым решением по цене большего индекса и иногда не совсем релевантных результатов.

В нашем случае индексируется слово с двумя логограммами, только 手机 , что выглядит неплохо, но если мы возьмем более длинное слово, такое как 元宵节 (Фестиваль фонарей), генерируются два токена : 元宵 и 宵 节 , означающие соответственно фонарь и Сяо Фестиваль

Умный китайский плагин

Очень прост в установке благодаря парням из Elasticsearch, которые поддерживают его:

 bin/plugin -install elasticsearch/elasticsearch-analysis-smartcn/2.3.0

Он предоставляет новый анализатор smartcn , а также токенизатор smartcn_tokenizer, использующий SmartChineseAnalyzer от Lucene.

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

Плагин ICU

Еще один официальный плагин. Elasticsearch поддерживает библиотеки «Международные компоненты для Unicode» .

 bin/plugin -install elasticsearch/elasticsearch-analysis-icu/2.4.1

Этот плагин также рекомендуется, если вы имеете дело с любым языком, кроме английского, я все время использую его для французского контента!

Он предоставляет токенизатор icu_tokenizer, который мы будем использовать, а также множество отличных инструментов анализа, таких как icu_normalizer , icu_folding , icu_collation и т. Д.

Он работает со словарем для китайского и японского текстов, содержащим информацию о частоте слов для вывода групп логограмм. На 手机 все в порядке и работает, как и ожидалось, но на 元宵节 создаются два токена : 元宵 и — потому что фонарь и фестиваль встречаются чаще, чем фестиваль Фонарик .

Разбивка результатов

анализатор 手机 (мобильный телефон) Festival (Фестиваль фонарей) Festival (Фестиваль фонарей с традиционным)
китайский язык [手] [机] [元] [宵] [节] [元] [宵] [節]
paoding most_word [手机] [元宵] [元宵节] [元宵] [節]
paoding max_word_len [手机] [元宵节] [元宵] [節]
Дальневосточные [手机] [元宵] [宵 节] [元宵] [宵 節]
smartcn [手机] [元宵节] [元宵] [節]
icu_tokenizer [手机] [元宵] [节] [元宵節]

Эти тесты были выполнены с Elasticsearch 1.3.2 за исключением Paoding под ES 1.0.1 .

С моей точки зрения, paoding и smartcn получают лучшие результаты. Китайский токенизатор очень плох, и icu_tokenizer немного разочаровывает в 元宵节 , но очень хорошо справляется с традиционным китайским.

Поддержка традиционного китайского

Как указано во введении, вам, возможно, придется иметь дело с традиционным китайским языком либо из ваших документов, либо из поисковых запросов пользователей. Вам необходим шаг нормализации, чтобы перевести эти традиционные входные данные на современный китайский, потому что плагины, такие как smartcn или paoding, не могут корректно управлять им.

Вы можете сделать это из своего приложения или попробовать обработать его внутри Elasticsearch напрямую с помощью плагинаasticsearch-analysis-stconvert . Это может преобразовать оба слова в традиционном и современном китайском, оба пути. К сожалению, вам придется скомпилировать его вручную, так же, как и плагин Paoding, показанный выше.

Последнее решение заключается в использовании cjk : если вы не можете правильно разбить входные данные, у вас все еще есть хорошие шансы перехватить нужные вам документы, а затем улучшить соответствие с помощью сигнала на основе icu_tokenizer , что тоже неплохо.

Идти дальше с китайцами?

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

Чтобы узнать больше о китайском, я рекомендую Chineasy, который является отличным способом получить базовые навыки чтения! Изучать такой богатый язык нелегко, и вы должны также прочитать эту статью, прежде чем идти на это , просто чтобы вы знали, во что вы ввязываетесь! 快乐 编码