├── aspell-manchu ├── .gitignore ├── mnc.dat ├── README.md ├── info ├── Copyright └── mnc_affix.dat ├── hunspell-manchu ├── README.md ├── sample.txt └── mnc-latin.aff ├── README.md └── doc └── how-to-create-new-aspell-dict-ko.md /aspell-manchu/.gitignore: -------------------------------------------------------------------------------- 1 | COPYING 2 | Makefile 3 | Makefile.pre 4 | README 5 | configure 6 | *.cmap 7 | *.cset 8 | *.alias 9 | *.cwl 10 | *.multi 11 | *.rws 12 | -------------------------------------------------------------------------------- /aspell-manchu/mnc.dat: -------------------------------------------------------------------------------- 1 | name mnc 2 | charset iso-8859-1 3 | data-encoding utf-8 4 | affix mnc 5 | affix-compress true 6 | partially-expand true 7 | repl-table mnc_affix.dat 8 | special ' -** 9 | 10 | -------------------------------------------------------------------------------- /aspell-manchu/README.md: -------------------------------------------------------------------------------- 1 | Aspell Manchu Dictonary 2 | ================================ 3 | 4 | How to build the dictionary package for distribution: 5 | 6 | $ ./proc 7 | $ ./configure 8 | $ make dist 9 | 10 | How to install: 11 | 12 | $ ./proc 13 | $ ./configure 14 | $ sudo make install -------------------------------------------------------------------------------- /aspell-manchu/info: -------------------------------------------------------------------------------- 1 | name_english Manchu 2 | lang mnc 3 | data-file mnc_affix.dat 4 | author: 5 | name You Hyun Jo 6 | email you at cpan org 7 | copyright GPLv3 8 | url https://github.com/youhyunjo/manchu-spell 9 | version 20130123-0 10 | source-version 20130123 11 | complete false 12 | accurate true 13 | alias mnc manchu 14 | dict: 15 | name mnc 16 | add mnc 17 | -------------------------------------------------------------------------------- /hunspell-manchu/README.md: -------------------------------------------------------------------------------- 1 | # hunspell-manchu 2 | 3 | ## hunspell 4 | 5 | - https://github.com/hunspell 6 | 7 | Linux (Debian) : 8 | 9 | ``` 10 | sudo apt-get install hunspell 11 | ``` 12 | 13 | macOS: 14 | 15 | ``` 16 | brew install hunspell 17 | ``` 18 | 19 | 20 | ## Usage 21 | 22 | ``` 23 | hunspell -d mnc-latin -m sample.txt 24 | ``` 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /hunspell-manchu/sample.txt: -------------------------------------------------------------------------------- 1 | guwendure guwendure jirgio, 2 | birai jubki de bimbi, 3 | fujurungga ambalinggv mergen sargan jui, 4 | ambasa saisa i sain holbon ombi. 5 | 6 | umburi cumburi hinggari sogi oci, 7 | hashv ici eyembi, 8 | fujurungga ambalinggv mergen sargan jui be, 9 | amgacibe getecibe merkimbi, 10 | merkifi baharakv de, 11 | amgacibe getecibe gvnimbi, 12 | atanggi ni atanggi ni, 13 | kurbuxeme fuhaxame joboxombi. 14 | 15 | umburi cumburi hinggari sogi oci, 16 | hashv ici gurumbi, 17 | fujurungga ambalinggv mergen sargan jui be, 18 | kituhan xentuhen i acabumbi, 19 | umburi cumburi hinggari sogi oci, 20 | hashv ici fatambi, 21 | fujurungga ambalinggv mergen sargan jui be, 22 | jungken tungken i sebjelebumbi. 23 | -------------------------------------------------------------------------------- /aspell-manchu/Copyright: -------------------------------------------------------------------------------- 1 | The aspell Manchu dictionary is based on the Manchu-Chinese Dictionary [han i 2 | araha manju gisun i buleku bithe] (1708). 3 | 4 | Author: You Hyun Jo 5 | 6 | This program is free software; you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation; either version 2 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program; if not, write to the Free Software 18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Manchu Speller 2 | ================================ 3 | 4 | You, Hyun-Jo. 2014. A Manchu speller: With a practical introduction to the natural language 5 | processing of minority languages. Altai Hakpo 24. 39--67. The Altaic Society of Korea. DOI: [[10.15816/ask.2014..24.003](http://doi.org/10.15816/ask.2014..24.003)] 6 | 7 | Manchu Dictionaries and Texts 8 | -------------------------------- 9 | 10 | It is developped for the SNU digitization project of Manchu lexical and 11 | textual resources published during 17th and 18th centruies: 12 | 13 | * 御製飜譯詩經(1768序) 文淵閣四庫全書. han i araha ubaliyambuha irgebun i nomun. 14 | * 大淸全書(1683) 天理大圖書館. daicing gurun i yooni bithe. 15 | * 擇翻聊齋志異. sonjofi ubaliyambuha liyoo jai jy i bithe. 16 | * 漢淸文鑑. hancheongmungam 17 | * 滿漢同文全書. manju nikan xu adali yooni bithe. 18 | * 同文彙集. dongmunhwijip 19 | * 同文類解. dongmunyuhae 20 | * 滿漢同文類集. 內閣文庫. manhantongwenleiji 21 | * 滿漢類書(1700) 東洋文庫. manhanleishu 22 | * 淸文彙書(1724) 首都圖書館. qingwenhuishu 23 | * 新刻淸書全集(1699) 大阪外大圖書館. 24 | * 滿漢西廂記(1710) SNU Library. manju nikan si siyang gi bithe. 25 | * 金甁梅(1708序) 中國國家圖書館. gin ping mei bithe 26 | * 三譯總解(1774) samyeokchonghae. SNU Library. 27 | * 三國演義(1722~1735) 北京故宮博物院圖書館. ilan gurun i bithe (san guo zhi) 28 | * 小兒論(1777) soaron. SNU Library. 29 | * 御製淸文鑑(1708序). han i araha manju gisun i buleku bithe. (yu zhi qing wen jian). SNU Library. 30 | * 御製增訂淸文鑑(1771序) 遼寧省圖書館. han i araha nonggime toktobuha manju gisun i buleku bithe. (yu zhi zeng ding qing wen jian) 31 | * 淸語老乞大(1765序) 日本驅澤大學. cheongeonogeoldae 32 | * 八歲兒(1777). palsea. Kyujanggak. 33 | 34 | 35 | 36 | Manchu Translitteration 37 | -------------------------------- 38 | 39 | ### elementary characters 40 | 41 | | chr | unicode | translit | 42 | |----|----------|----------| 43 | | ᠠ | U+1820 | a | 44 | | ᡝ | U+185D | e | 45 | | ᡳ | U+1873 | i | 46 | | ᠣ | U+1823 | o | 47 | | ᡠ | U+1860 | u | 48 | | ᡡ | U+1861 | v | 49 | | ᠨ | U+1828 | n | 50 | | ᠩ | U+1829 | ng | 51 | | ᡴ | U+1874 | k | 52 | | ᡤ | U+1864 | g | 53 | | ᡥ | U+1865 | h | 54 | | ᠪ | U+182A | b | 55 | | ᡦ | U+1866 | p | 56 | | ᠰ | U+1830 | s | 57 | | ᡧ | U+1867 | x | 58 | | ᡨ | U+1868 | t | 59 | | ᡩ | U+1869 | d | 60 | | ᠯ | U+182F | l | 61 | | ᠮ | U+182E | m | 62 | | ᠴ | U+1834 | c | 63 | | ᠵ | U+1835 | j | 64 | | ᠶ | U+1836 | y | 65 | | ᡵ | U+1875 | r | 66 | | ᡶ | U+1876 | f | 67 | | ᠸ | U+1838 | w | 68 | 69 | ### special characters 70 | 71 | | chr | unicode | tr | syllables | 72 | |-----|-----------|-----|-----------------| 73 | | ᠺ | U+183A | k' | k'a k'o | 74 | | ᡬ | U+186C | g' | g'a g'o | 75 | | ᡭ | U+186D | h' | h'a h'o | 76 | | ᡮ | U+186E | ts | tsa tse tso tsu | 77 | | ᡮᡟ | ᡮ (U+186F) ᡟ (U+185F) | tsy | 78 | | ᡯ | U+186F | dz | dza dze dzo dzu | 79 | | ᡯ? | U+186F ? | dzy | 80 | | ᡰ | U+1870 | z | za ze zo zu | 81 | | ᡰᡳ | ᡰ (U+1870) ᡳ (U+1873) | zy | 82 | | ᠰᡟ | ᠰ (U+1830) ᡟ (U+185F) | sy | 83 | | ᡱᡳ | ᡱ (U+1871) ᡳ (U+1873) | cy | 84 | | ᡷᡳ | ᡷ (U+1877) ᡳ (U+1873) | jy | 85 | -------------------------------------------------------------------------------- /hunspell-manchu/mnc-latin.aff: -------------------------------------------------------------------------------- 1 | SET UTF-8 2 | 3 | # Nominal suffixes 4 | SFX N Y 5 5 | SFX N 0 i . is:i 6 | SFX N 0 be . is:be 7 | SFX N 0 de . is:de 8 | SFX N 0 ci . is:ci 9 | SFX N 0 ingge . is:ingge 10 | 11 | # passive-causative -bu 12 | SFX B Y 1 13 | SFX B 0 bu/V . ds:bu 14 | 15 | # Verbal -me|ci|ki suffixes 16 | SFX V Y 23 17 | SFX V 0 mbi . is:mbi 18 | SFX V 0 mbidere is:mbidere 19 | SFX V 0 mbihe . is:mbihe 20 | SFX V 0 mbihebi . is:mbihebi 21 | SFX V 0 mbihede . is:mbihede 22 | SFX V 0 mbihekai . is:mbihekai 23 | SFX V 0 mbihengge . is:mbihengge 24 | SFX V 0 mbiheni . is:mbiheni 25 | SFX V 0 mbiheo . is:mbiheo 26 | SFX V 0 mbikai . is:mbikai 27 | SFX V 0 mbime . is:mbime 28 | SFX V 0 mbina . is:mbina 29 | SFX V 0 mbini . is:mbini 30 | SFX V 0 mbinikai . is:mbinikai 31 | SFX V 0 mbinio . is:mbinio 32 | SFX V 0 mbio . is:mbio 33 | SFX V 0 ci . is:ci 34 | SFX V 0 cibe . is:cibe 35 | SFX V 0 cina . is:cina 36 | SFX V 0 ki . is:ki 37 | SFX V 0 kini . is:kini 38 | SFX V 0 me . is:me 39 | SFX V 0 meo . is:meo 40 | 41 | # Verbal -nggala|nggele|nggolo form 42 | SFX l Y 3 43 | SFX l 0 nggala a is:nggala 44 | SFX l 0 nggele e is:nggele 45 | SFX l 0 nggolo o is:nggolo 46 | 47 | 48 | # Verbal -fi form 49 | SFX f Y 1 50 | SFX f 0 fi . is:fi 51 | 52 | # Verbal -pi form 53 | SFX p Y 1 54 | SFX p 0 pi . is:pi 55 | 56 | # Verbal -mpi form 57 | SFX m Y 1 58 | SFX m 0 mpi . is:mpi 59 | 60 | 61 | # Suffixes after r[aeo]|ndara|ndere|ndoro form 62 | SFX R Y 23 63 | SFX R 0 de . 64 | SFX R 0 lame a is:lame 65 | SFX R 0 leme e is:leme 66 | SFX R 0 lome o is:lome 67 | SFX R 0 le . is:le 68 | SFX R 0 ngge . is:ngge 69 | SFX R 0 lengge . is:lengge 70 | SFX R 0 o . is:o 71 | SFX R a akv a is:akv +NEG 72 | SFX R e akv e is:akv +NEG 73 | SFX R o akv o is:akv +NEG 74 | SFX R a akvn a is:akvn +NEG 75 | SFX R e akvn e is:akvn +NEG 76 | SFX R o akvn o is:akvn +NEG 77 | SFX R a akvni a is:akvni +NEG 78 | SFX R e akvni e is:akvni +NEG 79 | SFX R o akvni o is:akvni +NEG 80 | SFX R a akvci a is:akvci +NEG 81 | SFX R e akvci e is:akvci +NEG 82 | SFX R o akvci o is:akvci +NEG 83 | SFX R a akvngge a is:akvngge +NEG 84 | SFX R e akvngge e is:akvngge +NEG 85 | SFX R o akvngge o is:akvngge +NEG 86 | 87 | # Verbal -ra|re|ro suffixes 88 | SFX r Y 3 89 | SFX r 0 ra/R [av] is:ra 90 | SFX r 0 re/R [eui] is:re 91 | SFX r 0 ro/R o is:ro 92 | 93 | # Verbal -ndara|ndere|ndoro suffixes 94 | SFX n Y 3 95 | SFX n 0 ndara/R [av] is:ndara 96 | SFX n 0 ndere/R [eui] is:ndere 97 | SFX n 0 ndoro/R o is:ndoro 98 | 99 | # Suffixes after (h|k|ngk)[aeo] form 100 | SFX H Y 14 101 | SFX H 0 bi . is:bi 102 | SFX H 0 bici . is:bici 103 | SFX H 0 bihe . is:bihe 104 | SFX H 0 bikai . is:bikai 105 | SFX H 0 de . is:de 106 | SFX H 0 i . is:i 107 | SFX H 0 kv . is:akv +NEG 108 | SFX H 0 kvn . is:akvn +NEG 109 | SFX H 0 kvni . is:akvni +NEG 110 | SFX H 0 kvbi . is:akvbi +NEG 111 | SFX H 0 le . is:le 112 | SFX H 0 lengge . is:lengge 113 | SFX H 0 ngge . is:ngge 114 | SFX H 0 o . is:o 115 | 116 | # Verb -h[aeo] form 117 | SFX h Y 11 118 | SFX h 0 ha/H a is:ha 119 | SFX h 0 he/H e is:he 120 | SFX h 0 ho/H o is:ho 121 | SFX h 0 ha/H ai is:ha 122 | SFX h 0 ha/H ei is:he 123 | SFX h 0 ha/H oi is:ho 124 | SFX h 0 he/H nggi is:he 125 | SFX h 0 ha/H [aovi][^aeiouv][uvi] is:ha 126 | SFX h 0 ha/H [aovi][^aeiouv][^aeiouv][uvi] is:ha 127 | SFX h 0 he/H [eu][^aeiouv][uvi] is:he 128 | SFX h 0 he/H [eu][^aeiouv][^aeiouv][uvi] is:he 129 | 130 | # Verb -k[aeo] form 131 | SFX k Y 7 132 | SFX k 0 ka/H a is:ka 133 | SFX k 0 ke/H e is:ke 134 | SFX k 0 ko/H o is:ko 135 | SFX k 0 ka/H [aovi][^aeiouv][uvi] is:ka 136 | SFX k 0 ka/H [aovi][^aeiouv][^aeiouv][uvi] is:ka 137 | SFX k 0 ke/H [eu][^aeiouv][uvi] is:ke 138 | SFX k 0 ke/H [eu][^aeiouv][^aeiouv][uvi] is:ke 139 | 140 | # Verb -ngk[aeo] form 141 | SFX g Y 7 142 | SFX g 0 ngka/H a is:ngka 143 | SFX g 0 ngke/H e is:ngke 144 | SFX g 0 ngko/H o is:ngko 145 | SFX g 0 ngka/H [aovi][^aeiouv][uvi] is:ngka 146 | SFX g 0 ngka/H [aovi][^aeiouv][^aeiouv][uvi] is:ngka 147 | SFX g 0 ngke/H [eu][^aeiouv][uvi] is:ngke 148 | SFX g 0 ngke/H [eu][^aeiouv][^aeiouv][uvi] is:ngke 149 | -------------------------------------------------------------------------------- /aspell-manchu/mnc_affix.dat: -------------------------------------------------------------------------------- 1 | # 2 | # References 3 | # 4 | # Paul Georg von Möllendorff (1892). A Manchu Grammar with Aanalysed Texts. 5 | # [http://archive.org/details/cu31924023341112] 6 | # 7 | SET UTF-8 8 | 9 | # Noun Case 10 | SFX N Y 6 11 | SFX N 0 0 . # 12 | SFX N 0 ni ng # Genitive 13 | SFX N 0 i . 14 | SFX N 0 be . # Accusative 15 | SFX N 0 de . # Dative/Locative 16 | SFX N 0 ci . # Ablative 17 | 18 | # Noun plural 19 | SFX s Y 4 20 | SFX s 0 sa [avui] 21 | SFX s n sa n 22 | SFX s 0 se [eu] 23 | SFX s 0 so o 24 | 25 | SFX t Y 2 26 | SFX t 0 ta [au] 27 | SFX t 0 te [eu] 28 | 29 | 30 | # Verb 31 | SFX V Y 39 32 | SFX V 0 0 . # Imperative 33 | SFX V 0 mbi . # Present (I write) 34 | SFX V 0 mbikai . # 35 | SFX V 0 mbihe . # Imperfect (I was writing) 36 | SFX V 0 mbihebi . # 37 | SFX V 0 mbime . # Gerend I. (whilst writing) 38 | SFX V 0 mbifi . # Gerend II. (having written) 39 | SFX V 0 mbini . 40 | SFX V 0 mbumbi . # Passive (it is written) 41 | SFX V 0 mbubumbi . # Causative/Passive (I cause to be written) 42 | SFX V 0 me . # Infinitive (to write) 43 | SFX V 0 meo . # Infinitive (to write) 44 | SFX V 0 ra [av] # Future (I shall write) 45 | SFX V 0 re [eui] 46 | SFX V 0 ro o 47 | SFX V 0 rade [av] # Future (I shall write) 48 | SFX V 0 rede [eui] 49 | SFX V 0 rangge [av] # 50 | SFX V 0 rengge [eui] # 51 | SFX V 0 rongge o # 52 | SFX V 0 rale [av] 53 | SFX V 0 rele [eui] 54 | SFX V 0 ralengge [av] 55 | SFX V 0 relengge [eui] 56 | SFX V 0 ralame [avi] 57 | SFX V 0 relame [eu] 58 | SFX V 0 lame [avi] 59 | SFX V 0 leme [eu] 60 | SFX V 0 ci . # Conditional (should I write) 61 | SFX V 0 cibe . # Adversative (although he may write) 62 | SFX V 0 cina . # Concessive (may he write) 63 | SFX V 0 ki . # Subjunctive Present (may he write) 64 | SFX V 0 kini . # Optative (would that he wrote) 65 | SFX V 0 nggala [avi] # Gerund III. (before writing) 66 | SFX V 0 nggele [eu] 67 | SFX V 0 nggolo o 68 | SFX V 0 rakv . 69 | SFX V 0 rakvngge [avi] 70 | SFX V 0 rekvngge [eu] 71 | 72 | # Verb -fi form 73 | SFX f Y 1 74 | SFX f 0 fi . # Past Gerund (having written) 75 | 76 | # Verb -pi form 77 | SFX p Y 1 78 | SFX p 0 pi . # Past Gerund (having written) 79 | 80 | # Verb -h[aeo] form 81 | SFX h Y 34 82 | SFX h 0 ha [auvi] # Preterite (I wrote) 83 | SFX h 0 he [eui] 84 | SFX h 0 ho o 85 | SFX h 0 hade [auvi] # Preterite (I wrote) 86 | SFX h 0 hede [eu] 87 | SFX h 0 hode o 88 | SFX h 0 habi [auvi] # Indefinite Past (I have written) 89 | SFX h 0 hebi [eu] 90 | SFX h 0 hobi o 91 | SFX h 0 habikai [auvi] 92 | SFX h 0 hebikai [eu] 93 | SFX h 0 hobikai o 94 | SFX h 0 habihe [auvi] # Pluperfect (I had written) 95 | SFX h 0 hebihe [eu] 96 | SFX h 0 hobihe o 97 | SFX h 0 habici [auvi] # Past Conditional (if I had written) 98 | SFX h 0 hebici [eu] 99 | SFX h 0 hobici o 100 | SFX h 0 hangge [auvi] # 101 | SFX h 0 hengge [eu] # 102 | SFX h 0 hongge [eu] # 103 | SFX h 0 hale [auvi] # 104 | SFX h 0 hele [eu] # 105 | SFX h 0 halengge [auvi] # 106 | SFX h 0 helengge [eu] # 107 | SFX h 0 hakv [auvi] 108 | SFX h 0 hekv [eu] 109 | SFX h 0 hokv o 110 | SFX h 0 hakvbi [auvi] 111 | SFX h 0 hekvbi [eu] 112 | SFX h 0 hokvbi o 113 | SFX h 0 hai [auvi] 114 | SFX h 0 hei [eu] 115 | SFX h 0 hoi o 116 | 117 | # Verb -k[aeo] form 118 | SFX k Y 25 119 | SFX k 0 ka [auvi] # Preterite (I wrote) 120 | SFX k 0 ke [eu] 121 | SFX k 0 ko o 122 | SFX k 0 kabi [auvi] # Indefinite Past (I have written) 123 | SFX k 0 kebi [eu] 124 | SFX k 0 kobi o 125 | SFX k 0 kabihe [auvi] # Pluperfect (I had written) 126 | SFX k 0 kebihe [eu] 127 | SFX k 0 kobihe o 128 | SFX k 0 kabici [auvi] # Past Conditional (if I had written) 129 | SFX k 0 kebici [eu] 130 | SFX k 0 kobici o 131 | SFX k 0 kangge [auvi] # 132 | SFX k 0 kengge [eu] # 133 | SFX k 0 kongge [eu] # 134 | SFX k 0 kale [auvi] # 135 | SFX k 0 kele [eu] # 136 | SFX k 0 kalengge [auvi] # 137 | SFX k 0 kelengge [eu] # 138 | SFX k 0 kakv [auvi] 139 | SFX k 0 kekv [eu] 140 | SFX k 0 kokv o 141 | SFX k 0 kai [auvi] 142 | SFX k 0 kei [eu] 143 | SFX k 0 koi o 144 | -------------------------------------------------------------------------------- /doc/how-to-create-new-aspell-dict-ko.md: -------------------------------------------------------------------------------- 1 | Aspell: 새로운 언어 사전 만들기 2 | ================================ 3 | 4 | 5 | 사전 템플릿 만들기 6 | -------------------------------- 7 | 8 | ### aspell-lang 다운로드 9 | 10 | aspell 사전을 만들기 위해서 필수적인 파일들이 있는데 직접 하나씩 만들어도 11 | 되지만 `aspell-lang`을 이용하여 기본적인 템플릿을 생성한 후에 내용을 채워넣으면 12 | 좀더 편리하다. 13 | 14 | 우선 aspell-lang을 다운받아야 한다. 최신 배포 파일을 찾아서 다운받아 압축을 15 | 풀면 된다. 예를 들어, 현재 최신 파일은 다음과 같다. 16 | 17 | $ curl -O ftp://ftp.gnu.org/gnu/aspell/aspell-lang-20101122.tar.gz 18 | $ tar xzvf aspell-lang-20101122.tar.gz 19 | 20 | 또는 다음처럼 CVS 저장소를 내려받아도 된다. 21 | 22 | $ cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/aspell co aspell-lang 23 | 24 | 25 | ### pre: 기본 디렉토리 생성 26 | 27 | 이제 `aspell-lang` 디렉토리로 들어가서 `pre LANG CHARSET` 명령을 내린다. 예를 28 | 들어, 만주어의 경우에 LANG은 `mnc`, CHARSET은 `iso-8859-1`을 쓴다고 하면 다음과 29 | 같이 명령을 내리면 된다. 30 | 31 | $ cd aspell-lang 32 | $ ./pre mnc iso-8859-1 33 | 34 | 이제 `mnc`라는 디렉토리가 새로 만들어진 것을 확인할 수 있다. 이 안에는 다음과 35 | 같은 파일들이 들어 있다. 36 | 37 | $ cd mnc 38 | $ ls 39 | Copyright info mnc.dat mnc.wl proc 40 | 41 | 이 파일에 적절한 내용을 채워넣어야한다. 어떤 내용을 채워넣을지는 다음 섹션에서 42 | 설명하겠다. 43 | 44 | ### LANG: 언어 코드 45 | 46 | 위에서 만주어를 위해 `mnc`라는 이름을 사용했다. 이 이름은 ISO 639의 언어명 47 | 코드를 따른다. 영어는 `en`, 한국어는 `ko` 등으로 두 글자짜리가 있으면 그것을 48 | 사용한다. 만주어의 경우에는 두 글자짜리 코드가 없기 때문에 세 글자짜리 코드 49 | `mnc`를 사용한 것이다. 50 | 51 | 경우에 따라서는 같은 언어의 사전이기는 하지만 차이를 구별하려고 할 수도 있다. 52 | 이때 사전 이름의 형식은 "언어명_지역-변이형-크기"를 따른다. 예를 들어, 영어는 53 | `en`인데 미국 영어는 `en_US`, 영국 영어는 `en_GB`, 캐나다 영어는 `en_CA`로 54 | 이름을 붙인다. 독일어는 `de`인데 옛날 철자법을 따르는 사전의 이름은 55 | `de-alt`로 붙이는 식이다. 56 | 57 | ### CHARSET: 문자 세트 58 | 59 | 위에서 만주어를 위해 `iso-8859-1` 문자세트를 사용했다. 이것은 유니코드의 첫 60 | 256글자와 같다. 영문자 알파벳만 사용하는 언어를 위해 사전을 만들 것이라면 61 | `iso-8859-1`을 사용하면 된다. 62 | 63 | aspell에서 말하는 문자 세트와 인코딩은 다른 것이다. aspell은 유니코드도 64 | 문제없이 다룰 수 있다. 다만 내부적으로는 8비트로 처리된다. 기본적으로 지원되는 65 | 문자세트는 `aspell-lang/maps` 디렉토리에 개별 파일로 들어있다. 66 | 67 | 지원하려는 언어가 사용하는 문자세트를 새로 만들어야 할 수도 있다. 유니코드 68 | 문자를 사용하는 경우에는 `u-.cmap`, `u-.cset` 파일, 영문자를 69 | 기본으로 하면서 추가적으로 몇개 문자가 더 필요한 경우에는 `l-.cmap`, 70 | `u-.cset` 파일로 문자세트를 정의해야한다. 71 | 72 | 예들 들어 살펴보자. 만주어를 표현하기 위해서 영문자 `a-z` 외에 두 개의 유니코드 73 | 문자 š (U+0161), ū (U+016B)가 필요하다고 하자. `asepll-lang/maps` 아래 다음과 74 | 같이 `l-mnc.txt`라는 이름의 파일을 만들자. 75 | 76 | include iso-8859-1.txt 77 | 78 | 0x80 U+0161 79 | 0x81 U+016B 80 | 81 | 여기서 `include iso-8859-1.txt`는 만주어 문자세트에 모든 아스키 문자를 82 | 포함하겠다는 의미이다. 그리고 아래쪽에 추가로 사용할 문자 목록을 써준다. 83 | `0x80`, `0x81`은 aspell에서 내부적으로 사용할 코드이다. 84 | 85 | 이제 `aspell-lang` 디렉토리에서 다음 명령으로 `l-mnc.cmap`과 `l-mnc.cset` 86 | 파일을 생성할 수 있다. 이 파일들을 `mnc` 디렉토리로 복사해 넣으면 된다. 87 | `l-mnc.txt`는 `mnc/misc` 아래 넣어주는 것이 일반적이다. 88 | 89 | $ ./mkchardata maps/l-mnc.txt 90 | $ cp maps/l-mnc.* mnc/ 91 | $ mkdir mnc/misc 92 | $ mv mnc/l-mnc.txt mnc/misc/ 93 | 94 | 기본 정보 작성 95 | -------------------------------- 96 | 97 | 이제 `mnc` 디렉토리에는 다음과 같은 파일들이 존재하는 상태가 되었다. 98 | 99 | $ ls 100 | Copyright info mnc.dat mnc.wl proc 101 | 102 | 여기서 `info`와 `LANG.dat`에 해당 사전에 대한 정보를 넣어주어야 한다. 103 | `LANG.wl`은 단어 목록(word list)인데 이에 대해서는 다음 섹션에서 설명하겠다. 104 | 105 | ### `info` 106 | 107 | 가장 먼저 `info`파일의 내용을 작성해 보자. 이 파일에는 해당 사전에 대한 정보가 108 | 기록된다. 예를 들어, 만주어의 경우 다음과 같이 만들 수 있다. 109 | 110 | name_english Manchu 111 | lang mnc 112 | data-file mnc_affix.dat 113 | author: 114 | name You Hyun Jo 115 | email you at cpan.org 116 | copyright GPLv3 117 | url https://github.com/youhyunjo/manchu-spell 118 | version 20130123-0 119 | source-version 20130123 120 | complete false 121 | accurate true 122 | alias mnc manchu 123 | dict: 124 | name mnc 125 | add mnc 126 | 127 | 이때 `data-file`에 명시한 파일들로 필수적인 파일이 된다. 단순히 단어목록만 모든 128 | 것이 해결되는 언어라면 추가적인 데이터 파일은 필요없다. 만주어의 경우에는 129 | 접사가 다양하게 변하는 언어이므로 접사 규칙을 사용할 필요가 있으므로 130 | `mnc_affix.dat`를 추가하였다. 131 | 132 | ### `LANG.dat` 133 | 134 | 이제 `LANG.dat` 파일의 내용을 작성해보자. 포함될 내용은 내용은 간단하다. 135 | 만주어의 경우에는 `mnc.dat`가 되고 다음과 같은 내용이 들어간다. 136 | 137 | name mnc 138 | charset iso-8859-1 139 | data-encoding utf-8 140 | affix mnc 141 | affix-compress true 142 | partially-expand true 143 | repl-table mnc_affix.dat 144 | special ' -** 145 | 146 | 아스키 문자만 사용한다면 `charset iso-8859-1`이 되고 별도의 문자 세트를 147 | 만들었다면 문자세트의 이름을 써주면 된다. 예를 들어, 앞서 만든 문자세트를 148 | 이용한다면 `charset l-mnc`라고 할 수 있다. 마지막 행의 `special`은 특수한 149 | 문자를 단어의 일부로 사용하기 위한 장치이다. Aspell 매뉴얼에서 자세한 설명이 150 | 나온다. 151 | 152 | ### 라이선스와 저작권 153 | 154 | 다음으로 저작권을 담은 Copyright 파일을 작성하자. 적당히 작성하면 된다. 널리 155 | 사용되는 라이선스를 위한 `COPYING` 파일은 자동으로 제공해 준다. 156 | 157 | ### `proc` 스크립트 158 | 159 | 이제 `proc` 스크립트를 이용하여 필요한 파일들을 자동으로 생성할 수 있다. 그런데 160 | `data-file`로 추가한 `mnc_affix.dat`가 없는 상태이다. 일단은 빈 파일을 만들어보자 161 | 그리고 `proc` 스크립트를 실행하자 162 | 163 | $ touch mnc_affix.dat 164 | $ ./proc 165 | 166 | 여러 가지 필요한 파일들이 만들어진다. `README`, `COPYING` 등이 제공되고 167 | `configure`, `Makefile.pre` , `.alias`, `.multi` 등이 만들어진다. 168 | 169 | 단어 목록과 접사 규칙 만들기 170 | -------------------------------- 171 | 172 | 모든 준비가 되었다. 이제 진짜 사전을 만들 차례이다. 단어 목록으로 해결되는 173 | 언어라면 `LANG.wl`을 만드는 것으로 충분하다. 단어목록 파일 `LANG.wl`은 한 행에 174 | 한 단어를 담고 있는 파일이다. 단어의 형태가 변하지 않는다면 그냥 단어 목록을 175 | 만드는 것으로 충분하다. 단어가 모양이 변한다면 단어목록과 접사규칙을 176 | 만들어야한다. 대개의 경우에는 접사 규칙이 필요하므로 `LANG_affix.dat`를 만들 177 | 필요가 있다. 178 | 179 | 만주어의 예를 들어 살펴보자. 만주어의 명사 beye는 beyei, beyede, beyebe로 180 | 변한다. 이때 -i, -de, -be는 접미사가 된다. 동사 arambi는 arame, arafi, araha, 181 | arara, araci로 변한다. ara-가 어간이고 -mbi, -me, -fi, -ha, -ra, -ci가 182 | 어미이다. 한편, 동사 genembi는 geneme, genefi, genehe, genere, geneci로 183 | 변한다고 하자. gene-가 어간이고 -mbi, -me, -fi, -he, -re, -ci가 어미이다. 184 | -ha/-he, -ra/-re는 어간의 형태에 따라 선택되는 것을 알 수 있다. 185 | 186 | 이때 `mnc.wl`을 다음과 만들어보자. 187 | 188 | beye/N 189 | ara/V 190 | gene/V 191 | 192 | 여기에서 `beye`, `ara`, `gene`는 어간이다. `N`과 `V`는 접사의 유형을 구별하는 193 | 장치이다. 하나의 그룹을 이루는 접사는 하나의 문자로 나타낼 수 있다. 194 | `mnc_affix.dat`에는 `N`, `V`라는 접사 그룹에 대한 규칙을 기술해야한다. 예를 195 | 들면 다음과 같다. 196 | 197 | SFX N Y 3 198 | SFX N 0 i . 199 | SFX N 0 de . 200 | SFX N 0 be . 201 | 202 | SFX V Y 8 203 | SFX V 0 mbi . 204 | SFX V 0 me . 205 | SFX V 0 fi . 206 | SFX V 0 ha a 207 | SFX V 0 he e 208 | SFX V 0 ra a 209 | SFX V 0 re e 210 | SFX V 0 ci . 211 | 212 | 첫 행의 `SFX`는 접미사(suffix)라는 의미이다. `N`는 접사유형을 구분하기 위한 213 | 이름이다. `Y`는 접두사(prefix)와 함께 나타날 수 있다는 의미이다. `3`은 접미사 214 | `N` 그룹에 3개의 규칙이 있다는 의미이다. 215 | 216 | 두번째 행부터는 실제 접미사 규칙이다. `SFX N`까지는 접미사 그룹 `N`이라는 217 | 의미이고 이어지는 3개 컬럼이 각각 어간에서 뺄 것, 더할 것, 조건를 나타낸다. 218 | `0 i .`에서 `0`은 어간에서 아무것도 빼지 않는다는 의미아다. `i`는 i를 219 | 덧붙인다는 의미이다. `.`은 조건에 제약이 없다는 의미이다. 220 | 221 | 이제 접미사 `V` 그룹을 보자. `SFX V 0 ha a`는 어간이 a로 끝날 때 아무 것도 빼지 222 | 않고 ha를 덧붙이라는 의미이다. `SFX V 0 he e`는 어간이 e로 끝날 때 아무 것도 223 | 빼지 않고 he를 덧붙이라는 의미이다. 따라서 ara/V는 araha로 확장되고 gene/V는 224 | genehe로 확장된다. 225 | 226 | 설치 227 | -------------------------------- 228 | 229 | 이제 모든 파일이 준비되었다. 설치를 하기 위해서는 우선 설치용 사전 파일을 230 | 만들어야 한다. 다음 명령으로 `LANG.cwl`을 만들고 `LANG.rws`를 만들 수 있다. 231 | 이것이 설치될 사전 파일이다. 232 | 233 | $ ./configure 234 | $ make 235 | 236 | 설치는 다음과 같이 한다. 237 | 238 | $ make install 239 | 240 | 물론 지금까지 만든 사전을 사용하기 위해서는 이를 위해서는 aspell 0.60 이후 241 | 버전이 설치되어 있어야한다. 242 | 243 | 사용하기 244 | -------------------------------- 245 | 246 | 다음 명령은 현재 시스템에 설치되어 있는 사전의 목록을 출력해준다. 247 | 248 | $ aspell dump dicts 249 | 250 | 설치한 사전의 어휘 목록을 출력해보자. `-l ` 옵션으로 언어를 지정한다. 251 | 만주어라면: 252 | 253 | $ aspell -l mnc dump master 254 | ara/V 255 | beye/N 256 | gene/V 257 | 258 | 설치된 사전의 접사 규칙이 제대로 작동하는지 알아보기 위하여 `expand`와 259 | `munch`를 사용해 볼 수 있다. 260 | 261 | $ echo 'ara/v' | aspell -l mnc expand 262 | ara araci arara araha arafi arame arambi 263 | $ echo 'araha' | aspell -l mnc munch 264 | araha ara/V 265 | 266 | 철자법 검사가 어떻게 작동하는지 확인하고 싶다면: 267 | 268 | $ echo 'arahe' | aspell -l mnc -a 269 | @(#) International Ispell Version 3.1.20 (but really Aspell 0.60.6.1) 270 | & arahe 2 0: araha, arame 271 | 272 | 배포하기 273 | -------------------------------- 274 | 275 | 사전이 제대로 만들어졌다고 확신한다면 배포할 수 있다. 배포할 파일은 사전 276 | 디렉토리에서 다음 명령으로 간단히 만들 수 있다. 277 | 278 | $ make dist 279 | 280 | 이 명령의 결과 `aspell6-mnc-2013012309.tar.bz2` 파일이 만들어진다. 이것을 281 | 배포하면 된다. 282 | 283 | Aspell 설치 284 | -------------------------------- 285 | 286 | Debian 계열 리눅스에서는 다음 명령으로 설치할 수 287 | 있다. 288 | 289 | $ sudo apt-get install 290 | 291 | MacOSX에서는 Homebrew를 이용하는 것이 가장 손쉬운 방법인 듯하다. 292 | 293 | $ brew install aspell 294 | 295 | 296 | MS Windows의 경우 297 | -------------------------------- 298 | 299 | MS Windows를 위한 것으로는 Aspell 0.5 버전까지만 공식적으로 지원된다. 이후 300 | 버전을 설치하는 것은 여러가지 문제가 있다. 2013년 1월 현재 다음 파일을 다운로드 301 | 받아 설치하는 것이 가장 간편한 듯하다. 302 | 303 | * http://nosq.com/download/aspell-0.60.3.exe 304 | 305 | 그리고 사전들이 들어있는 디렉토리를 찾아서 필요한 파일들을 모두 복사해서 306 | 넣어주면 된다. 위 설치 파일을 이용했다면 사전 디렉토리는 다음과 같다. 307 | 308 | * `C:\Program Files\Aspell\lib\aspell-0.60` 309 | 310 | 이 디렉토리에 `.alias`, `.multi`, `.dat`, `.rws`, `.cmap`, `.cset` 파일을 모두 311 | 복사해서 넣으면 된다. 312 | 313 | 그리고 명령프롬프트에서 사용하려면 환경변수 `PATH`에 `C:\Program 314 | Files\Aspell\bin`을 추가해주는 것이 좋다. 315 | 316 | ### Notepad++의 경우 317 | 318 | Notepad++의 Spell-Checker 플러그인은 aspell 0.5 버전만 지원한다. aspell 0.6 319 | 버전을 설치하면 작동하지 않는다. DLL파일의 이름이 0.5버전에서 320 | `aspell-15.dll`인데 aspell 0.60에서는 `libaspell-15.dll`로 바뀌었기 때문이다. 321 | 322 | `C:\Program Files\Aspell\bin` 디렉토리를 열어보면 `libaspell-15.dll`라는 파일이 323 | 있다. 이것을 복사하여 `aspell-15.dll`라는 이름으로 하나 더 만든 후에 넣어주면 324 | Notepad++에서도 잘 작동한다. 325 | 326 | 327 | --------------------------------------------------------------------------------