跳慮跋考

興味も思考も行先不明

形態素解析器

C#から直截形態素解析器のライブラリを使いたいよぉ…ふぇぇ…って人に。
茶筌はツン過ぎて辛かっただって何ですかstring[]渡すだけなのに。

using System.Runtime.InteropServices;

class MeCab : IDisposable
{
    IntPtr ptr;

    [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl)]
    private extern static IntPtr mecab_new2(string arg);
    [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl)]
    private extern static IntPtr mecab_sparse_tostr(IntPtr m, string str);
    [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl)]
    private extern static void mecab_destroy(IntPtr m);

    public MeCab()
    {
        ptr = mecab_new2(@"-F%m\s%f[6]\s%f[0]\n");
    }
    public string sparse_tostr(string str_in)
    {
        return Marshal.PtrToStringAnsi(mecab_sparse_tostr(ptr, str_in));
    }
    public void Dispose()
    {
        mecab_destroy(ptr);
    }
}

class Chasen
{
    [DllImport("libchasen.dll", CallingConvention = CallingConvention.Cdecl)]
    extern static int chasen_getopt_argv([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)]string[] argv, IntPtr file);
    [DllImport("libchasen.dll", CallingConvention = CallingConvention.Cdecl)]
    extern static IntPtr chasen_sparse_tostr(string str_in);

    public Chasen()
    {
        string[] argv = { "", "-s", "-F", @"%m %M %H\n", null };

        if (chasen_getopt_argv(argv, IntPtr.Zero) == 1)
            throw new ArgumentException();
    }
    public string sparse_tostr(string str_in)
    {
        return Marshal.PtrToStringAnsi(chasen_sparse_tostr(str_in));
    }
}