Кодировка KOI8-C и словарь дореволюционной орфографии

Здравствуйте! Откываю эту тему в продолжение этой. Появилась надобность в словаре дореформенной орфографии. Некто, Serge Winitzki, сотворил такой словарь для ispell (лицензия приемлемая), тарболл можно получить здесь. Однако, все исходники написаны в кодировке KOI8-C (отображаются неверные символы на месте дореволюционных букв - при использовании KOI8-R). Как её настроить в своей системе я, увы, пока не понял.
Я хочу словарь адаптировать (сделать полноценный аддон) к LibreOffice. Опыт создания подобного уже есть - на входе нужен файл со списком слов (огромный список всех слов во всех формах/падежах/etc.). Возможность создания такого файла в Makefile предусмотрена, и выполняется через "make hugelist", и опять-таки результируемый файл получается в кодировке KOI8-C.
Подскажите, как её настроить?

ps Исходники старые (2003 год), писал автору, но он что-то молчит.

Что значит "настроить"? Не

Что значит "настроить"? Не проще ли перекодировать в UTF-8? Тогда проблема опять сведётся к наличию шрифтов содержащих старые буквы. На сколько я знаю, Unicode для старых букв места зарезервировал, так что в UTF-8 переводить проблем не будет. Лично я ни за какие коврижки не захочу "настраивать" систему на KOI8-R или там KOI8-C. В лучшем случае я просто конвертирую текст в UTF-8. Мне приходится работать с разными языками и ограничивать себя только кириллицей не вижу смысла.

Чем больше юзерфрендли, тем сложнее юзать.

/

Подпишусь. В современных реалиях заморачиваться на хотя бы достаточную поддержку экзотики (KOI8-C) — занятие вполне бесперспективное.
Наличных описаний для преобразования к UTF-8 вроде достаточно.

ЗЫ: Но и на UTF-8 надо смотреть без розовых очков. Проблемы поддержки языков, отличных от самизнаететкакого она не снимает.

:wq
--
Live free or die

Понятное дело, UTF-8 всех

Понятное дело, UTF-8 всех проблем не снимает. Но по крайней мере теперь можно тексты с намешанными языками без особых проблем обрабатывать. Большего мне не надо.

Чем больше юзерфрендли, тем сложнее юзать.

v_andal написал(а): Не проще

v_andal написал(а):
Не проще ли перекодировать в UTF-8?

Дык, я обеими руками за, только вот в этом-то и вопрос, как это сделать? Ведь процесс "перекодирование" подразумевает два этапа: 1 - прочтение (того, что нужно перекодировать) и 2 - запись (того что нужно уже в необходимую кодировку ).
Вот, например, выдержка из файла-сорца base.koi в корневом каталоге oldrus-ispell-0.99f4p16:

Агафоновна/I
Ага╛оновичъ/KQ
Ага╛онъ/K
Ага╛ья/I
Аглая/H
Агнесса/I

Второе, третье и четвёртое слова содержат "фиту", там где неверный символ. Насколько я понял из описания, KOI8-C - это нестандартная/самопальная "версия" кодировки KOI8-R. Может я чего-то не понимаю, но если система "не знает" какие именно символы должны быть на месте дореволюционных, то как можно правильно перекодировать?

Я буду очень признателен если кто-нибудь перекодирует (успешно) хотябы один этот файл (base.koi), и разскажет как.

Для перекодирования не нужно

Для перекодирования не нужно ничего "читать". Нужно просто проходить через файл данных и заменять один байт на два других (для кириллицы).

Я состряпал простенький скрипт на перле, который может перекодировать KOI8-C в UTF-8. Точнее, он перекодирует только русские буквы включая все эти
яти и фиты. Буквы других алфавитов я проигнорировал, лень добавлять.

Скрипт можно взять по адресу http://vandal.sdf-eu.org/koi8-c.pl

Запускать его командой

perl koi8-c.pl base.koi > base.utf8

Можно обращаться с вопросами и пожеланиями :)

Чем больше юзерфрендли, тем сложнее юзать.

v_andal написал(а): Скрипт

v_andal написал(а):
Буквы других алфавитов я проигнорировал, лень добавлять.

Дык, из других алфавитов там только латиница, в роде...

v_andal написал(а):
Скрипт можно взять по адресу http://vandal.sdf-eu.org/koi8-c.pl

