C# MeCab わかち解析

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
記事: 58
登録日時: 13年前
住所: 大阪府

C# MeCab わかち解析

#1

投稿記事 by » 12年前

日本語形態解析エンジン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です。

勝手に終了してしまう理由と改善策をご教授いただける方、いらっしゃいましたら宜しくお願いいたします。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: C# MeCab わかち解析

#2

投稿記事 by YuO » 12年前

調べてみると,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って何だと自分で突っ込みたい……。

アバター
記事: 58
登録日時: 13年前
住所: 大阪府

Re: C# MeCab わかち解析

#3

投稿記事 by » 12年前

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内にインストールしています。

アバター
記事: 58
登録日時: 13年前
住所: 大阪府

Re: C# MeCab わかち解析

#4

投稿記事 by » 12年前

よく調べてみると、どうやら64bitが関係しているようでした。

なので、
http://www.ipentec.com/document/documen ... b-exe-call
の通りにexeを呼び出す方法をとることにしました。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る