MeCab ¶óÀ̺귯¸®

$Id: libmecab.html 65 2007-01-30 00:52:53Z taku-ku $;

C ¶óÀ̺귯¸® »ç¾ç

C ¶óÀ̺귯¸®´Â ÀÌÇÏÀÇ ÇÔ¼ö¸¦ Á¦°øÇÏ°í ÀÖ½À´Ï´Ù.

mecab_t *mecab_new (int argc, char **argv)
mecab ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÕ´Ï´Ù.
Àμö¿¡´Â, C ¾ð¾îÀÇ, main ÇÔ¼ö·Î »ç¿ëµÈ´Ù argc, argv ½ºÅ¸ÀÏÀÇ Àμö¸¦ ÁÝ´Ï´Ù.
ÀÌ Àμö´Â, mecab Ä¿¸àµå (¿Í)°ú °°Àº ¹æ¹ýÀ¸·Î 󸮵˴ϴÙ.
¼º°øÇϸé, mecab_t ÇüÅÂÀÇ Æ÷ÀÎÅÍ°¡ µÇµ¹¾Æ ¿É´Ï´Ù. ÀÌ Æ÷ÀÎÅ͸¦ ÅëÇØ Çؼ® (À»)¸¦ ½Ç½ÃÇÕ´Ï´Ù. ½ÇÆÐÇϸé NULL ÇÏÁö¸¸ µÇµ¹¾Æ ¿É´Ï´Ù.
mecab_t *mecab_new2 (const char *arg)
mecab ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÕ´Ï´Ù.
Àμö¿¡´Â, ÇϳªÀÇ ¹®ÀÚ¿­·Î¼­ Ç¥ÇöÇÑ ÆĶó¹ÌÅ͸¦ ÁÝ´Ï´Ù.
¼º°øÇϸé, mecab_t ÇüÅÂÀÇ Æ÷ÀÎÅÍ°¡ µÇµ¹¾Æ ¿É´Ï´Ù. ÀÌ Æ÷ÀÎÅ͸¦ ÅëÇÏ°í Çؼ®À» ½Ç½ÃÇÕ´Ï´Ù.
const char *mecab_version()
mecab ÀÇ version (À»)¸¦ ¹®ÀÚ¿­·Î¼­ ÃëµæÇÕ´Ï´Ù.
const char *mecab_strerror (mecab_t* m)
¿¡·¯ÀÇ ³»¿ëÀ» ¹®ÀÚ¿­·Î¼­ ÃëµæÇÕ´Ï´Ù. mecab_sparse_tostr µîÀ¸·Î, NULL ÇÏÁö¸¸ µÇµ¹¾Æ ¿ÔÀ» °æ¿ì¿¡, mecab_strerror (À»)¸¦ ºÎ¸£´Â °ÍÀ¸·Î, ¿¡·¯ÀÇ ³»¿ëÀ» ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù. mecab_new,mecab_new2 ÀÇ ¿¡·¯´Â, m (À»)¸¦ NULL (¿Í)°ú ÁöÁ¤ÇØ ÁÖ¼¼¿ä.
const char *mecab_sparse_tostr (mecab_t *m, const char *str)
Çؼ®À» ½Ç½ÃÇÕ´Ï´Ù. Àμö¿¡´Â, mecab_new ±×¸®°í ¾òÀ» ¼ö ÀÖ¾ú´Ù mecab_t ÇüÅÂÀÇ Æ÷ÀÎÅÍ¿Í,
Çؼ®ÇÏ°í ½ÍÀº ¹®ÀåÀ» char ÇüÅÂÀÇ Æ÷ÀÎÅÍ ¹®ÀÚ¿­·Î¼­ ÁÝ´Ï´Ù.
¼º°øÇϸé, Çؼ® ÈÄÀÇ °á°ú°¡ char ÇüÅÂÀÇ Æ÷ÀÎÅͷμ­ µ¹¾Æ°¡, ½ÇÆÐÇϸé, NULL ÇÏÁö¸¸ µÇµ¹¾Æ ¿É´Ï´Ù
¹Ýȯ°ªÀÇ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ¸Þ¸ð¸® ¿µ¿ªÀº, È£ÃâÃø¿¡¼­ °ü¸®ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù¸¸,
mecab_sparse_tostr (À»)¸¦ ºÎ¸¦ ¶§¸¶´Ù µ¡¾²±âµË´Ï´Ù.
¶Ç, mecab_destroy (À»)¸¦ ºÎ¸£¸é ÇعæµË´Ï´Ù.
const char *mecab_sparse_tostr2 (mecab_t *m, const char *str, size_t len)
mecab_sparse_tostr (¿Í)°ú °ÅÀÇ °°½À´Ï´Ù¸¸, len ¿¡¼­, Çؼ®ÇÏ´Â ¹®ÀåÀÇ ±æÀ̸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
char *mecab_sparse_tostr3 (mecab_t *m, const char *istr,size_t ilen char *ostr, size_t olen)
mecab_sparse_tostr2 ¿¡ °¡¼¼ÇØ, Ãâ·Â¿ëÀÇ ¹öÆÛ ¿µ¿ª (ostr), ¹× ±× ±æÀÌ (olen) (À»)¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ostr ÀÇ ¿µ¿ªÀÇ °ü¸®´Â, È£ÃâÃøÀÌ ½Ç½ÃÇÕ´Ï´Ù. ¼º°øÇϸé, Çؼ® ÈÄÀÇ °á°ú°¡ char ÇüÅÂÀÇ Æ÷ÀÎÅͷμ­ µÇµ¹¾Æ ¿É´Ï´Ù. ÀÌ°ÍÀº, ostr (¿Í)°ú °°°Ô µË´Ï´Ù. ¸¸¾à, Çؼ® °á°úÀÇ ±æÀÌ°¡ olen ÀÌ»óÀÌ µÇ¾úÀ» °æ¿ì´Â, Çؼ® ½ÇÆзΠ°£ÁÖÇØ, NULL (À»)¸¦ µ¹·ÁÁÝ´Ï´Ù.
const char *mecab_nbest_sparse_tostr (mecab_t *m, size_t N, const char *str)
mecab_sparse_tostr () ÀÇ N-Best ÇØÃâ·Â version ÀÔ´Ï´Ù. N ¿¡¼­ Çؼ® °á°úÀÇ °³ ¼ö¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ¶Ç, N-Best ÀÇ ±â´ÉÀ» »ç¿ëÇÏ´Â °æ¿ì´Â, ¹Ýµå½Ã mecab_new ¿¡¼­ -l 1 ¿É¼ÇÀ» ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
const char *mecab_nbest_sparse_tostr2 (mecab_t *m, size_t N, const char *str, size_t len)
mecab_sparse_tostr2 () ÀÇ N-Best ÇØÃâ·Â version ÀÔ´Ï´Ù. N ¿¡¼­ Çؼ® °á°úÀÇ °³ ¼ö¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
char *mecab_nbest_sparse_tostr3 (mecab_t *m, size_t N, const char *str, size_t len, char *ostr, size_t olen)
mecab_sparse_tostr3 () ÀÇ N-Best ÇØÃâ·Â version ÀÔ´Ï´Ù. N ¿¡¼­ Çؼ® °á°úÀÇ °³ ¼ö¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
int mecab_nbest_init (mecab_t* m, const char* str);
Çؼ® °á°ú¸¦, È®½ÇÇÑ °Í °°Àº °ÍÀ¸·ÎºÎÅÍ Â÷·Ê·Î ÃëµæÇÏ´Â °æ¿ì¿¡ ÀÌ ÇÔ¼ö·Î ÃʱâÈ­¸¦ ½Ç½ÃÇØ . Çؼ®ÇÏ°í ½ÍÀº ¹®ÀåÀ» str (À¸)·Î ÁöÁ¤ÇÕ´Ï´Ù. ÃʱâÈ­¿¡ ¼º°øÇϸé 1 (À»)¸¦, ½ÇÆÐÇÑ´Ù (¿Í)°ú 0 (À»)¸¦ µ¹·ÁÁÝ´Ï´Ù. ½ÇÆÐÀÇ ¿øÀÎÀº, mecab_strerror ±×¸®°í ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù.
int mecab_nbest_init2 (mecab_t* m, const char* str, len);
mecab_nbest_init () (¿Í)°ú °ÅÀÇ °°½À´Ï´Ù¸¸, len ¿¡¼­ ¹®ÀåÀÇ ±æÀ̸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
const char *mecab_nbest_next_tostr (mecab_t* m)
mecab_nbest_init() ÀÇ ÈÄ, ÀÌ ÇÔ¼ö¸¦ Â÷·ÊÂ÷·Ê ºÎ¸£´Â °ÍÀ¸·Î, È®½ÇÇÑ °Í °°Àº Çؼ® °á°ú (À»)¸¦, Â÷·Ê·Î ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ÇÆÐÇϸé ( ´õ ÀÌ»óÀÇ ÇØ°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì) NULL (À»)¸¦ µ¹·ÁÁÝ´Ï´Ù. ½ÇÆÐÀÇ ¿øÀÎÀº, mecab_strerror ±×¸®°í ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù.
char *mecab_nbest_next_tostr2 (mecab_t *m , char *ostr, size_t olen)
mecab_nbest_tostr() (¿Í)°ú °ÅÀÇ °°½À´Ï´Ù¸¸, ostr, olen ¿¡¼­ Ãâ·Â¿ëÀÇ ¹öÆÛ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ÇÆÐÇϸé ( ´õ ÀÌ»óÀÇ ÇØ°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì) NULL (À»)¸¦ µ¹·ÁÁÝ´Ï´Ù. ¶Ç, Ãâ·Â ¹öÆÛ°¡ Èê·¯³ÑÃÆÀ» °æ¿ìµµ NULL (À»)¸¦ µ¹·ÁÁÝ´Ï´Ù. ½ÇÆÐÀÇ ¿øÀÎÀº, mecab_strerror ±×¸®°í ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù.
void mecab_destroy(mecab_t *m)
mecab_t ÇüÅÂÀÇ Æ÷ÀÎÅ͸¦ ÇعæÇÕ´Ï´Ù.