Что-то не работает

Цитата:
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, vandal @ sdf-eu .org and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Apache/2.2.27 (Unix) mod_ssl/2.2.27 OpenSSL/1.0.1g Server at vandal.sdf-eu.org Port 80

может на bpaste выложите?

Билин. Вечно я попадаю на то,

Билин. Вечно я попадаю на то, что система любой файл с расширением .pl пытается выполнить как CGI скрипт. Ну а раз пермишены это не дают, то она "внутреннюю ошибку" выплёвывает :) Берите с адреса http://vandal.sdf-eu.org/koi8-c-pl

Чем больше юзерфрендли, тем сложнее юзать.

v_andal написал(а): Билин.

v_andal написал(а):
Билин. Вечно я попадаю на то, что система любой файл с расширением .pl пытается выполнить как CGI скрипт. Ну а раз пермишены это не дают, то она "внутреннюю ошибку" выплёвывает :) Берите с адреса http://vandal.sdf-eu.org/koi8-c-pl

О, получилось! Дай Бог тебе здоровья, добрый человек.
Попробую теперь сделать задуманное (тему пока не закрывайте).

Перекодировал все сырцы в

Перекодировал все сырцы в UTF-8, они не собираются :(
Вот так выглядит первый этап сборки оригинальных исходников:

$ make unpack      
Patching rus-ispell files from './rus-ispell-orig'...
Processing abbrev ... base ... computer ... for_name ... geography ... science ... rare ... 
touch VERSION-0.99f4p16
base.koi: ПОВРЕЖДЁН
abbrev.koi: ПОВРЕЖДЁН
computer.koi: ПОВРЕЖДЁН
for_name.koi: ПОВРЕЖДЁН
geography.koi: ПОВРЕЖДЁН
science.koi: ПОВРЕЖДЁН
rare.koi: ПОВРЕЖДЁН
church.koi: ЦЕЛ
names.koi: ЦЕЛ
counted.koi: ПОВРЕЖДЁН
md5sum: ПРЕДУПРЕЖДЕНИЕ: НЕ совпали 8 вычисленных контрольных сумм
Warning: md5 sums do not match.
All done. Run 'make dict && make install' now (as root)
to compile and install the dictionaries.

Контрольные суммы не совпадают из-за неправильного кодирования дореволюционных символов - игнорируем, т.к. md5 прописаны для koi8-c
А вот так выглядит первый этап сборки перекодированных в UTF-8 исходников:

$ make unpack      
Patching rus-ispell files from './rus-ispell-orig'...
Processing abbrev .dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
.dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
. base .dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
.dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
Substitution loop at rus_new2old.pl line 25, <STDIN> chunk 1.
. computer .dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
.dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
. for_name .dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
.dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
. geography .dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
.dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
. science .dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
.dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
. rare .dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
.dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
dict-patch.sh: line 27: ./sortkoi8c: Отказано в доступе
. 
touch VERSION-0.99f4p16
base.koi: ПОВРЕЖДЁН
abbrev.koi: ПОВРЕЖДЁН
computer.koi: ПОВРЕЖДЁН
for_name.koi: ПОВРЕЖДЁН
geography.koi: ПОВРЕЖДЁН
science.koi: ПОВРЕЖДЁН
rare.koi: ПОВРЕЖДЁН
church.koi: ПОВРЕЖДЁН
names.koi: ПОВРЕЖДЁН
counted.koi: ПОВРЕЖДЁН
md5sum: ПРЕДУПРЕЖДЕНИЕ: НЕ совпали 10 вычисленных контрольных сумм
Warning: md5 sums do not match.
All done. Run 'make dict && make install' now (as root)
to compile and install the dictionaries.

При этом файлы base, abbrev и др. не создаются, хотя доступ везде всем полный.

Ещё одна вводная. Для

Ещё одна вводная. Для конечного этапа компиляции (создание hugelist, файла-списка со всевозможными формами-падежами слов) требуется древний пакет ispell, который уже давно эволюционировал в aspell (и из портежей удалён). Как замена, aspell, похоже не подходит (Building dictionary hash...make: buildhash: Command not found - вот такая ошибка с ним). И не факт, что на этом ошибки закончатся (если начать разбираться).
Я думаю установить Gentoo под VirtualBox'ом, поставить в нём KOI8-C и app-text/ispell (ебилд и сырцы в инете ещё есть) и попробовать собрать hugelist там. После чего, уже в настоящей системе, с помощью вашего скрипта, перекодировать hugelist в UTF-8.

Уважаемый v_andal, поскольку вы написали скрипт для "KOI8-C -> UTF-8" (который работает), разскажите как поставить KOI8-C в качестве системной локали на свежеустановленном Gentoo. Я так понимаю нужно что-то в map'ах править?

Сомневаюсь, что этот подход

Сомневаюсь, что этот подход сработает. Нет, поставить ispell и затем собрать словари дело нехитрое. Только подозреваю, что эти словари окажутся несовместимыми с aspell, а значит использовать их можно будет только под этой виртуальной системой и нигде больше. Опять же, вроде бы ispell не поддерживал работу с UTF-8 текстами (это написано в отличиях aspell от ispell). Для сборки словарей совсем не нужно настраивать систему на KOI8-C. Сборка пройдёт под любой конфигурацией. А вот когда дело дойдёт до использования, то как я уже сказал, использовать словарь можно будет только в этой виртуальной системе, так как ispell действительно больше недоступен через portage.

По-моему, более реальным было бы разобраться с тем, какой формат нужен aspell и затем конвертировать его в этот формат. Теоретически aspell позволяет подцеплять словари пользователя, то есть можно к стандартному русскому словарю добавить словарь со старыми словами. Собственно пакет oldrus делает именно это. Он добавляет слова в старой орфографии к базовому пакету, то есть все слова уже вынесены отдельным списком.

Если же устраивает вариант использования только в виртуальной машине, то я могу попробовать поковыряться с документацией и разобраться как исправить локаль KOI8-R на KOI8-C. Может тот тип, что придумал эту кодировку, заодно и дал общее описание, как её активировать на компе.

Чем больше юзерфрендли, тем сложнее юзать.

v_andal

v_andal написал(а):
Сомневаюсь, что этот подход сработает. Нет, поставить ispell и затем собрать словари дело нехитрое. Только подозреваю, что эти словари окажутся несовместимыми с aspell, а значит использовать их можно будет только под этой виртуальной системой и нигде больше. Опять же, вроде бы ispell не поддерживал работу с UTF-8 текстами (это написано в отличиях aspell от ispell).

Дык, aspell и не нужен. LibreOffice работает с Hunspell, а это AFAIK совсем другой проект, и формат там, очевидно, тоже другой.
Я поясню. От данного пакета мне нужен общий файл (так называемый, hugelist) со всеми формами/родами/падежами/etc. всех слов, в алфавитном порядке, в столбик, в одном файле. Он создаётся путём "make unpack; make hugelist" в папке с исходниками. А это [make hugelist] требует для выполнения некую команду "buildhash", которая входит в состав ispell, и отсутствует в aspell. Без неё сборка завершается ошибкой (command not found), и файл не создаётся.
На счёт использования в виртуальной машине - мне главное получить hugelist (хоть даже и в KOI8-C). Далее я его достаю из виртуалки и, с помощью вашего скрипта, перевожу в UTF-8. Всё цель достигнута, дальше уже "дорога накатана". Полученный hugelist разбивается на файл аффиксов и простых форм слов... ну и т.д. После завершения аддон постараюсь закинуть на http://extensions.libreoffice.org

v_andal написал(а):
Для сборки словарей совсем не нужно настраивать систему на KOI8-C. Сборка пройдёт под любой конфигурацией.

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

v_andal написал(а):
Теоретически aspell позволяет подцеплять словари пользователя, то есть можно к стандартному русскому словарю добавить словарь со старыми словами. Собственно пакет oldrus делает именно это. Он добавляет слова в старой орфографии к базовому пакету, то есть все слова уже вынесены отдельным списком.

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

v_andal написал(а):
я могу попробовать поковыряться с документацией и разобраться как исправить локаль KOI8-R на KOI8-C. Может тот тип, что придумал эту кодировку, заодно и дал общее описание, как её активировать на компе.

Это было бы замечательно. Описание KOI8-C здесь и здесь. В роде как, даже указано соответствие символов (KOI8-C <-> UFT-8), но где это нужно править (дописывать?) я не знаю.

Ну если нужен только hugelist

Ну если нужен только hugelist тогда точно никаких настроек на KOI8-C делать не надо. Всё что нужно это пакет ispell с его buildhash.

Если hugelist это просто большой текстовый файл, то его действительно можно конвертнуть моим скриптом. Хуже если этот файл содержит бинарное форматирование.

Чем больше юзерфрендли, тем сложнее юзать.

Ага, т.е. не важно как символ

Ага, т.е. не важно как символ прорисовывается на экране, главное что его "порядковый код" никак не меняется в пределах KOI8-C. Буду пробовать.

Итак, вычленил из файла

Итак, вычленил из файла аффиксов Сергея Виницкого строки, относящиеся к дореволюционной орфографии (формат ispell).
Теперь, полученный "патч" необходимо переформатировать в формат hunspell, чтобы потом можно было скрестить его с аффиксами для словаря АОТ.
Скрипт, переводящий из формата ispell в hunspell здесь.
А тут то, что нужно перевести этим скриптом.

Скрипт поддерживает некие latin[0-3], однако кириллицу, да ещё и с дореволюционными символами трудно представить в чём-то кроме UTF-8. После отработки скрипта получается билеберда в роде:

SFX U Y 68
SFX U   ваЂЌ ЁмЊ      аваЂЌ
SFX U   ваЂЌ ЁЂЊ      аваЂЌ
SFX U   ваЂЌ ЎЂЊ      аваЂЌ
SFX U   ваЂЌЁЯ ЎЁЯ      аваЂЌЁЯ
SFX U   ваЂЌЁЯ ЁЂеЁЯ  аваЂЌЁЯ
SFX U   еваЂЌ ЃемЊ    [жЈЉЧІ]еваЂЌ
SFX U   еваЂЌ ЃеЂЊ    [жЈЉЧІ]еваЂЌ
SFX U   еваЂЌ ЃЎЂЊ    [жЈЉЧІ]еваЂЌ

Вопрос, кто может помочь в адаптации скрипта к UTF-8 и стоит ли оно того?
Или мне пойти обходным путём в роде "найти и заменить" (позаменять в полученном тексте "неправильные" символы на "правильные")?

Подпачил я этот скрипт чтобы

Подпачил я этот скрипт чтобы он ожидал данные в UTF-8 и выплёвывал их в той же кодировке. Надеюсь, что я при этом ничего не сломал :)
Новую версию можно взять по адресу http://andal.linuxx.org/ispell.pl

