postgrespro / hunspell_dicts

Hunspell dictionaries for PostgreSQL
Other
63 stars 17 forks source link

Обновление словарей #3

Closed sgrinko closed 6 years ago

sgrinko commented 6 years ago

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

za-arthur commented 6 years ago

Добрый день,

Как создавать словари написано в документации: https://www.postgresql.org/docs/current/static/textsearch-dictionaries.html#TEXTSEARCH-ISPELL-DICTIONARY

Обновление какого конкретного словаря вас интересует? Я не очень давно обновлял словари, для которых были обновления. Некоторые из них не менялись уже довольно давно.

sgrinko commented 6 years ago

Интересует конечно русский язык... К примеру я столкнулся с тем, что слово оплат не коррелирует со словами оплата оплаты оплатой .... я походил по ссылкам, что приведены в документации но так и не понял где же там файл affix и dict... смотрел наработки Александр Лебедева (http://scon155.phys.msu.su/~swan/ и Константина Книжника :) (я так понял, что он уже этим не занимается) там есть что-то похожее (их affix сильно отличается по структуре), но у них действительно давно нет обновлений. Похоже, что формат внутри вашего расширения соответствует формату MySpell. На сайте openoffice тоже не очень ясно что и где брать и как в конце концов скомпоновать. Пока думаю в сторону ручной правки исходных ваших файлов... но это же не лучший путь... может быть всё же есть обновления?

za-arthur commented 6 years ago

Я использовал экстеншены Openoffice: https://extensions.openoffice.org/en/search?query=russian&sort_by=field_project_stats_year&sort_order=DESC&f%5B0%5D=field_project_tags%3A94 Сейчас используется словарь Александра Лебедева. Также можно найти словари на сайте Libreoffice: https://extensions.libreoffice.org/extensions?getCategories=Dictionary&getCompatibility=any&sort_on=positive_ratings&path=%2FPlone%2Fextensions&portal_type=tdf.extensionsuploadcenter.eupproject&SearchableText=russian

Там действительно есть обновления. Но это другие словари, разработки от АОТ. Возможно я добавлю один из них (не уверен какой лучше, но лучше оригинальный от АОТ) в список, чтобы был выбор.

sgrinko commented 6 years ago

Да, думаю, что это будет полезно. Есть инфа что делать с файлом oxt как оттуда получить наши файлики?

za-arthur commented 6 years ago

Да, это архив. Нужно распаковать его и дальше делать так, как в документации.

sgrinko commented 6 years ago

Спасибо, попробую

za-arthur commented 6 years ago

Добавил словарь hunspell_ru_ru_aot. Он хорошо работает с 'оплат', 'оплаты':

select ts_lexize('russian_aot_hunspell', 'оплат'), ts_lexize('russian_aot_hunspell', 'оплаты');
 ts_lexize | ts_lexize 
-----------+-----------
 {оплата}  | {оплата}

Но есть слова, где russian_hunspell работает лучше:

select ts_lexize('russian_aot_hunspell', 'земли'), ts_lexize('russian_aot_hunspell', 'землями');
 ts_lexize | ts_lexize 
-----------+-----------
 {земли}   | {землями}

select ts_lexize('russian_hunspell', 'земли'), ts_lexize('russian_hunspell', 'землями');
 ts_lexize | ts_lexize 
-----------+-----------
 {земля}   | {земля}
sgrinko commented 6 years ago

Столкнулся с проблемой (возможно в модуле shared_ispell) ... Пока пишу сюда... взял данные из файла dict_pack_ru-aot-0.4.2.oxt конвертнул iconv -f KOI8-R -t UTF-8 -o russian-aot-utf8.affix russian-aot.affix iconv -f KOI8-R -t UTF-8 -o russian-aot-utf8.dict russian-aot.dict и подключил...

CREATE TEXT SEARCH DICTIONARY public.russian_aot_shared (
   TEMPLATE = public.shared_ispell,
   dictfile = 'russian_aot', afffile = 'russian_aot', stopwords = 'russian'
);

CREATE TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf (parser=default);

ALTER TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf 
        ADD MAPPING FOR email, file, float, host, hword_numpart, int, numhword, numword, sfloat, uint, url, url_path, version
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart 
    WITH english_hunspell_shared, english_stem;

ALTER TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf
        ALTER MAPPING FOR hword, hword_part, word 
        WITH russian_aot_shared, russian_stem;

потом выполнил

select to_tsvector('public.fts_aot_russian_conf', 'вероятно');
ERROR:  affix flag "91263,11" is out of range
********** Error **********

есть 263,11 в самом файле dict есть строки: вероятно вероятно/11,91 вероятно/263,11

select to_tsvector('public.fts_aot_russian_conf', 'ФАС')
ERROR:  affix flag "108108,30" is out of range
********** Error **********

есть 108,30 в самом файле dict есть строки: фас/32 фасад/32 фасадный/2504 фасет/32 фасетизация/37 фасетка/15 фасеточный/2504 фасетчатый/2503 фаска/15 фасный/8,9 фасо/108,30 ...

теперь убираем shared...

CREATE TEXT SEARCH DICTIONARY public.russian_aot_shared (
   TEMPLATE = ispell,
   dictfile = 'russian_aot', afffile = 'russian_aot', stopwords = 'russian'
);

CREATE TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf (parser=default);

ALTER TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf 
        ADD MAPPING FOR email, file, float, host, hword_numpart, int, numhword, numword, sfloat, uint, url, url_path, version
    WITH simple;

ALTER TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart 
    WITH english_hunspell_shared, english_stem;

ALTER TEXT SEARCH CONFIGURATION public.fts_aot_russian_conf
        ALTER MAPPING FOR hword, hword_part, word 
        WITH russian_aot_shared, russian_stem;

select to_tsvector('public.fts_aot_russian_conf', 'вероятно'); 'вероятно':1

select to_tsvector('public.fts_aot_russian_conf', 'ФАС') 'фас':1

просто хотелось понять, что проблема точно в shared модуле ispell.... ?

za-arthur commented 6 years ago

Какая у вас версия Postgres?

sgrinko commented 6 years ago

ваниль 10.4 PostgreSQL 10.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18), 64-bit Linux - RedHat 6.8

shared_preload_libraries = 'plugin_debugger, pg_wait_sampling, pg_stat_statements, auto_explain, pg_pathman, pg_buffercache, pg_cron, shared_ispell'

# config of the shared memory
shared_ispell.max_size = 64MB
sgrinko commented 6 years ago

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

za-arthur commented 6 years ago

Я думаю, что это определенно опечатка. Можете сюда отправить http://forumooo.ru/index.php/topic,106.60.html

za-arthur commented 6 years ago

Спасибо за сообщение об ошибке! Это была ошибка shared_ispell. Я ее исправил.

Также, если у вас есть возможность, то вы можете попробовать данный патч, который реализует shared_ispell в ядре :) https://www.postgresql.org/message-id/20180516113631.GA29544%40zakirov.localdomain

sgrinko commented 6 years ago

Значит я могу обновить своё расширение из вашего репозитария https://github.com/postgrespro/shared_ispell ? И всё должно заработать?

za-arthur commented 6 years ago

Да, нужно обновить. Нужно будет его пересобрать, пересоздавать в базе не нужно будет.

za-arthur commented 6 years ago

Тикет закрываю.

sgrinko commented 6 years ago

Спасибо! Всё работает. Я кстати сообщил в форум об опечатке и там сказали, что внесли правки. В следующей версии добавят: default

za-arthur commented 6 years ago

Отлично!