ÇüÅÂ¼Ò Á¤º¸¸¦ ²¨³»·Á¸é, ÀÌÇÏÀÇ mecab_node_t ±¸Á¶Ã¼¿Í mecab_sparse_tonode ÇÔ¼ö¸¦ »ç¿ëÇÕ´Ï´Ù

#define MECAB_NOR_NODE  0
#define MECAB_UNK_NODE  1
#define MECAB_BOS_NODE  2
#define MECAB_EOS_NODE  3

struct mecab_node_t
{
  struct mecab_node_t  *prev;  // 
ÇϳªÀüÀÇ Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ
  struct mecab_node_t  *next;  // 
ÇϳªÃ³ÀÇ Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ
  
  struct mecab_node_t  *enext; // 
°°Àº À§Ä¡¿¡¼­ ³¡³ª´Â Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ
  struct mecab_node_t  *bnext; // 
°°Àº °³½Ã À§Ä¡¿¡¼­ ½ÃÀ۵Ǵ Çüżҿ¡ÀÇ Æ÷ÀÎÅÍ

  char  *surface;             // 
ÇüżÒÀÇ ¹®ÀÚ¿­ Á¤º¸ 
                              // NULL terminate
µÇ°í ÀÖÁö ¾Ê½À´Ï´Ù. 
¹®ÀÚ¿­·Î¼­ ²¨³»·Á¸é
			      // strncpy(buf, node->feature, node->length) 
(À¸)·Î ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù
			      