Чем больше юзерфрендли, тем сложнее юзать.

О, отлично! Всё работает

О, отлично! Всё работает правильно, спасибо.
Теперь пропатчу аффиксы и базу словаря АОТ, и надеюсь словарь будет готов :)

v_andal, этот скрипт - из инструментов hunspell, его можно закинуть в апстрим для добавления в следующий релиз. Если хотите, я могу это сделать (напишите только в комментариях информацию о ваших изменениях).

Я не уверен на сколько его

Я не уверен на сколько его можно пользовать именно как "инструмент". Изначально он работал с несколькими кодировками (latin1, latin2 и тп.) Сейчас я его тупо закоротил на работу только с UTF-8. Так что, на инструмент он уже не тянет. По хорошему, ему нужно добавить поддержку работы с другими кодировками. В общем-то это не сложно сделать, только мне в лом делать то, что может быть никому не надо :)

Чем больше юзерфрендли, тем сложнее юзать.

Посетила меня вдруг простая

Посетила меня вдруг простая мысль. Нафига поддерживать разные кодировки в скрипте? Есть ведь программа iconv которая может менять кодировку файлов. Да и руками достаточно просто перекодировать. В общем добавил я к документации информацию про UTF-8 и способы перекодирования, думаю этого достаточно, можно предлагать upstream :)

