Closed sgrinko closed 6 years ago
Добрый день,
Как создавать словари написано в документации: https://www.postgresql.org/docs/current/static/textsearch-dictionaries.html#TEXTSEARCH-ISPELL-DICTIONARY
Обновление какого конкретного словаря вас интересует? Я не очень давно обновлял словари, для которых были обновления. Некоторые из них не менялись уже довольно давно.
Интересует конечно русский язык...
К примеру я столкнулся с тем, что слово оплат
не коррелирует со словами оплата оплаты оплатой ...
.
я походил по ссылкам, что приведены в документации но так и не понял где же там файл affix и dict... смотрел наработки Александр Лебедева (http://scon155.phys.msu.su/~swan/ и Константина Книжника :) (я так понял, что он уже этим не занимается) там есть что-то похожее (их affix сильно отличается по структуре), но у них действительно давно нет обновлений. Похоже, что формат внутри вашего расширения соответствует формату MySpell.
На сайте openoffice тоже не очень ясно что и где брать и как в конце концов скомпоновать.
Пока думаю в сторону ручной правки исходных ваших файлов... но это же не лучший путь... может быть всё же есть обновления?
Я использовал экстеншены 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
Там действительно есть обновления. Но это другие словари, разработки от АОТ. Возможно я добавлю один из них (не уверен какой лучше, но лучше оригинальный от АОТ) в список, чтобы был выбор.
Да, думаю, что это будет полезно.
Есть инфа что делать с файлом oxt
как оттуда получить наши файлики?
Да, это архив. Нужно распаковать его и дальше делать так, как в документации.
Спасибо, попробую
Добавил словарь 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
-----------+-----------
{земля} | {земля}
Столкнулся с проблемой (возможно в модуле 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.... ?
Какая у вас версия Postgres?
ваниль 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
Кстати, случайно нашел опечатку в hunspell_ru_ru_aot.dict
в слове...
матуша-Земля
:)
уверен, что здесь точно должно было быть матушка-Земля
если есть возможность, то было бы неплохо поправить и сообщить в оригинал ребятам...
Я думаю, что это определенно опечатка. Можете сюда отправить http://forumooo.ru/index.php/topic,106.60.html
Спасибо за сообщение об ошибке! Это была ошибка shared_ispell. Я ее исправил.
Также, если у вас есть возможность, то вы можете попробовать данный патч, который реализует shared_ispell в ядре :) https://www.postgresql.org/message-id/20180516113631.GA29544%40zakirov.localdomain
Значит я могу обновить своё расширение из вашего репозитария https://github.com/postgrespro/shared_ispell ? И всё должно заработать?
Да, нужно обновить. Нужно будет его пересобрать, пересоздавать в базе не нужно будет.
Тикет закрываю.
Спасибо! Всё работает. Я кстати сообщил в форум об опечатке и там сказали, что внесли правки. В следующей версии добавят:
Отлично!
Можно ли попросить вас обновить словари, так как текущие 2-х летней давности сборки многого уже не включают. Очень было бы хорошо узнать также о вашей методике сборки словарей и их источников, чтобы иметь возможность самим это делать.