  char  *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;        // 
´©Àû ÄÚ½ºÆ®
};
mecab_node_t *mecab_sparse_tonode (mecab_t *m, const char *str)
Çؼ®À» ½Ç½ÃÇÕ´Ï´Ù. Àμö¿¡´Â, mecab_new ±×¸®°í ¾òÀ» ¼ö ÀÖ¾ú´Ù mecab_t ÇüÅÂÀÇ Æ÷ÀÎÅÍ¿Í,
Çؼ®ÇÏ°í ½ÍÀº ¹®ÀåÀ» char ÇüÅÂÀÇ Æ÷ÀÎÅÍ ¹®ÀÚ¿­·Î¼­ ÁÝ´Ï´Ù.
¼º°øÇϸé, ¹®µÎÀÇ ÇüżÒ(mecab_node_t Çü) ¿¡ÀÇ Æ÷ÀÎÅÍ°¡ µ¹¾Æ°¡, ½ÇÆÐÇϸé, NULL ÇÏÁö¸¸ µÇµ¹¾Æ ¿É´Ï´Ù.
mecab_node_t (Àº)´Â ½Ö¹æÇâ ¸®½ºÆ®°¡ µÇ¾î Àֱ⠶§¹®¿¡ next, prev (À»)¸¦ ¼ø¼­¿¡ ´õµë´Â ÀÏ·Î ÀüÇüżҸ¦ ¿­°ÅÇÒ ¼ö ÀÖ½À´Ï´Ù.
¹Ýȯ°ªÀÇ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ¸Þ¸ð¸® ¿µ¿ªÀº, È£ÃâÃø¿¡¼­ °ü¸®ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù¸¸,mecab_sparse_tonode (À»)¸¦ ºÎ¸¦ ¶§¸¶´Ù µ¡¾²±âµË´Ï´Ù.
¶Ç, mecab_destroy (À»)¸¦ ºÎ¸£¸é ÇعæµË´Ï´Ù.
mecab_node_t *mecab_sparse_tonode2 (mecab_t *m, const char *str, size_t len)
mecab_sparse_tonode (¿Í)°ú °ÅÀÇ °°½À´Ï´Ù¸¸, len ¿¡¼­, Çؼ®ÇÏ´Â ¹®ÀåÀÇ ±æÀ̸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
mecab_node_t *mecab_next_tonode (mecab_t* m)
mecab_next_tostr (¿Í)°ú °ÅÀÇ °°½À´Ï´Ù¸¸, ¹®ÀÚ¿­Àº ¾Æ´Ï°í mecab_node_t ÇüÅÂÀÇ ÇüÅÂ¼Ò Á¤º¸¸¦ µ¹·ÁÁÝ´Ï´Ù.

