Создание Hunspell-словаря: различия между версиями

Материал из Wiki FU-Lab
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 20 промежуточных версий 6 участников)
Строка 1: Строка 1:
В данной инструкции будет рассмотрено создание hunspell словаря на примере удмуртского словаря hunspell.
В данной инструкции будет рассмотрено создание hunspell словаря на примере удмуртского словаря hunspell.
Сначала необходимо установить Hunspell:
Сначала необходимо установить Hunspell (для ubuntu и debian):


  sudo apt-get install hunspell hunspell-tools
  sudo apt-get install hunspell hunspell-tools


'''1. Создание списка слов.''' Для создания словаря нужно иметь большой список слов, wordlist. Список удмуртских слов получен из Удмуртско-русского словаря.
Для других версий Linux скачайте исходные файлы и установите (./configure, make и make install (под root-ом)):


'''2. Создание словаря hunspell.'''
http://sourceforge.net/projects/hunspell/files/


2.1. Формат словаря. Словарь hunspell состоит из двух файлов:  
===1. Создание списка слов.===
Для создания словаря нужно иметь большой список слов, wordlist. Список удмуртских слов получен из Удмуртско-русского словаря.
 
===2. Создание словаря hunspell.===
 
====2.1. Формат словаря.====
Словарь hunspell состоит из двух файлов:  
* первый файл с расширением '''.dic''' - здесь содержится список "корней" слов (стемов) со специальными метками, флагами.
* первый файл с расширением '''.dic''' - здесь содержится список "корней" слов (стемов) со специальными метками, флагами.
Фрагмент файла:
Фрагмент файла:
Строка 48: Строка 54:
Остановимся поподробнее на условиях. В '''квадратных скобках''' перечисляется буквы, одна из которых обязательно должна быть на том месте, где стоят эти скобки. В данном примере условию удовлетворяют следующие слова с окончаниями: -дыны, -зыны, -лыны ... -тыны. То есть если в файле с расширением .dic есть слова помеченные флагом "а" и заканчивающиеся на -дыны, -зыны, -лыны ... -тыны, например ''бергатыны/a'', то будет образовываться новые слова с определенным суффиксом: ''бергатӥд''. Далее, если в условии после открывающей квадратной скобки добавлен символ "^", то это означает, что те буквы, которые заключены в эти скобки, не должны находиться на данной позиции (происходит обратное, отрицание). Например, суффиксу с условием '''SFX a ыны ид [^дзлнстьй]ыны''' подходит слово "кытк'''ыны'''/a" -> "кытк'''ид'''".
Остановимся поподробнее на условиях. В '''квадратных скобках''' перечисляется буквы, одна из которых обязательно должна быть на том месте, где стоят эти скобки. В данном примере условию удовлетворяют следующие слова с окончаниями: -дыны, -зыны, -лыны ... -тыны. То есть если в файле с расширением .dic есть слова помеченные флагом "а" и заканчивающиеся на -дыны, -зыны, -лыны ... -тыны, например ''бергатыны/a'', то будет образовываться новые слова с определенным суффиксом: ''бергатӥд''. Далее, если в условии после открывающей квадратной скобки добавлен символ "^", то это означает, что те буквы, которые заключены в эти скобки, не должны находиться на данной позиции (происходит обратное, отрицание). Например, суффиксу с условием '''SFX a ыны ид [^дзлнстьй]ыны''' подходит слово "кытк'''ыны'''/a" -> "кытк'''ид'''".


Hunspell может определять одновременно в одном слове максимум два суффикса. Т.е. если определить в файле аффиксов все суффиксы по отдельности, то Hunspell не поймет этого. Например слово '''гыр-ись-ёс-мы-лы''' имеет 4 аффикса, в словаре аффиксов нельзя определить все эти аффиксы по отдельности, поэтому надо будет определить это как один длинный суффикс, либо как 2 суффикса:<br/>
Hunspell может определять одновременно в одном слове максимум два суффикса. Т.е. если определить в файле аффиксов все суффиксы по отдельности, то Hunspell не поймет этого. Например слово '''гыр-ись-ёс-мы-лы''' имеет 4 аффикса, в словаре аффиксов нельзя определить все эти аффиксы по отдельности, поэтому надо будет определить это как один длинный "суффикс", либо как 2 "суффикса":<br/>
  ...
  ...
  SFX a ыны ись/d [^дзлнстьй]ыны
  SFX a ыны ись'''/d''' [^дзлнстьй]ыны
  ...
  ...
 
  ...
  ...
  SFX d 0 ёсмылы [ьъй]
  SFX d 0 ёсмылы [ьъй]
  ...
  ...


