Hunspell vs russian-morphology

#1

Всем привет!
Пытаюсь перейтина hunspell, но пока результат не очень получается.
Например, слово "быстро" - молуль морфологии возвращает "быстро" и "быстрый".
Делаю анализатор с hunspell и словарями из libreoffice - как есть так и возвращает
"быстро" -> "быстро", "быстрый" -> "быстрый", "быстрая" -> "быстрая".
Пытаюсь проверить так:

> echo быстрая|hunspell -p ../dictionary/hunspell/libreoffice/ -s
быстрая быстрый
> echo быстро|hunspell -p ../dictionary/hunspell/libreoffice/ -s
быстро быстрый

Т.е. вроде работает. ЧЯДНТ?
Анализатор практически скопипасчен из доки. ES 5.6.14.

Upd:
Похоже ему вообще пофиг на кастомные словари, вот без всяких ключей:

> echo быстренькая|hunspell
Hunspell 1.7.0
+ быстренький
(Igor Motov) #2

Я не могу это воспроизвести с самим elasticsearch. Только что попробовал на 6.6.0:

PUT /hunspell_example
{
    "settings": {
        "analysis" : {
            "analyzer" : {
                "ru" : {
                    "tokenizer" : "standard",
                    "filter" : [ "lowercase", "ru_RU" ]
                }
            },
            "filter" : {
                "ru_RU" : {
                    "type" : "hunspell",
                    "locale" : "ru_RU",
                    "dedup" : true
                }
            }
        }
    }
}

POST hunspell_example/_analyze
{
  "text": "быстрая",
  "analyzer": "ru"
}

возвращает мне

{
  "tokens" : [
    {
      "token" : "быстрый",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

Hunspell должен возвращает примерно такие-же результаты, что и russian-morphology для слов в словаре. Проблемы начинаются, только когда слов у него в словаре нет. Например, russian-morphology c Бармаглотом, справляется вполне успешно, а hunspell-у он не по зубам:

POST hunspell_example/_analyze
{
  "text": "Хливкие",
  "analyzer": "ru"
}

вернет

{
  "tokens" : [
    {
      "token" : "хливкие",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

В остальном, он вполне работает.

1 Like
#3

Я уже понял, что результат от словаря сильно зависит. Часть же слов он мне приводит к нужному виду. А какой у вас словарь? Как там эти "быстр*" записаны? Если hunspell совсем не умеет работать со словами когда их нет в словаре это печально.

(Igor Motov) #4

Я словарь из libreoffice брал.

#5

Странно, видимо у нас разные libreoffice-ы)
Я выдирал словарь из экстеншса.


Там сборная солянка с АОТ и еще чем-то.
Есть около 6 тысяч фамилий.
Но вот слова типа: теперь и быстрый - записаны без аффиксов.

Штатный словать мне показался очень маленьким.
Файл аффикосв всего 1633 строк.
Насколько понимаю в DEB дистрах он же в пакете hunspell-ru

Потом нашел словарь от Александра Клюквина.
https://code.google.com/archive/p/hunspell-ru/
Он по больше, есть имена и фамилии.
Ссылка на сам словарь https://bitbucket.org/Shaman_Alex/russian-dictionary-hunspell/downloads/ru_RU_UTF-8_20131101.zip

# grep -niH ^быстрый /etc/elasticsearch/hunspell/ru_RU/*.dic 
/etc/elasticsearch/hunspell/ru_RU/ru_RU.dic:9622:быстрый/CCCDCO

Разбирает: тру, три, теперь, быстро, быстрый... но всёравно слишком мало фамилий.
По крайней мере ни моей, ни одного из четырёх начальников нет :slight_smile:
И есть нюанс - имена, фамилии с большой буквы, т.е. если поставить после "lowercase" не сработает.

В общем за выходные распарсил одну базенку.
Из 2,6млн записей получалось: 168472 фамилии, 16706 мужских имен и 9154 женский имен.
С именами то более-менее понятно. Там за 100 уже идут очень редкие имена.
А с фамилиями придется делать до 76442-ой, я это никогда в жизни не размечу :slight_smile:

(Igor Motov) #6

Я тестировал вот с этим https://cgit.freedesktop.org/libreoffice/dictionaries/tree/ru_RU

#7

Да, это 2-ой вариант - 1633 строки в aff

#8

В общем, со словарем всё более-менее нормально, кроме фамилий.
Сделал словарик фамилий. Около 100500 штук получилось ))

(system) closed #9

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.