$Id: bindings.html 65 2007-01-30 00:52:53Z taku-ku $;
°¢Á¾ ½ºÅ©¸³Æ® ¾ð¾î (perl, ruby, python, Java) (À¸)·ÎºÎÅÍ, MeCab ÇÏÁö¸¸ Á¦°øÇÏ´Â ÇüÅÂ¼Ò Çؼ®ÀÇ ±â´ÉÀ» ÀÌ¿ë °¡´ÉÇÕ´Ï´Ù. °¢ ¹ÙÀεùÀº SWIG ±×·¸´Ù°í ÇÏ´Â ÇÁ·Î±×¶ó ¹«¸¦ ÀÌ¿ëÇØ, ÀÚµ¿ »ý¼ºµÇ°í ÀÖ½À´Ï´Ù. SWIG ÇÏÁö¸¸ ¼Æ÷Æ®ÇÏ´Â ´Ù¸¥ ¾ð¾îµµ »ý¼º °¡´ÉÇÏ´Ù°í »ý°¢µË´Ï´Ù¸¸, ÇöÀç´Â, ÀÛÀÚÀÇ °ü¸®ÇÒ ¼ö ÀÖ´Â ¹üÀ§³»¶ó°í ÇÏ´Â °ÍÀ¸·Î, »ó±âÀÇ4 °³ÀÇ ¾ð¾î¸¸À» Á¦°øÇÏ°í ÀÖ½À´Ï´Ù.
°¢ ¾ð¾î ¹ÙÀ̵ò±×ÀÇ ÀνºÅç ¹æ¹ýÀº, perl/README, ruby/README, python/README, java/README (À»)¸¦ ºÁ ÁÖ¼¼¿ä.
MeCab::Tagger ±×·¸´Ù°í Çϴ Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇØ, parse ( ȤÀº parseToString) ±×·¸´Ù°í ÇÏ´Â ¸Þ¼Òµå¸¦ ºÎ¸£´Â °ÍÀ¸·Î, Çؼ® °á°ú°¡ ¹®ÀÚ¿·Î¼ ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù. MeCab::Tagger ÀÇ constructor¡¡ ¡¡ ÀÇ Àμö´Â, ±âº»ÀûÀ¸·Î mecab ÀÇ ½ÇÇà Çü½Ä¿¡°Ô ÁÖ¾î ÆĶó¹ÌÅÍ¿Í µ¿ÀÏÇÏ°í, ±×°ÍµéÀ» ¹®ÀÚ¿·Î¼ ÁÝ´Ï´Ù.
use MeCab; $m = new MeCab::Tagger ("-Ochasen"); print $m->parse (" ¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é");
require 'MeCab' m = MeCab::Tagger.new ("-Ochasen") print m.parse (" ¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é")
import sys import MeCab m = MeCab.Tagger ("-Ochasen") print m.parse (" ¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é")
import org.chasen.mecab.Tagger; import org.chasen.mecab.Node public static void main(String[] argv) { Tagger tagger = new Tagger ("-Ochasen"); System.out.println (tagger.parse (" Ÿ·Î´Â Áö·Î¿ì¿¡ ÀÌ Ã¥À» °Ç³×ÁÖ¾ú´Ù.")); }
MeCab::Tagger Ŭ·¡½ºÀÇ, parseToNode ±×·¸´Ù°í ÇÑ´Ù ¸Þ¼Òµå¸¦ ºÎ¸£´Â °ÍÀ¸·Î, ¡¸¹®µÎ¡¹¶ó°í Çϴ Ưº°ÇÑ ÇüżҰ¡ MeCab::Node Ŭ·¡½ºÀÇ ÀνºÅϽº·Î¼ ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù.
MeCab::Node ÇÏ, ½Ö¹æÇâ ¸®½ºÆ®·Î¼ Ç¥ÇöµÇ°í ÀÖ¾î, next, prev ±×·¸´Ù°í ÇÏ´Â ¸à ¹Ù º¯¼ö°¡ ÀÖ½À´Ï´Ù. °¢°¢, ´ÙÀ½ÀÇ ÇüżÒ, ÀüÀÇ ÇüżҸ¦ MeCab::Node Ŭ·¡½ºÀÇ ÀνºÅϽº·Î¼ µ¹·ÁÁÝ´Ï´Ù. ÀüÇüÅ ¼ø¼öÇÏ°Ô´Â, next (À»)¸¦ Â÷·ÊÂ÷·Ê ºÎ¸£´Â °ÍÀ¸·Î ¾×¼¼½º ÇÒ ¼ö ÀÖ½À´Ï´Ù.
MeCab::Node ÇÏ C ¾ð¾îÀÇ interface·Î Á¦°øÇÏ°í ÀÖ´Ù mecab_node_t (À»)¸¦ ¶ô ÇÁ ÇÑ Å¬·¡½ºÀÔ´Ï´Ù. mecab_node_t ÇÏÁö¸¸ °¡Áö´Â °ÅÀÇ ¸ðµç ¸â¹ö º¯¼ö¿¡ ¾×¼¼½º ÀÏÀÌ »ý±é´Ï´Ù. ´Ù¸¸, surface ¸¶¼Å, ´Ü¾î ±× ÀÚü°¡ µ¹¾Æ°¡µµ·Ï(µíÀÌ) º¯°æÇØ ÀÖ½À´Ï´Ù.
ÀÌÇÏ¿¡ perl ÀÇ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù. ÀÌ ¿¹¿¡¼´Â, °¢ ÇüżҸ¦ Â÷·ÊÂ÷·Ê ¾×¼¼½º ÇØ, ÇüżÒÀÇ Ç¥Ãþ ¹®ÀÚ¿, Ç°»ç, ±× ÇüżұîÁöÀÇ ÄÚ½ºÆ®¸¦ Ç¥½ÃÇÕ´Ï´Ù.
use MeCab; my $m = new MeCab::Tagger (""); for (my $n = $m->parseToNode (" ¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é"); $n ; $n = $n->{next}) { printf ("%st%st%dn", $n->{surface}, # Ç¥Ãþ $n->{feature}, # ÇöÀçÀÇ Ç°»ç $n->{cost} # ±× ÇüżұîÁöÀÇ ÄÚ½ºÆ® ); }
¸¸¾à, constructor¡¡ ¡¡ À̳ª, Çؼ® µµÁß¿¡ ¿¡·¯°¡ ÀϾÀ» °æ¿ì´Â, RuntimeError ¿¹¿Ü°¡ ¹ß»ýÇÕ´Ï´Ù. ¿¹¿ÜÀÇ Çڵ鸵ÀÇ ¹æ¹ýÀº, °¢ ¾ð¾îÀÇ ÂüÁ¶ ¼³¸í¼¸¦ ºÁÁÖ¼¼¿ä. ÀÌÇÏ´Â, python ÀÇ ¿¹ÀÔ´Ï´Ù
try: m = MeCab.Tagger ("-d .") print m.parse (" ¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é") except RuntimeError, e: print "RuntimeError:", e;
parseToNode ÀÇ µ¹¾Æ°¡ °ªÀº, ¡¸¹®µÎ¡¹¶ó°í Çϴ Ưº°ÇÑ ÇüżҸ¦ ³ªÅ¸³½´Ù MeCab::Node ÀÎź½ºÀÔ´Ï´Ù. ÇÑÃþ ´õ, ¡¸¹®¸»¡¹À̶ó°í Çϴ Ưº°ÇÑ Çüżҵµ Á¸ÀçÇϹǷÎ, ÁÖÀÇÇØ ÁÖ¼¼¿ä. ¸¸¾à, À̰͵éÀ» ¹«½ÃÇÏ°í ½ÍÀº °æ¿ì´Â, ÀÌÇÏ¿Í °°ÀÌ next ±×¸®°í °¢°¢À» ÀÐ¾î ³¯·Á ÁÖ¼¼¿ä.
my $n = $m->parseToNode (" ¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é"); $n = $n->{next}; # ¡¸¹®µÎ¡¹¸¦ ¹«½Ã while ($n->{next}) { # next (À»)¸¦ Á¶»çÇÑ´Ù printf ("%sn", $n->{surface}); $n = $n->{next}; # ´ÙÀ½¿¡ À̵¿ }
MeCab::Node ÀÇ ½Çü( ¸Þ¸ð¸®»ó¿¡ ÀÖ´Â ÇüÅÂ¼Ò Á¤º¸) ÇÏ, MeCab::Tagger ÀνºÅϽº°¡ °ü¸®ÇÏ°í ÀÖ½À´Ï´Ù. MeCab::Node ÇÏ, Node ÀÇ ½Çü¸¦ °¡¸®Å°°í ÀÖ´Ù ÂüÁ¶ ¿¡ Áö³ª ¼±. ±× ¶§¹®¿¡(À§ÇØ), parseToNode ÇÏÁö¸¸ ºÒ¸± ¶§¸¶´Ù, ½Çü ±× ÀÚü°¡, µ¡¾²±âµÇ¾î¼ °©´Ï´Ù. ÀÌÇÏ¿Í °°Àº ¿¹´Â ¼Ò½ºÀÇ ÀǵµÇÏ´Â ´ë·Î´Â ¿òÁ÷ÀÌÁö ¾Ê½À´Ï´Ù.
m = MeCab.Tagger ("") n1 = m.parseToNode (" ¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é") n2 = m.parseToNode (" ¾Æ»è¾Æ»è º¢²É") # n1 ÀÇ ³»¿ëÀº ¹«È¿°¡ µÇ¾î ÀÖ´Ù while (n1.hasNode () != 0): print n1.getSurface () n1 = n1.next ()
»ó±âÀÇ ¿¹¿¡¼´Â, n1 (ÀÌ)°¡ °¡¸®Å°´Â ³»¿ëÀÌ, ¡¸¾Æ»è¾Æ»è º¢²É¡¹À» Çؼ®ÇÑ ½ÃÁ¡¿¡¼ µ¡¾²±âµÇ°í ÀÖ¾î, »ç¿ëÇÒ ¼ö ¾ø°Ô µÇ°í ÀÖ½À´Ï´Ù.
º¹¼öÀÇ Node (À»)¸¦ µ¿½Ã¿¡ ¾×¼¼½º ÇÏ°í ½ÍÀº °æ¿ì´Â, º¹¼öÀÇ MeCab::Tagger ÀνºÅϽº¸¦ »ý¼ºÇØ ÁÖ¼¼¿ä.
ÀÌÇÏ¿¡, SWIG ¿ë¹«ÀÇ ÀÎÅÍÆäÀ̽º ÆÄÀÏ ÀÇ ÀϺθ¦ ³ªÅ¸³À´Ï´Ù. ¹ÙÀ̵ò±×ÀÇ ½ÇÀå ¾ð¾îÀÇ ÇüÆí»ó, C++ ÀÇ ¹®À屸Á¶¹ýÀ¸·Î Ç¥±âµÇ°í ÀÖ½À´Ï´Ù¸¸, Àû´ç Àб⳪ ¶ó°í ÁÖ¼¼¿ä. ¶Ç, °¢ ¸Þ¼ÒµåÀÇ µ¿ÀÛµµ ´õÇØÁ®¶ó (ÀÌ)¶ó°í Àֱ⠶§¹®¿¡ Âü°í·Î ÇØ ÁÖ¼¼¿ä.
namespace MeCab { class Tagger { // str (À»)¸¦ Çؼ®ÇØ ¹®ÀÚ¿·Î¼ °á°ú¸¦ ¾ò½À´Ï´Ù. len ÇÏ str ÀÇ ±æÀÌ( »ý·« °¡´É) string parse(string str, int len); // parse (¿Í)°ú °°´Ù string parseToString(string str, int len); // str (À»)¸¦ Çؼ®ÇØ MeCab::Node ÇüÅÂÀÇ ÇüżҸ¦ µ¹·ÁÁÝ´Ï´Ù. // ÀÌ ÇüżҴ ¹®µÎ¸¦ ³ªÅ¸³»´Â °ÍÀ¸·Î, next (À»)¸¦ ¼ø¼¿¡ ´õµë´Â °ÍÀ¸·Î ÀüÇüÅ ¼ø¼öÇÏ°Ô ¾×¼¼½º ÇÒ ¼ö ÀÖ½À´Ï´Ù Node parseToNode(string str, int len); // parse ÀÇ Nbest ÆÇÀÔ´Ï´Ù. N ¿¡ nbest ÀÇ °³¼ö¸¦ ÁöÁ¤ÇÕ´Ï´Ù. // ÀÌ ±â´ÉÀ» »ç¿ëÇÏ´Â °æ¿ì´Â, ±âµ¿½Ã ¿É¼ÇÀ¸·Î¼ -l 1 (À»)¸¦ ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù string parseNBest(int N, string str, int len); // Çؼ® °á°ú¸¦, È®½ÇÇÑ °Í °°Àº °ÍÀ¸·ÎºÎÅÍ Â÷·Ê·Î ÃëµæÇÏ´Â °æ¿ì¿¡ ÀÌ ÇÔ¼ö·Î Ãʱâȸ¦ ½Ç½ÃÇÕ´Ï´Ù. bool parseNBestInit(string str, int len); // parseNbestInit() ÀÇ ÈÄ, ÀÌ ÇÔ¼ö¸¦ Â÷·ÊÂ÷·Ê ºÎ¸£´Â °ÍÀ¸·Î, È®½ÇÇÑ °Í °°Àº Çؼ® °á°ú¸¦, Â÷·Ê·Î ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù. string next(); // next() (¿Í)°ú °°½À´Ï´Ù¸¸, MeCab::Node (À»)¸¦ µ¹·ÁÁÝ´Ï´Ù. Node nextNode(); }; #define MECAB_NOR_NODE 0 #define MECAB_UNK_NODE 1 #define MECAB_BOS_NODE 2 #define MECAB_EOS_NODE 3 struct Node { struct Node prev; // ÇϳªÀüÀÇ Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ struct Node next; // ÇϳªÃ³ÀÇ Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ struct Node enext; // °°Àº À§Ä¡¿¡¼ ³¡³ª´Â Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ struct Node bnext; // °°Àº °³½Ã À§Ä¡¿¡¼ ½ÃÀ۵Ǵ Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ string surface; // ÇüżÒÀÇ ¹®ÀÚ¿ Á¤º¸ string feature; // CSV ±×¸®°í Ç¥±âµÈ Å»ý Á¤º¸ unsigned int length; // ÇüżÒÀÇ ±æÀÌ unsigned int rlength; // ÇüżÒÀÇ ±æÀÌ( ¼±µÎÀÇ ½ºÆäÀ̽º¸¦ Æ÷ÇÔÇÑ´Ù) unsigned int id; // Çüżҿ¡ ºÎ¿©µÈ´Ù À¯´ÏÅ©ID unsigned short rcAttr; // ¿ì¹®¸Æ id unsigned short lcAttr; // ¿ÞÂÊ ¹®¸Æ id unsigned short posid; // ÇüÅÂ¼Ò ID ( ¹Ì»ç¿ë) unsigned char char_type; // ¹®ÀÚÁ¾ Á¤º¸ unsigned char stat; // ÇüżÒÀÇ Á¾·ù: ÀÌÇÏÀÇ ¸ÅÅ©·ÎÀÇ °ª // #define MECAB_NOR_NODE 0 // #define MECAB_UNK_NODE 1 // #define MECAB_BOS_NODE 2 // #define MECAB_EOS_NODE 3 unsigned char isbest; // º£½ºÆ®ÇØÀÇ °æ¿ì 1, ±× ÀÌ¿Ü 0 float alpha; // forward backward ÀÇ foward log È®·ü float beta; // forward backward ÀÇ backward log È®·ü float prob; // ÁÖº¯ È®·ü // alpha, beta, prob ÇÏ -l 2 ¿É¼ÇÀ» ÁöÁ¤ÇßÀ» ¶§¿¡ Á¤Àǵ˴ϴ٠short wcost; // ´Ü¾î ¹ß»ý ÄÚ½ºÆ® long cost; // ´©Àû ÄÚ½ºÆ® }; }
perl/test.pl, ruby/test.rb, python/test.py, java/test.java ¿¡ °¢°¢ÀÇ ¾ð¾îÀÇ »ùÇÃÀÌ Àֱ⠶§¹®¿¡, Âü°í·Î ÇØ ÁÖ¼¼¿ä.
$Id: bindings.html 65 2007-01-30 00:52:53Z taku-ku $;