Для определения второго суффикса в конец вперед идущего суффикса добавляется слэш с нужным флагом. В моём примере суффиксы группы "а" определяют глаголы первого спряжения, суффиксы группы "d" - существительные.


Более подробную информацию о формате словаря вы можете узнать по этой ссылке: http://www.marlamuter.ru/downloads/hunspell2.pdf


Более подробную информацию о формате словаря вы можете узнать по этой ссылке: http://www.marlamuter.ru/downloads/hunspell2.pdf
====2.2. Инструменты.====
 
При создании удмуртского словаря hunspell в основном я пользовался редактором текста Notepad++. Но также пользовался некоторыми утилитами из пакета hunspell-tools, о которых я расскажу позже.
 
Для каждой части речи в файле аффиксов существует своя группа. '''Глаголы''' я разделил на 3 группы: 1го спряжения (-ыны), 2го спряжения (-аны, -яны) и отдельно выделил суффиксы для глаголов оканчивающихся на -йыны. Так я сделал, что бы не загромождать группу глаголов 1го спряжения и в связи с специфичностью образования слов на -йыны. Далее после создания групп аффиксов для глаголов я в dic-файле начал обозначать глаголы соответствующими флагами в Notepad++ простой "заменой": например, сначала заменял "йыны" на "йыны/b", потом "ыны" на "ыны/а" и так далее. Исходной формой образования всех глагольных форм в удмуртском языке является инфинитив, имеющий форму '''-ны''', поэтому при определении глаголов не возникло проблем.
 
Далее я начал писать правила образования для существительных. Существительные в удмуртском языке имеют категории числа, притяжательности, падежа и выделительно указательности. Для имен существительных я создал 2 группы аффиксов: одна для сущ., обозначающих неодушевленные предметы, другая для сущ., обозначающих одушевленные предметы. Отличие лишь в том, что в первой группе описаны правила для всех 15 падежей, а во второй только для 8ми. Из-за того, что Hunspell может выделять только максимум 2 суффикса, формы образования не разделены на группы, как было бы логичнее сделать, т.е. для категории числа сделать свою группу, для падежей свою и связать их. Для описания всех форм образования существительных потребовалось: 2 категории числа * 12(?) категорий притяжательности * 15 падежей + правила для [дзлнст], ь, й, [пфктсшхцчщ] = 564 правил, и это еще не все правила, так как я не филолог :). Но это не значит, что от одного существительного может образоваться столько форм. После описания всех правил надо было как то отметить существительные в dic-файле. Для этого в hunspell-tools существует утилита '''munch''' - эта утилита позволяет из wordlist'а с помощью файла аффиксов создать правильный dic-файл с флагами. Вот пример работы munch:
 
wordlist:    |  udm.aff:                                |            udm.dic:
              |                                            |           
яратод      |  SFX a Y 4                                |  munch    1
яратӥсько    |  SFX a 0 0 .                              | ------->  яратыны/a
яратэмзэ    |  SFX a ыны ӥсько [дзлнст]ыны              |
яратыны      |  SFX a ыны од [^ьй]ыны                    |
              |  SFX a ыны эмзэ [дзлнстуеыаоэяиюӧӥё]ыны  |
 
