hunspell íêµì´ ë°ì´í°, ê°ë° ì ë³´ ì´ íì¼ì ìì¤ íì¼ì ëë¤. ë§ì¶¤ë² ê²ì¬ 기ë¥ì ì¬ì©íë ¤ë©´ ì´ ìì¤ íì¼ìì ë¹ëí AFF ë° DIC íì¼ì ì´ì©íê±°ë ì¬ë¬ ê°ì§ íì¥ ê¸°ë¥ì ì´ì©íììì¤. íë¡ì í¸ ì ë³´: http://code.google.com/p/spellcheck-ko/ ë¹ë ==== makeì Pythonì´ ì¤ì¹ëì´ ìë íê²½ìì make ëª ë ¹ì ì¤ííë©´ hunspellì´ ì¬ì©íë ë§ì¶¤ë² ì¬ì ë°ì´í°ì¸ ko.aff ë° ko.dic íì¼ì ë§ë¤ì´ ë¸ë¤. DIC íì¼ìë íì ì´ ë°ì´í°ê° ë¤ì´ ìê³ AFF (affix) íì¼ìë ë¨ì´ì íì© ì ë³´ê° ë¤ì´ê°ë¤. AFF íì¼ê³¼ DIC íì¼ì hunspellì ì ì ì¸ myspellììë ì´ì©íë íìì´ì§ë§ íêµì´ ë°ì´í°ë hunspellìë§ ë¤ì´ ìë 기ë¥ì´ íìí기 ë문ì hunspellììë§ ëìíë¤. DIC íì¼ê³¼ AFF íì¼ì ë´ì©ì íë¡ê·¸ë¨ì íµí´ ë§ë¤ì´ ë´ê¸° ë문ì ì§ì í¸ì§íì§ ìëë¡ íë¤. ë°ì´í°ë ì ëì½ëì íê¸ ì모 ì½ëë¡ (U+1100) ì°ì¬ ì기 ë문ì ìëí°ìì ì§ì í¸ì§íë©´ ìëí ëë¡ ëìíì§ ìëë¤. ìì¤ íë¡ê·¸ë¨ ============= ë°ì´í°ë¥¼ ë§ë¤ì´ ë´ë ìì¤ íë¡ê·¸ë¨ì Pythonì¼ë¡ ìì±ëì´ ìê³ , ìì íë ¤ë©´ ì ëì½ëì íê¸ ì½ë, í¹í íê¸ ì모 (U+1100, http://unicode.org/charts/PDF/U1100.pdf ì°¸ê³ ) ììì ì ìê³ ìì´ì¼ íë¤. 모ë íì¼ì UTF-8 ì¸ì½ë©ì¼ë¡ ìì±ëì´ ìì¼ë¯ë¡ UTF-8 ì¸ì½ë©ì í¸ì§í ì ìë ìëí°ë¥¼ ì¬ì©í´ì¼ íë¤. ì½ëì ë°ì´í° ì ì²´ì ê±¸ì³ ì ëì½ë를 ì¬ì©íë¯ë¡ ì¸ì½ë©ì ë°ê¾¸ë©´ ì¬ë°ë¥´ê² ëìíì§ ìëë¤. íë íê¸ë§ ì§ìíë¯ë¡ íë ìëª¨ë§ ì¬ì©íê³ ìíê¸ ì모ë ì¬ì©íì§ ìëë¤. ìë²½í¨ì ë°ì§ë¤ë©´ ìíê¸ ì모를 êµ³ì´ ëº íìë ìì§ë§, ìê³ ë¦¬ë¬ ì²ë¦¬ ìëê° ëë ¤ì§ê³ ì´ì°¨í¼ ì¤ì¸ êµì´ ë§ì¶¤ë² ê²ì¬ë¥¼ 구íí기ë ì´ë µë¤. ì¸ì½ë© 문ì ----------- í¸ì§ 거리 ê³ì° (insert/delete/replace) ìê³ ë¦¬ë¬ì´ íê¸ ìì ë¨ìê° ìëë¼ ì모 ë¨ìë¡ ëìíëë¡, ë íì ê·ì¹ì í¸ë¦¬íê² ìì±í ì ìëë¡ ë´ë¶ì ì¼ë¡ 모ë ì ëì½ëì íê¸ ì모 ì½ëë¡ (U+1100) ì²ë¦¬íë¤. ë문ì íê¸ ìì (U+AC00) ì½ëìì ì´ íê¸ ì모 ì½ëë¡ ë³ííê³ , ì´ ì½ë를 ë¤ì íê¸ ìì ë¡ ë³ííë ì ëì½ë ì ê·í ë³íì í´ì¼ íëë° AFF íì¼ì ICONV ë° OCONV í¤ìë를 ì´ì©íë¤. ì´ ë문ì hunspell 1.2.8 ì´ì ë²ì ì´ íìíë¤. AFF íì¼ì í¬ê¸°ê° 커ì§ê³ ë©ëª¨ë¦¬ ì¬ì©ëì´ ì½ê° ë¶ë´ì¤ë½ì§ë§ í¥íìë hunspell ë´ë¶ìì ì§ì ì´ ì½ë ë³íì ì§ìí ìë ìì ê²ì´ë¤. hunspell 1.2.8ìì 1.2.11ê¹ì§ ë²ì ì ì¬ì©í ê²½ì° ì ¸ìì ì¤ííë hunspell ëª ë ¹ì´ììë ìì²´ ë´ì¥ë tokenizerìì (문ìì´ì ë¨ì´ ë¨ìë¡ êµ¬ë¶íë 기ë¥ì ë§íë¤) íê¸ ìì ë¡ êµ¬ì±ë ë¨ì´ë¥¼ ë¶ë¦¬íì§ ëª»íë¤. ê·¸ëì ì ¸ìì hunspell ëª ë ¹ì ì¤íí ê²½ì° ë§ì¶¤ë² ê²ì¬ê° ì¬ë°ë¥´ê² ëìíì§ ìëë¤. ì´ ë¬¸ì 를 ë°ë¡ì¡ì hunspell 1.2.12 ì´í ë²ì ì ì¬ì©í´ì¼ íë¤. ì ¸ìì ì¬ì©íë ëª ë ¹ì´ê° ìëë¼ hunspell ë¼ì´ë¸ë¬ë¦¬ë§ ì¬ì©íë ë¤ë¥¸ ìì© íë¡ê·¸ë¨ì tokenizer를 ìì²´ 구ííë¯ë¡ ì´ ë¬¸ì ê° ë°ìíì§ ìëë¤. ë hunspell 1.2.8 ì´íìë ICONV ë° OCONV í¤ìëë ì ë ¥ ë¨ì´ì ì¶ì² ë¨ì´ìë§ ì ì©ëë 문ì ê° ìë¤. hunspell ëª ë ¹ì´ìì íìì´ë¥¼ ì ë ¥íë©´ ê²°ê³¼ê° "+"ë¡ ëíëë©´ì ì´ê·¼ì´ íìëëë°, ì´ ë¬¸ì ë문ì ì´ê·¼ì´ íê¸ ìëª¨ë¡ ë¶ë¦¬ëì´ ë¤ìê³¼ ê°ì 모ìì¼ë¡ (íê¸ ì모 ì¸ì½ë©ì¼ë¡) ëíë ì ìë¤. ì¬ëì´ + ã ã ã¹ã ã ë³ë¡ ì¤ìíì§ ìì¼ë¯ë¡ ì´ëë¡ ì¬ì©í´ë ìê´ ìì§ë§ ëì ê±°ì¬ë¦°ë¤ë©´ ì¶ë ¥íë ë´ì©ì NFCë¡ ì ê·ííë©´ ëë¤. ìì¤ì ë¤ì´ ìë utils/jamo2syl.py ì¤í¬ë¦½í¸ê° ì´ ìí ì íë¤. $ hunspell -d ko | ./utils/jamo2syl.py ì¬ëì´ + ì¬ë ì¬ì ë°ì´í° =========== ì¬ì ë°ì´í°ë "ê°í´" ì¨ë¼ì¸ ìì¤í ìì ë§ë¤ì´ì ¸ì, 리뷰를 ê±°ì¹ ë¨ì´ 모ìì XML íìì¼ë¡ exportí´ ì´ ìì¤ íì¼ë¡ ê°ì ¸ì¨ë¤. Python ì½ëê° ì´ ë°ì´í°ë¥¼ ì½ì´ DIC íì¼ì ë§ë ë¤. ëëµì ì¬ì íì: <?xml version="1.0"?> <entries> <Entry> <word>íë°</word> <pos>ëª ì¬</pos> <props>ê°ì°ëª ì¬</props> <etym>homerun</etym> <comment>ì¼êµ¬</comment> </Entry> </entries> ê°í´ ë°ì´í°ë² ì´ì¤ììë 과거ì ì ë ¥í ì¬ì ì´ ëª¨ë 기ë¡ì¼ë¡ ë¨ì ìë¤. íì§ë§ ì´ ìì¤ ì½ëìë ê°í´ ë°ì´í°ë² ì´ì¤ìì íì¬ ì í¨í ì¬ì ìí¸ë¦¬ë§ ë¤ì´ ìë¤. ìë ì ë ¥í ë°ì´í°ë§ ì¬ì© ------------------------- ë§ì¶¤ë² ê²ì¬ì ì±ë¥ì ë¨ì´ ë°ì´í°ì ìì±ëì í¬ê² ì¢ì°ëë¤. ê·¸ëì ì¸ë¶ì ê³µê°ëì´ ìë ë¤ë¥¸ ë¨ì´ ë°ì´í°ë¥¼ ì ì°¾ìì ì ë ¥íë©´ ê°ë¨í ë§ì¶¤ë² ê²ì¬ì íì§ì ëì¼ ì ìì§ ììê¹ ìê°í기 ì½ë¤. íì§ë§ ì¸ë¶ ë°ì´í°ë ë¼ì´ì ì¤ ë ¼ëì ì¬ì§ê° ìì¼ë¯ë¡ ì¬ì©íì§ ìê³ , ë°ë¥ë¶í° ììí´ì ì§ì ìëì¼ë¡ ì ë ¥í ë°ì´í°ë§ ì¬ì©íëë¡ íë¤. íì¬ê¹ì§ ì¡°ì¬í´ ë´¤ì§ë§ ì¸í°ë·ìì ë¤ì´ë¡ëí ì ìë ì¬ë¬ê°ì§ ìë£ ì¤ììë ìì ë¡ì´ ë¼ì´ì ì¤ë¡ ë°°í¬íì ë ì ìê¶ ë¬¸ì ë ë¼ì´ì ì¤ ì¶©ëì ì¼ì¼í¤ì§ ìëë¤ê³ íì í ì ìë ë¨ì´ ë°ì´í°ë ì°¾ì ì ììë¤. ë¨ì´ ì ë³´ì ê°ì ì¢ ë¥ì ë³´í¸ì ì¸ ë°ì´í°ë ë ì°½ì ì¸ ì ìë¬¼ì´ ìëë¼ ì¼ë°ì ì¸ ì¬ì¤ì 모ìì´ê¸° ë문ì ì ìê¶ì 주ì¥í ìë ìë¤ë í´ìë ìì§ë§, ì´ë¬í ë°ì´í°ë¥¼ ë ì ì ì¸ ë¼ì´ì ì¤ì í매íë 기ì ì´ë ì°êµ¬ 기ê´ë ìë¤. ì¡°ê¸ì ë ¼ëì´ë¼ë ë°ìí ê°ë¥ì±ì´ ìë¤ë©´ í¼í´ ê°ë ¤ê³ íë¤. ë§ì½ ë ì ì ì¸ ë¼ì´ì ì¤ê° ìê±°ë ì¶ì²ê° ëª ííì§ ìì ì¸ë¶ì ë°ì´í°ë¥¼ ë³íí´ ì¬ì©íë¤ë©´ ë§¤ë² ì´ë¬í ë ¼ëì ìë¬ë¦´ ê²ì´ê³ ì¤ì§ì ì¼ë¡ 리ë ì¤ ë°°í¬í ë± ë¤ë¥¸ ìíí¸ì¨ì´ í¨í¤ì§ì í¬í¨ëì§ ëª»íë¤. ê³µê°ë ê°ë° 커뮤ëí°ì íì¼ë¡ ì¬ì ë°ì´í°ë¥¼ ë°ë¥ë¶í° ë§ë¤ì´ ê°ë ìì ì ì½ì§ ìì§ë§ 충ë¶í ê°ë¥í ì¼ì´ë¤. ì²ì ììí ëë ì¼ììíì ë³´ì´ë ë¨ì´ë¥¼ ì ë ¥íê±°ë, ì¹ ë¬¸ììì ëë½ë ë¨ì´ë¥¼ íëì© ì ë ¥íë ë°©ë²ì¼ë¡ ë¨ê¸°ê°ì 꽤 ì¸ ë§í ë¨ì´ 모ìì ë§ë¤ ì ììê³ , ì§ìì ì¼ë¡ ê´ë¦¬íë©´ 충ë¶í ìì±ë ëì ë°ì´í°ê° ë§ë¤ì´ì§ ê²ì´ë¤. íëëì´, ë´ë§í¬ì´, ë ¸ë¥´ì¨ì´ì´ ë±, ì¸ì´ ì¬ì©ìê° íêµì´ë³´ë¤ í¨ì¬ ì ì ë¤ë¥¸ ì¸ì´ì ë§ì¶¤ë² ì¬ì ë ì°¸ì¬íë ì¬ëë¤ì íì¼ë¡ íì§ ëì ë°ì´í°ë¥¼ ì¶ì íë¤. ë¨ì´ íì¬ --------- "ëª ì¬" "ëëª ì¬" "ëì¬" "íì©ì¬" "ê°íì¬" "ê´íì¬" "ë¶ì¬" ì¼ë° íì¬. 문ë²ìì ë¤ë£¨ë 9íì¬ ì¤ìì ìì¬ì ì¡°ì¬ë íì¬ ë°ë¡ ì²ë¦¬íë¯ë¡ ë¨ì´ ë°ì´í°ì ë°ë¡ ì°ì§ ìëë¤. "í¹ì:ê¸ì§ì´" í¹ë³í í린 ë¨ì´ë¡ ì·¨ê¸í ë¨ì´. ì¬ì ì 기ì¬ëì´ ìì§ ìì¼ë©´ í린 ë¨ì´ë¡ ì·¨ê¸í기 ë문ì ì¼ìì ì¼ë¡ í리ë ë¨ì´ë¥¼ ì¬ê¸°ì 기ì í íìë ìê³ , ì¬ì ì ìë ë¤ë¥¸ ë¨ì´ì íì©ì íµí´ íìë ì ìì§ë§ ìì¸ì ì¼ë¡ í린 ë¨ì´ì´ê±°ë, ê±°ì ì°ì§ ìë ë¨ì´ì´ê³ ì못 ì¼ì ê°ë¥ì±ì´ í¨ì¬ ëì ë¨ì´ì ê²½ì° ì´ë ê² ì´ë¤. (ì를 ë¤ì´, "íì¼"ì "í"+"ì´ë¤"+"-ã¹"ì´ë¼ê³ ìê°í ìë ìì§ë§, "íì¼"ì ì못 ì°ë ê²½ì°ê° ëë¶ë¶ì´ë¯ë¡ ê¸ì§ì´ë¡ ì·¨ê¸íë¤.) "í¹ì:íìí" íìë ííë§ ì£¼ë¡ ì°ì´ë ì íì ì¸ ë¨ì´ë íìë íí를 기ë¡íë¤. ("ê°ë¼ì¬ë", "ë¨ì¹¼ì" ë±) "í¹ì:ë³µìì 미ì¬" "í¹ì:ì«ì" "í¹ì:ìíë²³" "í¹ì:ì:<ì리ì>" ë´ë¶ì ì¼ë¡ ì 미ì´, í©ì±ì´ë¥¼ ìí´ ì¬ì©. ìë¡ ì¶ê°í ì¼ ìì. ë¨ì´ íì¬ ì¸ë¶ ë¶ë¥ ------------------- "ëª ì¬:ê³ ì :ì¸ë¬¼" "ëª ì¬:ê³ ì :ì§ì" "ëª ì¬:ê³ ì :기ê´" "ëª ì¬:ê³ ì :êµê°" (íì¬ êµ¬íëì§ ìì) ê³ ì ëª ì¬ ë¶ë¥. ì¤ì ëìíëë° ì°¨ì´ ìì. "ë¶ì¬:ìí" "ë¶ì¬:ì±ì" "ë¶ì¬:ì§ì" "ë¶ì¬:ì ë" "ë¶ì¬:ë¶ì ", "ë¶ì¬:ìí" "ë¶ì¬:ì ì" ë¶ì¬ì ì¸ë¶ ë¶ë¥. ìíë¶ì¬, ì±ìë¶ì¬, ì§ìë¶ì¬, ì ëë¶ì¬, ë¶ì ë¶ì¬, ìíë¶ì¬, ì ìë¶ì¬. ì´ ë¶ë¥ì ë°ë¼ ë³´ì¡°ì¬ë¥¼ íì©íëë ì¬ë¶ê° ë¬ë¼ì§ë¤. ìíë¶ì¬, ì±ìë¶ì¬, ì ëë¶ì¬, ìíë¶ì¬ì ê²½ì°ë§ ë³´ì¡°ì¬ë¥¼ ë¶ì¼ ì ìë¤. ë¨ì´ ìì± --------- "ê°ì°ëª ì¬" -ë¤ ì 미ì´ë¥¼ ë¶ì¼ ì ìë ëª ì¬, ëëª ì¬ "ë¨ìëª ì¬" ìëì ëíë´ë ëª ì¬, ìë¼ë¹ì ì«ì ë¤ì ë¶ì¬ ì°ê¸° ê°ë¥ "ë¹ìì´" (ìì§ êµ¬íëì§ ìì) ë¹ìì´ ëª ì¬, ì´ ìì±ì´ ë¤ì´ ìë ë¨ì´ë í린 ë¨ì´ë¡ ì·¨ê¸íì§ë ìì§ë§ ì¶ì² ë¨ì´ìì ì ì¸ëë¤. "ã·ë¶ê·ì¹" "ã ë¶ê·ì¹" "ã ë¶ê·ì¹" "ã ë¶ê·ì¹" "ë¬ë¶ê·ì¹" "르ë¶ê·ì¹" "ì°ë¶ê·ì¹" "ì¼ë¶ê·ì¹" ë¶ê·ì¹íì© ì©ì¸ ì¬ ë¶ê·ì¹ íì© (~íë¤ ííì ì©ì¸), 리ì ë¶ê·ì¹ (리ì íë½) íì©ì ë°ë¡ ì°ì§ ìëë¤. (ë³ëë¡ ì°ì§ ììë ì ì ìì¼ë¯ë¡.) ê±°ë¼ ë¶ê·ì¹ (~ê°ë¤ ííì ì©ì¸) ë° ëë¼ ë¶ê·ì¹ (~ì¤ë¤ ííì ì©ì¸) ìì ë°ë¡ ì°ì§ ììë ëë¤. í êµì¡ ê³¼ì ì íêµ ë¬¸ë² ë° 2008ë ê°ì ë íì¤êµì´ëì¬ì ì ë°ë¼ "-ê±°ë¼" ë° "-ëë¼" ì´ë¯¸ë "-ì´ë¼"/"-ìë¼"ì ë¶ê·ì¹ íì© ííê° ìëë¼ ë³ê°ì ì´ë¯¸ë¡ ì·¨ê¸íë¤. ì° ë¶ê·ì¹ íì©ì "í¸ë¤" ì¸ìë ìì¼ë¯ë¡ ìë¡ ì¶ê°í ì¼ ìì. "ë³´ì¡°ì©ì¸:-ì´" ë¤ë¥¸ ì©ì¸ì -ì´ íí ë¤ì ë¶ì¬ ì¸ ì ìë ë³´ì¡°ì©ì¸ "ë³´ì¡°ì©ì¸:-ì" ë¤ë¥¸ ì©ì¸ì -ì íí ë¤ì ë¶ì¬ ì¸ ì ìë ë³´ì¡°ì©ì¸. ìê° íì ëì´ ìì¼ë¯ë¡ ìë¡ ì¶ê°í ì¼ ìì. "ë§íë¤", "ë²íë¤", "ë¯ì¶ë¤", "ë¯íë¤", "ë»íë¤", "ì±ì¶ë¤" "ë³´ì¡°ì©ì¸:-ì" ë¤ë¥¸ ì©ì¸ì -ì íí ë¤ì ë¶ì¬ ì¸ ì ìë ë³´ì¡°ì©ì¸. ìê° íì ëì´ ìì¼ë¯ë¡ ìë¡ ì¶ê°í ì¼ ìì. "ìíë¤", "ì²´íë¤", "ë¯ì¶ë¤", "ë¯íë¤", "ì©ì¸í©ì±" ì©ì¸+ì©ì¸ ííì í©ì± ì©ì¸. ì´ë¬í ííë ë¤ì ë³´ì¡° ì©ì¸ì ë¶ì¬ ì¸ ì ìë¤. "ì¤ë§ì©ì¸" ë¤ë¥¸ ì©ì¸ìì ìì ì´ ë°ì¹¨ì¼ë¡ ì¤ì¬ì§ ííì ì©ì¸. ë¤ì 모ìì¼ë¡ ììíë ì´ë¯¸ê° ì¬ ì ìë¤. "ê°ë¤"(ê°ì§ë¤), "머물ë¤"(머무르ë¤), "ìí´ë¤"(ìí¬ë¥´ë¤), "ëë¤"(ëëë¤) ë°ì.