トップ
新規
一覧
単語検索
最終更新
ヘルプ
ログイン
アールメカブ
hidden_RへCから名前付きベクトルを要素とするリストを返す
をテンプレートにして作成
開始行:
[[Rの備忘録]]
''&color(blue){これはRと和布蕪とのインターフェイスの雛形}...
-- [[Windows版>#wb479cce]]
-- [[C言語版>#wb479cce]]
*Windows版 [#c17f61d0]
クラスライブラリとして RMeCab プロジェクトを作成。[[詳...
RMeCab.h ファイルの名前空間をnamespace RMeCabPack とを変...
// これは メイン DLL ファイルです。
#include "stdafx.h"
#include "RMeCab2.h"
#include <mecab.h>// mecab.h はここに位置すること!
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
// めかぶのチェック関数
extern "C" {
#define CHECK(eval) if (! eval) { \
fprintf (stderr, "Exception:%s\n", \
mecab_strerror (mecab)); \
mecab_destroy(mecab); \
return (SEXP)-1; }// キャストを忘れないこと
}
/* 文字列とバッファ数、原型を戻すか、などのオプションが引...
extern "C" __declspec(dllexport)
SEXP RMeCabC(SEXP aa, SEXP myint, SEXP mypref){
SEXP parsed;
const char* input = CHAR(STRING_ELT(aa,0));//解析対象...
mecab_t *mecab;
mecab_node_t *node;
const char *result;
int z = INTEGER_VALUE(mypref);// もとの形 0 か原型 1 か
int n = INTEGER_VALUE(myint);//バッファの設定
char *buf2; // char buf1[1024];
char buf2[1024];
char *p;
SEXP my_list, my_char,my_char2;
int i = 0;//ループ用
buf2 = (char*) malloc(n);
if(z != 0 && z != 1){ z = 0;}
// Rprintf("buf = %d : z = %d\n", n, z);//fo...
// mecabによる解析を行う
mecab = mecab_new2 (input);
CHECK(mecab);
node = (mecab_node_t *) mecab_sparse_tonode(mecab, inp...
// キャストを忘れないこと
CHECK(node);
// とりあえず空の要素を100個持つリストを生成する
PROTECT(my_list = allocVector(VECSXP, 100));
for (; node; node = node->next) {
if (node->stat == MECAB_BOS_NODE)
//printf("BOS");
continue;
else if (node->stat == MECAB_EOS_NODE)
//printf("EOS");
continue;
else {
// node->length はノード全体ではなく,形態素の長さ
// 元の単語を buf1 に記録
strncpy(buf1, node->surface, node->length) ;
//strcpy(buf1, node->surface) ;
buf1[node->length] = '\0';// NULL-Terminateしておく
strcpy(buf2, node->feature);// CSV で表記された素性情報
p = strtok (buf2, " ," );
PROTECT(my_char2 = allocVector(STRSXP,1));
SET_STRING_ELT(my_char2, 0, mkChar(p));
// 形態素情報をセット
PROTECT(my_char = allocVector(STRSXP,1));
//文字型のベクトル一個を生成
if(z == 1){// 原型を取るため,六個目の要素を取る
while(z < 7 && p!= NULL){
p = strtok(NULL, " ," );
z++;
}//_while_end
SET_STRING_ELT(my_char, 0, mkChar(p));//原型をセット
z = 1;
}//_if_end
else{
SET_STRING_ELT(my_char, 0, mkChar(buf1));
//もとの単語をセット
}//_if_end
//p = NULL;
// SET_NAMED(my_char, 1);
SET_NAMES(my_char, my_char2);// したと同じこと
//setAttrib(my_char, R_NamesSymbol, my_char2);
//もと単語の名前に形態素情報
SET_VECTOR_ELT(my_list, i, my_char);// リストに追加
UNPROTECT(2);
p = NULL;
// SET_VECTOR_ELT(my_list, i,
//SET_STRING_ELT(, 0, mkChar(buf1)));
//SET_VECTOR_ELT(my_list, i, CHAR(STRING_ELT(my_char, ...
/////// UNPROTECT(1);
i++;
}//_if(z==1)_end
//memset(buf1,'\0',strlen(buf1));
memset(buf1,0,strlen(buf1));
}
/* for(i = 0; i++; i < 15){ */
/* SET_VECTOR_ELT(my_list, i, "A");
//CHAR(STRING_ELT(my_char, i)) */
/* } */
//
// PROTECT(parsed = mkString(result));
// UNPROTECT(2);
UNPROTECT(1);
if(length(my_list) > i){
PROTECT(my_list = lengthgets(my_list, i));
}//_for_end
UNPROTECT(1);
mecab_destroy(mecab);
// free(buf2) // これを加えてはいけない
return(my_list);
}
/* テキストから読む。引数はテキスト名 */
extern "C" __declspec(dllexport) SEXP RMeCabText(SEXP aa...
const char* input = CHAR(STRING_ELT(aa,0));
char input2[1024];
mecab_t *mecab;
mecab_node_t *node;
int i = 0;
int j = 0;
int console = 0;
char buf1[256];
char buf2[1024];
char *p;
SEXP my_list, my_char;
FILE *fp;
mecab = mecab_new2 (input);
CHECK(mecab);
if((fp = fopen(input, "r")) == NULL)
Rprintf("no file founde\n");
else{
// とりあえず空の要素を1000個持つリストを生成する
PROTECT(my_list = allocVector(VECSXP, 1000));
while(!feof(fp)){
if(fgets(input2, 1024, fp) != NULL){
node = (mecab_node_t * ) mecab_sparse_tonode(mecab, i...
// キャストを忘れないこと
CHECK(node);
// PROTECT(my_char=allocVector(STRSXP,15));
// 解析結果のノードをなめる
for (; node; node = node->next) {
// printf("%d ", node->id);
if (node->stat == MECAB_BOS_NODE)
//printf("BOS");
continue;
else if (node->stat == MECAB_EOS_NODE)
//printf("EOS");
continue;
else {
// もしもリストの空きがなくなっているなら,
// 1000個新規スペースを足す
if(length(my_list) <= i){
UNPROTECT(1);
PROTECT(my_list = lengthgets(my_list, i+1000));
}
//buf1 = (char*) malloc(sizeof(char) * node->length)
strncpy(buf1, node->surface, node->length) ;
//元のトークン
//strcpy(buf1, node->surface) ;
buf1[node->length] = '\0';// 末尾にNULLを加える
//strncpy(buf2, node->feature, node->length) ;
if(console){
Rprintf("%s %s \n", buf1, node->feature);
//Rコンソールへの表示
}
PROTECT(my_char=allocVector(STRSXP,10));
// トークン解析結果用ベクトル生成
SET_STRING_ELT(my_char, 0, mkChar(buf1));
//元トークンを冒頭にセット
strcpy(buf2, node->feature);
//解析情報の取得.要素数は 9
p = strtok(buf2, "," );//取得情報の分割
j = 1;
while ( p != NULL ) {
SET_STRING_ELT(my_char, j, mkChar(p));
//元トークンを冒頭にセット
p = strtok( NULL,"," );
j++;
}//_while_end
SET_VECTOR_ELT(my_list, i, my_char);
UNPROTECT(1);
i++;
}//_for_end
//memset(buf1,'\0',strlen(buf1));
memset(buf1,0,strlen(buf1));
memset(buf2,0,strlen(buf2));
}// for_end
}//if_end
}// while(!feof(fp));//while_end
// UNPROTECT(2);
// リスト末尾に空きがあるなら取り除く
UNPROTECT(1);
if(length(my_list) > i){
PROTECT(my_list = lengthgets(my_list, i));
}
UNPROTECT(1);
mecab_destroy(mecab);
return(my_list);
fclose(fp);
}// fi_endfile open
return(0);
}
利用する場合は
> setwd("c:/workhome")
> dyn.load("RMeCab2.dll")
`RMeCab` <-
function(str, mypref = 0, myint = 512){
.Call("RMeCabC", as.character(str), as.integer(mypref),
as.integer(myint))
}
> RMeCab("すもももももももものうち")
# 原型を取得したければ
> .Call(RMeCabC", "すもももももももものうち", 1,1024)
-- [[C++言語版>#l0d7883e]]
まだメモリ管理がしっかりとしていないんだけど.
*C言語版 [#wb479cce]
#include <R.h>
#include <Rdefines.h>
#include <Rinternals.h>
#include <mecab.h>
#include <stdio.h>
#define CHECK(eval) if (! eval) { \
fprintf (stderr, "Exception:%s\n", mecab_strerror (me...
mecab_destroy(mecab); \
return -1; }
SEXP myMecab(SEXP aa){
SEXP parsed;
const char* input = CHAR(STRING_ELT(aa,0));
mecab_t *mecab;
mecab_node_t *node;
const char *result;
int i = 0;
char buf1[256], buf2[1024];
char *p;
SEXP my_list, my_char;
mecab = mecab_new2 (input);
CHECK(mecab);
node = mecab_sparse_tonode(mecab, input);
CHECK(node);
// とりあえず空の要素を1000個持つリストを生成する
PROTECT(my_list = allocVector(VECSXP, 1000));
for (; node; node = node->next) {
if (node->stat == MECAB_BOS_NODE)
continue;
else if (node->stat == MECAB_EOS_NODE)
continue;
else {
// もしもリストの空きがなくなっているなら
// 1000個新規スペースを足す
if(length(my_list) <= i){
UNPROTECT(1);
PROTECT(my_list = lengthgets(my_list, i+1));
//my_list = lengthgets(my_list, i+1000);
//UNPROTECT(1); // 必要?
//PROTECT(my_list); // 必要?
}
strncpy(buf1, node->surface, node->length) ;
buf1[node->length] = '\0';
// Rprintf("%s %s \n", buf1, node->feature);
strcpy(buf2, node->feature);//直接いじれ...
p = strtok(buf2, " ," );
/* いずれ,他の情報を必要とすることもある
while ( p != NULL ) {
p = strtok( NULL," ," );
}
*/
PROTECT(my_char=allocVector(STRSXP,1));
SET_STRING_ELT(my_char, 0, mkChar(buf1));
PROTECT(my_char=allocVector(STRSXP,1));
SET_STRING_ELT(my_char, 0, mkChar(buf1));
///// SET_NAMED(my_char, 1);
PROTECT(my_char2=allocVector(STRSXP,1));
SET_STRING_ELT(my_char2, 0, mkChar(p));
setAttrib(my_char, R_NamesSymbol, my_char2);
SET_VECTOR_ELT(my_list, i, my_char);
UNPROTECT(2);
p = NULL;//必要ないかもしれないけど
i++;
}
memset(buf1,'\0',strlen(buf1));
}
// リスト末尾に空きがあるなら取り除く
UNPROTECT(1);
if(length(my_list) > i){
PROTECT(my_list = lengthgets(my_list, i));
}
UNPROTECT(1);
mecab_destroy(mecab);
return(my_list);
}
コンパイル
R CMD SHLIB myMecab.c -L/usr/local/lib/ -lmecab -I/usr/lo...
実行例
dyn.load("myMecab.so")
#
kekka <- .Call("myMecab",
"太郎は次郎が持っている本を花子に渡した。")
kekka[[1]][1]
names(kekka[[1]][1])
#名詞だけを取り出す
unlist(kekka)[names(unlist(kekka)) == "名詞"]
#
名詞 名詞 名詞 名詞 名詞
"太郎" "次郎" "本" "花" "子"
dyn.unload("myMecab.so")
花子を「花」と「子」に分割している.和布蕪の解析ミスをR上...
* C++言語版 [#l0d7883e]
以下,未完.やはり iostream と RInternal.h はぶつかる.
MyMecabCpp.hh
//Rテスト用
#include <iostream>
#include <mecab.h>
using namespace std;
#define CHECK(eval) if (! eval) { \
const char *e = tagger ? tagger->what() :
MeCab::getTaggerError(); \
std::cerr << "Exception:" << e << std::endl; \
delete tagger; \
return -1; }
class MyMecabCpp{
public:
char *str;
const MeCab::Node *node;
MeCab::Tagger *tagger;// = MeCab::createTagger (str);
public:
MyMecabCpp(char input [1024]);
// int MyMecabCpp::check();
int show();
int setNode();
};
MyMecabCpp.cc
//Rテスト用
#include"MyMecabCpp.hh"
MyMecabCpp::MyMecabCpp(char input[1024]){
str = input;
tagger = MeCab::createTagger (str);
}
int MyMecabCpp::setNode(){
node = const_cast<MeCab::Node *>
(tagger->parseToNode(str));//const が必
CHECK(node);
}
int MyMecabCpp::show(){
for (; node; node = node->next) {
std::cout.write(node->surface, node->length);
std::cout << ' ' << node->feature
<< ' ' << (int)(node->surface - str)
<< ' ' << (int)(node->surface - str + 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;
}
std::cout << "END" << endl;
return 1;
}
MyMecabCPP_R.cc
/* R テスト用
R CMD SHLIB MyMecabCpp2_R.cc MyMecabCpp2.cpp
-L/usr/local/lib/ -lmecab -I/usr/local/include
*/
#include "MyMecabCpp.hh"
extern "C"{
void mecab(){
MyMecabCpp x("太郎は花が好き");
x.setNode();
//return 1;
}
}
終了行:
[[Rの備忘録]]
''&color(blue){これはRと和布蕪とのインターフェイスの雛形}...
-- [[Windows版>#wb479cce]]
-- [[C言語版>#wb479cce]]
*Windows版 [#c17f61d0]
クラスライブラリとして RMeCab プロジェクトを作成。[[詳...
RMeCab.h ファイルの名前空間をnamespace RMeCabPack とを変...
// これは メイン DLL ファイルです。
#include "stdafx.h"
#include "RMeCab2.h"
#include <mecab.h>// mecab.h はここに位置すること!
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
// めかぶのチェック関数
extern "C" {
#define CHECK(eval) if (! eval) { \
fprintf (stderr, "Exception:%s\n", \
mecab_strerror (mecab)); \
mecab_destroy(mecab); \
return (SEXP)-1; }// キャストを忘れないこと
}
/* 文字列とバッファ数、原型を戻すか、などのオプションが引...
extern "C" __declspec(dllexport)
SEXP RMeCabC(SEXP aa, SEXP myint, SEXP mypref){
SEXP parsed;
const char* input = CHAR(STRING_ELT(aa,0));//解析対象...
mecab_t *mecab;
mecab_node_t *node;
const char *result;
int z = INTEGER_VALUE(mypref);// もとの形 0 か原型 1 か
int n = INTEGER_VALUE(myint);//バッファの設定
char *buf2; // char buf1[1024];
char buf2[1024];
char *p;
SEXP my_list, my_char,my_char2;
int i = 0;//ループ用
buf2 = (char*) malloc(n);
if(z != 0 && z != 1){ z = 0;}
// Rprintf("buf = %d : z = %d\n", n, z);//fo...
// mecabによる解析を行う
mecab = mecab_new2 (input);
CHECK(mecab);
node = (mecab_node_t *) mecab_sparse_tonode(mecab, inp...
// キャストを忘れないこと
CHECK(node);
// とりあえず空の要素を100個持つリストを生成する
PROTECT(my_list = allocVector(VECSXP, 100));
for (; node; node = node->next) {
if (node->stat == MECAB_BOS_NODE)
//printf("BOS");
continue;
else if (node->stat == MECAB_EOS_NODE)
//printf("EOS");
continue;
else {
// node->length はノード全体ではなく,形態素の長さ
// 元の単語を buf1 に記録
strncpy(buf1, node->surface, node->length) ;
//strcpy(buf1, node->surface) ;
buf1[node->length] = '\0';// NULL-Terminateしておく
strcpy(buf2, node->feature);// CSV で表記された素性情報
p = strtok (buf2, " ," );
PROTECT(my_char2 = allocVector(STRSXP,1));
SET_STRING_ELT(my_char2, 0, mkChar(p));
// 形態素情報をセット
PROTECT(my_char = allocVector(STRSXP,1));
//文字型のベクトル一個を生成
if(z == 1){// 原型を取るため,六個目の要素を取る
while(z < 7 && p!= NULL){
p = strtok(NULL, " ," );
z++;
}//_while_end
SET_STRING_ELT(my_char, 0, mkChar(p));//原型をセット
z = 1;
}//_if_end
else{
SET_STRING_ELT(my_char, 0, mkChar(buf1));
//もとの単語をセット
}//_if_end
//p = NULL;
// SET_NAMED(my_char, 1);
SET_NAMES(my_char, my_char2);// したと同じこと
//setAttrib(my_char, R_NamesSymbol, my_char2);
//もと単語の名前に形態素情報
SET_VECTOR_ELT(my_list, i, my_char);// リストに追加
UNPROTECT(2);
p = NULL;
// SET_VECTOR_ELT(my_list, i,
//SET_STRING_ELT(, 0, mkChar(buf1)));
//SET_VECTOR_ELT(my_list, i, CHAR(STRING_ELT(my_char, ...
/////// UNPROTECT(1);
i++;
}//_if(z==1)_end
//memset(buf1,'\0',strlen(buf1));
memset(buf1,0,strlen(buf1));
}
/* for(i = 0; i++; i < 15){ */
/* SET_VECTOR_ELT(my_list, i, "A");
//CHAR(STRING_ELT(my_char, i)) */
/* } */
//
// PROTECT(parsed = mkString(result));
// UNPROTECT(2);
UNPROTECT(1);
if(length(my_list) > i){
PROTECT(my_list = lengthgets(my_list, i));
}//_for_end
UNPROTECT(1);
mecab_destroy(mecab);
// free(buf2) // これを加えてはいけない
return(my_list);
}
/* テキストから読む。引数はテキスト名 */
extern "C" __declspec(dllexport) SEXP RMeCabText(SEXP aa...
const char* input = CHAR(STRING_ELT(aa,0));
char input2[1024];
mecab_t *mecab;
mecab_node_t *node;
int i = 0;
int j = 0;
int console = 0;
char buf1[256];
char buf2[1024];
char *p;
SEXP my_list, my_char;
FILE *fp;
mecab = mecab_new2 (input);
CHECK(mecab);
if((fp = fopen(input, "r")) == NULL)
Rprintf("no file founde\n");
else{
// とりあえず空の要素を1000個持つリストを生成する
PROTECT(my_list = allocVector(VECSXP, 1000));
while(!feof(fp)){
if(fgets(input2, 1024, fp) != NULL){
node = (mecab_node_t * ) mecab_sparse_tonode(mecab, i...
// キャストを忘れないこと
CHECK(node);
// PROTECT(my_char=allocVector(STRSXP,15));
// 解析結果のノードをなめる
for (; node; node = node->next) {
// printf("%d ", node->id);
if (node->stat == MECAB_BOS_NODE)
//printf("BOS");
continue;
else if (node->stat == MECAB_EOS_NODE)
//printf("EOS");
continue;
else {
// もしもリストの空きがなくなっているなら,
// 1000個新規スペースを足す
if(length(my_list) <= i){
UNPROTECT(1);
PROTECT(my_list = lengthgets(my_list, i+1000));
}
//buf1 = (char*) malloc(sizeof(char) * node->length)
strncpy(buf1, node->surface, node->length) ;
//元のトークン
//strcpy(buf1, node->surface) ;
buf1[node->length] = '\0';// 末尾にNULLを加える
//strncpy(buf2, node->feature, node->length) ;
if(console){
Rprintf("%s %s \n", buf1, node->feature);
//Rコンソールへの表示
}
PROTECT(my_char=allocVector(STRSXP,10));
// トークン解析結果用ベクトル生成
SET_STRING_ELT(my_char, 0, mkChar(buf1));
//元トークンを冒頭にセット
strcpy(buf2, node->feature);
//解析情報の取得.要素数は 9
p = strtok(buf2, "," );//取得情報の分割
j = 1;
while ( p != NULL ) {
SET_STRING_ELT(my_char, j, mkChar(p));
//元トークンを冒頭にセット
p = strtok( NULL,"," );
j++;
}//_while_end
SET_VECTOR_ELT(my_list, i, my_char);
UNPROTECT(1);
i++;
}//_for_end
//memset(buf1,'\0',strlen(buf1));
memset(buf1,0,strlen(buf1));
memset(buf2,0,strlen(buf2));
}// for_end
}//if_end
}// while(!feof(fp));//while_end
// UNPROTECT(2);
// リスト末尾に空きがあるなら取り除く
UNPROTECT(1);
if(length(my_list) > i){
PROTECT(my_list = lengthgets(my_list, i));
}
UNPROTECT(1);
mecab_destroy(mecab);
return(my_list);
fclose(fp);
}// fi_endfile open
return(0);
}
利用する場合は
> setwd("c:/workhome")
> dyn.load("RMeCab2.dll")
`RMeCab` <-
function(str, mypref = 0, myint = 512){
.Call("RMeCabC", as.character(str), as.integer(mypref),
as.integer(myint))
}
> RMeCab("すもももももももものうち")
# 原型を取得したければ
> .Call(RMeCabC", "すもももももももものうち", 1,1024)
-- [[C++言語版>#l0d7883e]]
まだメモリ管理がしっかりとしていないんだけど.
*C言語版 [#wb479cce]
#include <R.h>
#include <Rdefines.h>
#include <Rinternals.h>
#include <mecab.h>
#include <stdio.h>
#define CHECK(eval) if (! eval) { \
fprintf (stderr, "Exception:%s\n", mecab_strerror (me...
mecab_destroy(mecab); \
return -1; }
SEXP myMecab(SEXP aa){
SEXP parsed;
const char* input = CHAR(STRING_ELT(aa,0));
mecab_t *mecab;
mecab_node_t *node;
const char *result;
int i = 0;
char buf1[256], buf2[1024];
char *p;
SEXP my_list, my_char;
mecab = mecab_new2 (input);
CHECK(mecab);
node = mecab_sparse_tonode(mecab, input);
CHECK(node);
// とりあえず空の要素を1000個持つリストを生成する
PROTECT(my_list = allocVector(VECSXP, 1000));
for (; node; node = node->next) {
if (node->stat == MECAB_BOS_NODE)
continue;
else if (node->stat == MECAB_EOS_NODE)
continue;
else {
// もしもリストの空きがなくなっているなら
// 1000個新規スペースを足す
if(length(my_list) <= i){
UNPROTECT(1);
PROTECT(my_list = lengthgets(my_list, i+1));
//my_list = lengthgets(my_list, i+1000);
//UNPROTECT(1); // 必要?
//PROTECT(my_list); // 必要?
}
strncpy(buf1, node->surface, node->length) ;
buf1[node->length] = '\0';
// Rprintf("%s %s \n", buf1, node->feature);
strcpy(buf2, node->feature);//直接いじれ...
p = strtok(buf2, " ," );
/* いずれ,他の情報を必要とすることもある
while ( p != NULL ) {
p = strtok( NULL," ," );
}
*/
PROTECT(my_char=allocVector(STRSXP,1));
SET_STRING_ELT(my_char, 0, mkChar(buf1));
PROTECT(my_char=allocVector(STRSXP,1));
SET_STRING_ELT(my_char, 0, mkChar(buf1));
///// SET_NAMED(my_char, 1);
PROTECT(my_char2=allocVector(STRSXP,1));
SET_STRING_ELT(my_char2, 0, mkChar(p));
setAttrib(my_char, R_NamesSymbol, my_char2);
SET_VECTOR_ELT(my_list, i, my_char);
UNPROTECT(2);
p = NULL;//必要ないかもしれないけど
i++;
}
memset(buf1,'\0',strlen(buf1));
}
// リスト末尾に空きがあるなら取り除く
UNPROTECT(1);
if(length(my_list) > i){
PROTECT(my_list = lengthgets(my_list, i));
}
UNPROTECT(1);
mecab_destroy(mecab);
return(my_list);
}
コンパイル
R CMD SHLIB myMecab.c -L/usr/local/lib/ -lmecab -I/usr/lo...
実行例
dyn.load("myMecab.so")
#
kekka <- .Call("myMecab",
"太郎は次郎が持っている本を花子に渡した。")
kekka[[1]][1]
names(kekka[[1]][1])
#名詞だけを取り出す
unlist(kekka)[names(unlist(kekka)) == "名詞"]
#
名詞 名詞 名詞 名詞 名詞
"太郎" "次郎" "本" "花" "子"
dyn.unload("myMecab.so")
花子を「花」と「子」に分割している.和布蕪の解析ミスをR上...
* C++言語版 [#l0d7883e]
以下,未完.やはり iostream と RInternal.h はぶつかる.
MyMecabCpp.hh
//Rテスト用
#include <iostream>
#include <mecab.h>
using namespace std;
#define CHECK(eval) if (! eval) { \
const char *e = tagger ? tagger->what() :
MeCab::getTaggerError(); \
std::cerr << "Exception:" << e << std::endl; \
delete tagger; \
return -1; }
class MyMecabCpp{
public:
char *str;
const MeCab::Node *node;
MeCab::Tagger *tagger;// = MeCab::createTagger (str);
public:
MyMecabCpp(char input [1024]);
// int MyMecabCpp::check();
int show();
int setNode();
};
MyMecabCpp.cc
//Rテスト用
#include"MyMecabCpp.hh"
MyMecabCpp::MyMecabCpp(char input[1024]){
str = input;
tagger = MeCab::createTagger (str);
}
int MyMecabCpp::setNode(){
node = const_cast<MeCab::Node *>
(tagger->parseToNode(str));//const が必
CHECK(node);
}
int MyMecabCpp::show(){
for (; node; node = node->next) {
std::cout.write(node->surface, node->length);
std::cout << ' ' << node->feature
<< ' ' << (int)(node->surface - str)
<< ' ' << (int)(node->surface - str + 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;
}
std::cout << "END" << endl;
return 1;
}
MyMecabCPP_R.cc
/* R テスト用
R CMD SHLIB MyMecabCpp2_R.cc MyMecabCpp2.cpp
-L/usr/local/lib/ -lmecab -I/usr/local/include
*/
#include "MyMecabCpp.hh"
extern "C"{
void mecab(){
MyMecabCpp x("太郎は花が好き");
x.setNode();
//return 1;
}
}
ページ名: