ページ 1 / 1
C# MeCab わかち解析
Posted: 2011年10月09日(日) 23:41
by 2³
日本語形態解析エンジンMeCabをC#で扱うためのMeCab.NETというライブラリを使用して「わかち解析」を行おうと思い、
http://kgbnblog.blogspot.com/2010/03/cmecab.html
にあるようにMeCabのダウンロードとインストール、MecabDotNet.dllの移動と参照の追加をしました。
そして、
コード:
MecabDotNet.Mecab mecab = new MecabDotNet.Mecab("-O wakati");
string mecabed = mecab.mecab_sparse_tostr("テストです");
string[] breakWords = mecabed.Split(' ');
というコードを書いて実行したのですが、なぜかアプリケーションが終了してしまいます。
エラーは出ていません。
ブレークポイントで調べていくと、3行目で終了しているようです。
環境はWin7、VC#2010です。
勝手に終了してしまう理由と改善策をご教授いただける方、いらっしゃいましたら宜しくお願いいたします。
Re: C# MeCab わかち解析
Posted: 2011年10月10日(月) 00:31
by YuO
調べてみると,MeCab.NETの変換部分に問題があるようです。
以下のページによると,P/Invoke部分を書き換えてやれば動くそうです。
ref)
Tips/Other/MeCab - Sheltie書庫室 - C#のいろいろ
個人的には,MeCab.NETが元々まともなP/Invoke宣言してないだけ,という気がしないでもない……。
# CallingConvention問題が発生するのは元々のMeCab側で__stdcallを宣言していない,という問題を持っているわけですが。
---- 2011/10/10T00:32+09:00 更新 ----
・CallingConversion => CallingConvention
CallingConversionって何だと自分で突っ込みたい……。
Re: C# MeCab わかち解析
Posted: 2011年10月10日(月) 14:14
by 2³
YuO様、返信ありがとうございます。
教えていただいたリンクを元に、MeCab.NETを使用しない以下のコードを作成してみました。
コード:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MeCab_Test
{
public partial class Form1 : Form
{
[DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static IntPtr mecab_new2(string arg);
[DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.AnsiBStr)]
private extern static string mecab_sparse_tostr(IntPtr m, string str);
[DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static void mecab_destroy(IntPtr m);
public Form1()
{
InitializeComponent();
}
//button1クリックイベント
private void button1_Click(object sender, EventArgs e)
{
label1.Text = Wakati("テストです");
}
//わかち解析
private string Wakati(string str)
{
IntPtr mecab = mecab_new2("-O wakati");
string s = mecab_sparse_tostr(mecab, str); //ここで終了してしまいます。
mecab_destroy(mecab);
return s;
}
}
}
が、これでもやはりプログラムが終了してしまいます。
libmecab.dllは、このプログラムのbinフォルダにコピーしています。
OSが64bitなのが関係しているのでしょうか?
※MeCabはProgram Files (x86)ではなく、C:\Program Files\MeCab内にインストールしています。
Re: C# MeCab わかち解析
Posted: 2011年10月10日(月) 19:20
by 2³
よく調べてみると、どうやら64bitが関係しているようでした。
なので、
http://www.ipentec.com/document/documen ... b-exe-call
の通りにexeを呼び出す方法をとることにしました。
ありがとうございました。