Из 4 слов из wordlist'а он оставил только одно с нужным флагом. Но есть одно ограничение в работе этой утилиты: число словоформ одного слова должно совпадать с количеством суффиксов для нужного флага. Т.е. если количество правил группы больше чем в словоформ в wordlist', то утилита не будет работать и выдаст тот же список. Но, так как munch имеет открытый код, я легко снял это ограничение. Теперь если в wordlist'е есть хотя бы 2 словоформы удовлетворяющие правилам нужного флага, то munch преобразует их в одно слово с флагом. Но пользоваться данной утилитой надо осторожно, иначе для некоторых слов могут быть выбраны неправильные флаги. Что бы это не случилось, надо использовать munch к последовательно получающемуся dic-файлу с '''разными''' aff-файлами, где лежат правила, относящиеся только одной группе/флагу. Ссылка на munch: https://dl.dropbox.com/u/24592250/munch.rar
 
Проверить работоспособность созданных словарей можно следующей командой (если файлы: udm.dic и udm.aff):
 
hunspell -d udm
 
==Ссылки==
* [[Hunspell]]
* [http://mozilla-russia.org/projects/dictionary/hunspell.html Описание формата Hunspell]
* [http://wiki.komikyv.ru/index.php/GoldenDict#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BC.D0.BE.D1.80.D1.84.D0.BE.D0.BB.D0.BE.D0.B3.D0.B8.D0.B8 Использование Hunspell в GoldenDict]
* [http://code.google.com/p/hunspell-ru/downloads/list Русский hunspell словарь]
* [[Коми hunspell словарь]]


2.2. Инструменты.


При создании удмуртского словаря hunspell в основном я пользовался редактором текста Notepad++. Но пользовался некоторыми утилитами из пакета hunspell-tools, о которых я расскажу позже.
[[Category:Инструментарий (коми кыв)]]
[[Category:Марий йылме]]
[[Category:Удмурт кыл]]
[[Категория:Проект Ӟ]]

Текущая версия от 13:21, 3 февраля 2016

В данной инструкции будет рассмотрено создание hunspell словаря на примере удмуртского словаря hunspell. Сначала необходимо установить Hunspell (для ubuntu и debian):

sudo apt-get install hunspell hunspell-tools

Для других версий Linux скачайте исходные файлы и установите (./configure, make и make install (под root-ом)):

http://sourceforge.net/projects/hunspell/files/

1. Создание списка слов.

Для создания словаря нужно иметь большой список слов, wordlist. Список удмуртских слов получен из Удмуртско-русского словаря.

2. Создание словаря hunspell.

2.1. Формат словаря.

Словарь hunspell состоит из двух файлов:

  • первый файл с расширением .dic - здесь содержится список "корней" слов (стемов) со специальными метками, флагами.

Фрагмент файла:

бергатъяны/c
бергатылыны/a
бергатыны/a
бергес
бергозы/d
берда
кыткыны/a

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

  • во втором файле (.aff) находятся группы аффиксов, обозначенные флагами.

Фрагмент файла:

SFX a Y 197 #заголовок группы, кол-во аффиксов - 197
SFX a ыны он/d [^ьй]ыны
...
SFX a ыны эмпотонтэм [дзлнстуеыаоэяиюӧӥё]ыны
SFX a ыны эмпотостэм [дзлнстуеыаоэяиюӧӥё]ыны
SFX a ыны эмъёстэ [дзлнстуеыаоэяиюӧӥё]ыны
SFX a ыны ӥ [дзлнст]ыны
SFX a ыны ӥд [дзлнст]ыны
SFX a ыны ӥды [дзлнст]ыны
SFX a ыны ӥз [дзлнст]ыны
...
SFX a ыны ид [^дзлнстьй]ыны

обозначения:

SFX - означает, что это группа суффиксов. Для создания группы префиксов надо использовать PFX
а - наименование флага
ыны - что будет убираться с конца корня слова
ӥд - сам суффикс
[дзлнст]ыны - условие, при котором будет выбираться данный суффикс. В условиях используются регулярные выражения.
Остановимся поподробнее на условиях. В квадратных скобках перечисляется буквы, одна из которых обязательно должна быть на том месте, где стоят эти скобки. В данном примере условию удовлетворяют следующие слова с окончаниями: -дыны, -зыны, -лыны ... -тыны. То есть если в файле с расширением .dic есть слова помеченные флагом "а" и заканчивающиеся на -дыны, -зыны, -лыны ... -тыны, например бергатыны/a, то будет образовываться новые слова с определенным суффиксом: бергатӥд. Далее, если в условии после открывающей квадратной скобки добавлен символ "^", то это означает, что те буквы, которые заключены в эти скобки, не должны находиться на данной позиции (происходит обратное, отрицание). Например, суффиксу с условием SFX a ыны ид [^дзлнстьй]ыны подходит слово "кыткыны/a" -> "кыткид".

Hunspell может определять одновременно в одном слове максимум два суффикса. Т.е. если определить в файле аффиксов все суффиксы по отдельности, то Hunspell не поймет этого. Например слово гыр-ись-ёс-мы-лы имеет 4 аффикса, в словаре аффиксов нельзя определить все эти аффиксы по отдельности, поэтому надо будет определить это как один длинный "суффикс", либо как 2 "суффикса":

...
SFX a ыны ись/d [^дзлнстьй]ыны
...

...
SFX d 0 ёсмылы [ьъй]
...

Для определения второго суффикса в конец вперед идущего суффикса добавляется слэш с нужным флагом. В моём примере суффиксы группы "а" определяют глаголы первого спряжения, суффиксы группы "d" - существительные.

Более подробную информацию о формате словаря вы можете узнать по этой ссылке: http://www.marlamuter.ru/downloads/hunspell2.pdf

2.2. Инструменты.

При создании удмуртского словаря hunspell в основном я пользовался редактором текста Notepad++. Но также пользовался некоторыми утилитами из пакета hunspell-tools, о которых я расскажу позже.

Для каждой части речи в файле аффиксов существует своя группа. Глаголы я разделил на 3 группы: 1го спряжения (-ыны), 2го спряжения (-аны, -яны) и отдельно выделил суффиксы для глаголов оканчивающихся на -йыны. Так я сделал, что бы не загромождать группу глаголов 1го спряжения и в связи с специфичностью образования слов на -йыны. Далее после создания групп аффиксов для глаголов я в dic-файле начал обозначать глаголы соответствующими флагами в Notepad++ простой "заменой": например, сначала заменял "йыны" на "йыны/b", потом "ыны" на "ыны/а" и так далее. Исходной формой образования всех глагольных форм в удмуртском языке является инфинитив, имеющий форму -ны, поэтому при определении глаголов не возникло проблем.

Далее я начал писать правила образования для существительных. Существительные в удмуртском языке имеют категории числа, притяжательности, падежа и выделительно указательности. Для имен существительных я создал 2 группы аффиксов: одна для сущ., обозначающих неодушевленные предметы, другая для сущ., обозначающих одушевленные предметы. Отличие лишь в том, что в первой группе описаны правила для всех 15 падежей, а во второй только для 8ми. Из-за того, что Hunspell может выделять только максимум 2 суффикса, формы образования не разделены на группы, как было бы логичнее сделать, т.е. для категории числа сделать свою группу, для падежей свою и связать их. Для описания всех форм образования существительных потребовалось: 2 категории числа * 12(?) категорий притяжательности * 15 падежей + правила для [дзлнст], ь, й, [пфктсшхцчщ] = 564 правил, и это еще не все правила, так как я не филолог :). Но это не значит, что от одного существительного может образоваться столько форм. После описания всех правил надо было как то отметить существительные в dic-файле. Для этого в hunspell-tools существует утилита munch - эта утилита позволяет из wordlist'а с помощью файла аффиксов создать правильный dic-файл с флагами. Вот пример работы munch:

wordlist:    |   udm.aff:                                 |            udm.dic:
             |                                            |            
яратод       |   SFX a Y 4                                |  munch     1
яратӥсько    |   SFX a 0 0 .                              | ------->   яратыны/a
яратэмзэ     |   SFX a ыны ӥсько [дзлнст]ыны              |
яратыны      |   SFX a ыны од [^ьй]ыны                    |
             |   SFX a ыны эмзэ [дзлнстуеыаоэяиюӧӥё]ыны   |

Из 4 слов из wordlist'а он оставил только одно с нужным флагом. Но есть одно ограничение в работе этой утилиты: число словоформ одного слова должно совпадать с количеством суффиксов для нужного флага. Т.е. если количество правил группы больше чем в словоформ в wordlist', то утилита не будет работать и выдаст тот же список. Но, так как munch имеет открытый код, я легко снял это ограничение. Теперь если в wordlist'е есть хотя бы 2 словоформы удовлетворяющие правилам нужного флага, то munch преобразует их в одно слово с флагом. Но пользоваться данной утилитой надо осторожно, иначе для некоторых слов могут быть выбраны неправильные флаги. Что бы это не случилось, надо использовать munch к последовательно получающемуся dic-файлу с разными aff-файлами, где лежат правила, относящиеся только одной группе/флагу. Ссылка на munch: https://dl.dropbox.com/u/24592250/munch.rar

Проверить работоспособность созданных словарей можно следующей командой (если файлы: udm.dic и udm.aff):

hunspell -d udm

Ссылки