Чем больше юзерфрендли, тем сложнее юзать.

Это хорошо. Только добавьте

Это хорошо. Только добавьте инфу про себя, а то я отправлю и авторство по дефолту припишется мне (совесть будет мучить).

Оно того не стоит. Всех моих

Оно того не стоит. Всех моих изменений - убрать парочку лишних функций, да поменять кодировку для чтения и записи. Если вдруг возникнут вопросы, то здесь на форуме есть возможность посылать личные сообщения. Если претензии - то ну их на фик :)

Чем больше юзерфрендли, тем сложнее юзать.

Доброго времени суток. Снова

Доброго времени суток.

UPDATE:
Снова нужна ваша помощь в корректировке скрипта (уже другого).
Итак, есть два текстовых файла (словарь и аффиксы):
dict.dic

3
бухта
высокий/2
синий/1,2

dict.aff

SET UTF-8
FLAG num
PFX 1 Y 1
PFX 1 0 полу .
SFX 2 Y 2
SFX 2 ий его [^к]ий
SFX 2 ий ого [к]ий

Коротко объясню синтаксис. В словаре перечислены слова в начальной форме (1 слово - 1 строка). После слэша, через запятые, перечисляются флаги по которым это слово может преобразовываться в словоформы. В файле аффиксов перечислены правила флагов по которым строятся словоформы. Строка с "FLAG num" означает, что флаги кодируются числами. PFX означает "приставка", SFX - "суффикс/окончание". Первые строки флагов, т.е. там где "Y 1" и "Y 2" - определяют количество правил флага. Итак, вторая строка PFX означает "ничего не отбрасываем" (символ 0), "но добавляем 'полу'", точка означает, что слово может начинаться с любого символа. Вторая строка SFX означает отбрасываем "ий" и добавляем "его", при условии, что перед "ий" не идёт символ "к". Третья строка SFX означает, отбрасываем "ий" и добавляем "ого", при условии, что перед "ий" идёт символ "к". Пустые строки в конце файлов обязательны.
Это простой пример. На деле же комбинации условий могут быть самые разные как для приставок, так и для суффиксов.