C »ùÇÃ

example/example.c

#include <mecab.h>
#include <stdio.h>

#define CHECK(eval) if (! eval) { 
    fprintf (stderr, "Exception:%sn", mecab_strerror (mecab)); 
    mecab_destroy(mecab); 
    return -1; }

int main (int argc, char **argv) 
{
  char input[1024] = "
Ÿ·Î´Â Áö·Î°¡ °¡Áö°í Àִ åÀ» Çϳª²¿¿¡ °Ç³×ÁÖ¾ú´Ù.";
  mecab_t *mecab;
  mecab_node_t *node;
  const char *result;
  int i;

  mecab = mecab_new (argc, argv);
  CHECK(mecab);

  result = mecab_sparse_tostr(mecab, input);
  CHECK(result)
  printf ("INPUT: %sn", input);
  printf ("RESULT:n%s", result);

  result = mecab_nbest_sparse_tostr (mecab, 3, input);
  CHECK(result);
  fprintf (stdout, "NBEST:n%s", result);

  CHECK(mecab_nbest_init(mecab, input));
  for (i = 0; i < 3; ++i) {
    printf ("%d:n%s", i, mecab_nbest_next_tostr (mecab));
  }

  node = mecab_sparse_tonode(mecab, input);
  CHECK(node);
  for (; node; node = node->next) {
    fwrite (node->surface, sizeof(char), node->length, stdout);
    printf("t%sn", node->feature);
  }

  node = mecab_sparse_tonode(mecab, input);
  CHECK(node);
  for (;  node; node = node->next) {
    printf("%d ", node->id);
    
    if (node->stat == MECAB_BOS_NODE)
      printf("BOS");
    else if (node->stat == MECAB_EOS_NODE)
      printf("EOS");
    else
      fwrite (node->surface, sizeof(char), node->length, stdout);

    printf(" %s %d %d %d %d %d %d %d %d %f %f %f %dn",
	   node->feature,
	   (int)(node->surface - input),
	   (int)(node->surface - input + node->length),
	   node->rcAttr,
	   node->lcAttr,
	   node->posid,
	   (int)node->char_type,
	   (int)node->stat,
	   (int)node->isbest,
	   node->alpha,
	   node->beta,
	   node->prob,
	   node->cost);
  }

  mecab_destroy(mecab);
   
  return 0;
}

C++ ¶óÀ̺귯¸® »ç¾ç

ÀÌÇÏ°¡ C++ API ÀÔ´Ï´Ù. ±âº»ÀûÀ¸·Î C ÀÇ interface¿Í µ¿ÀÏÇÕ´Ï´Ù¸¸,

±×·¸´Ù°í ÇÏ´Â Â÷ÀÌ°¡ ÀÖ½À´Ï´Ù.

namespace MeCab
{
  typedef struct mecab_node_t        Node;

  class Tagger
  {
  public:

    virtual const char* parse(const char*, size_t, char*, size_t) = 0;

    virtual const char* parse(const char*, size_t = 0) = 0;
    virtual Node* parseToNode(const char*, size_t = 0) = 0;

    virtual const char* parseNBest(size_t, const char*, size_t = 0) = 0;
    virtual bool  parseNBestInit(const char*, size_t = 0) = 0;
    virtual Node*  nextNode() = 0;
    virtual const char* next() = 0;
    virtual const char* formatNode(Node *) = 0;

