½ºÅ©¸³Æ® ¾ð¾îÀÇ ¹ÙÀεù

$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 ÀÇ ½ÇÇà Çü½Ä¿¡°Ô ÁÖ¾î ÆĶó¹ÌÅÍ¿Í µ¿ÀÏÇÏ°í, ±×°ÍµéÀ» ¹®ÀÚ¿­·Î¼­ ÁÝ´Ï´Ù.

perl

use MeCab;
$m = new MeCab::Tagger ("-Ochasen");
print $m->parse ("
¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é");

ruby

require 'MeCab'
m = MeCab::Tagger.new ("-Ochasen")
print m.parse ("
¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é")

python

import sys
import MeCab
m = MeCab.Tagger ("-Ochasen")
print m.parse ("
¿À´Ãµµ ÇÏÁö ¾ÊÀ¸¸é")

Java

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::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 $;