Теперь, что нужно сделать. Нужно, с помощью скрипта, получить список всех слов со всеми возможными их словоформами (в той же форме, т.е. 1 слово - 1 строка), так называемый "hugelist".
Из приведенного выше примера скрипт должен выдать:

бухта
высокий
высокого
синий
полусиний
синего
полусинего

UPDATE: однако выдаёт только словоформы (т.е. не хватает начальных форм - "бухта, высокий, синий").
Как заставить его выводить начальные формы слов тоже?

Нашёл другой скрипт:

Нашёл другой скрипт: https://github.com/kscanne/hunspell-gd/blob/master/unmunch.sh
Работает правильно.

Работа по созданию словаря

Работа по созданию словаря продолжается. Сейчас я застопорился на добавлении поддержки буквы "ё" в некоторых глаголах. В общем суть такая. Есть список инфинитивов и есть файл словаря, где изложены все слова с прописанными для них флагами. Нужно выбрать из файла словаря строки, соответствующие списку инфинитивов. Т.е. надо получить тотже список инфинитивов, только уже с флагами.
До настоящего времени для подобной задачи использовал:
egrep -f infinitives.txt dictionary.txt > infinitives-flags.txt
Файлы паттернов были небольшие (2-3 сотни строк). В данном случае паттерн соодержит почти 5 тыс. строк, а файл словаря - около 170 тыс. И egrep уже не срабатывает - просто тупо переписывает содержимое всего файла словаря.

Что можете посоветовать на замену для данной задачи?

1. Поскольку the variant

1. Поскольку

the variant programs egrep and fgrep are the same as grep -E and grep -F, respectively.  These variants are deprecated, but are  provided  for  backward compatibility.

попробуй просто

grep -E

2. С учетом

Known Bugs
       Large repetition counts in the {n,m} construct may cause grep to use lots of memory.  In addition, certain other obscure regular expressions require exponential time and space, and may cause grep to run out of memory.

попробуй увеличить/отменить лимиты в /etc/security/limits.conf

3. Чтобы быть уверенным, что grep использует текущие библиотеки, пересобери его.

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

Результат можно взять здесь

Результат можно взять здесь http://andal.linuxx.org/list.txt Скриптик для выборки здесь http://andal.linuxx.org/grepper.pl Может ещё для чего пригодится.

Чем больше юзерфрендли, тем сложнее юзать.

Спасибо за советы и

Спасибо за советы и скрипт.
Но как оказалось, всё равно надо всё просматривать глазами, т.к. есть нюансы, которые машинным путём обработать нельзя. На пример, есть слово "печь" как существительное, а есть "печь" как глагол. Кроме того, есть более заковыристые глаголы типа "жмёшь" и "жнёшь" (по смыслу отличаются друг от друга, но инфинитив у них одинаковый - "жать"). Вот такой вот он, русский язык.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".