    virtual const char* next(char*, size_t) = 0;
    virtual const char* parseNBest(size_t, const char*,
                                   size_t, char *, size_t) = 0;
    virtual const char* formatNode(Node *, char *, size_t) = 0;

    virtual const char* what() = 0;

    virtual Tagger() {};

    static const char *version();

    static Tagger* create(int, char**);
    static Tagger* create(const char*);
  };

  /* factory method */
  Tagger *createTagger (int, char**);
  Tagger *createTagger (const char*);
  const char* getTaggerError ();
}

C++ »ùÇÃ

#include <iostream>
#include <mecab.h>

#define CHECK(eval) if (! eval) { 
   const char *e = tagger ? tagger->what() : MeCab::getTaggerError(); 
   std::cerr << "Exception:" << e << std::endl; 
   delete tagger; 
   return -1; }

int main (int argc, char **argv) 
{
  char input[1024] = "
Ÿ·Î´Â Áö·Î°¡ °¡Áö°í Àִ åÀ» Çϳª²¿¿¡ °Ç³×ÁÖ¾ú´Ù.";

  MeCab::Tagger *tagger = MeCab::createTagger (argc, argv);
  CHECK(tagger);

  const char *result = tagger->parse(input);
  CHECK(result);
  std::cout << "INPUT: " << input << std::endl;
  std::cout << "RESULT: " << result << std::endl;

  result = tagger->parseNBest(3, input);
  CHECK(result); 
  std::cout << "NBEST: " << std::endl << result;

  CHECK(tagger->parseNBestInit(input));
  for (int i = 0; i < 3; ++i) {
    std::cout << i << ":" << std::endl << tagger->next();
  } 

  MeCab::Node* node = tagger->parseToNode(input);
  CHECK(node);
  for (; node; node = node->next) {
    std::cout.write(node->surface, node->length);
  }

  node = tagger->parseToNode(input);
  CHECK(node);

  for (; node; node = node->next) {
    std::cout << node->id << ' ';
    if (node->stat == MECAB_BOS_NODE)
      std::cout << "BOS";
    else if (node->stat == MECAB_EOS_NODE)
      std::cout << "EOS";
    else
      std::cout.write (node->surface, node->length);

    std::cout << ' ' << node->feature
	      << ' ' << (int)(node->surface - input)
	      << ' ' << (int)(node->surface - input + node->length)
	      << ' ' << node->rcAttr
	      << ' ' << node->lcAttr
	      << ' ' << node->posid
	      << ' ' << (int)node->char_type
	      << ' ' << (int)node->stat
	      << ' ' << (int)node->isbest
	      << ' ' << node->alpha
	      << ' ' << node->beta
	      << ' ' << node->prob
	      << ' ' << node->cost << std::endl;
  }

  delete tagger;
   
  return 0;
}

ÄÄÆÄÀÏ ¹æ¹ý

multi-thread¿¡ ´ëÇØ

MeCab ÇÏ, multi-thread ȯ°æ¿¡¼­ »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù. 1 °³ÀÇ ½º·¿µå¿¡ 1 ÀνºÅϽº(mecab_t *) (À»)¸¦ ÇÒ´çÇÏ´Â °æ¿ì´Â ½º·¿µå¼¼ÀÌÈÄÀÔ´Ï´Ù. ÇÑÃþ ´õ, °°Àº »çÀüÀ» °è¼Ó »ç¿ëÇÏ´Â ÇÑ, »çÀüÀ» º¸°ü À¯ÁöÇÏ°í ÀÖ´Â ÀÚ¿øÀº ÀçÀÌ¿ëµÇ±â À§ÇØ, º¹¼öÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇصµ ¸¹Àº ¸Þ¸ð¸®¸¦ »ç¿ëÇÒ °ÍÀº ¾ø½À´Ï´Ù.

ÇϳªÀÇ ÀνºÅϽº¸¦ º¹¼öÀÇ ½º·¿µå·ÎºÎÅÍ »ç¿ëÇÏ´Â °æ¿ì´Â Àû´çÇÏ°Ô ¹èŸ Á¦¾îÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ´Ù¸¸, ÆÛÆ÷¸Õ½º°¡ ³ª»Ú±â ¶§¹®¿¡ ÃßõÇÒ ¼ö ¾ø½À´Ï´Ù.


$Id: libmecab.html 65 2007-01-30 00:52:53Z taku-ku $;