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