MeCab と CaboCha を VB.NET から呼び出す

2014-08-09:
mecab-0.996 と cabocha-0.68 の組み合わせで再確認した。
https://github.com/dechnostick/MeCabAndCaboChaSample

参考:
http://homepage1.nifty.com/yasunari/VB/VB2005/MeCab.htm

それぞれインストール済みであること。パスが通っていること。
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
cabocha - Yet Another Japanese Dependency Structure Analyzer - Google Project Hosting

実際に利用できる関数はもっとある。
詳細はそれぞれのソースのヘッダファイルを参照。
(mecab.h, cabocha.h)

mecab-0.98.exe と cabocha-0.60.exe の組み合わせで確認済み。
これ以外のバージョンに変えると CaboCha が動かなかった。

MeCab

Imports System.Runtime.InteropServices

Class MeCab
    Implements IDisposable

    <DllImport("libmecab.dll", CallingConvention:=CallingConvention.Cdecl)>
    Public Shared Function mecab_new2(ByVal arg As String) As IntPtr
    End Function

    <DllImport("libmecab.dll", CallingConvention:=CallingConvention.Cdecl)>
    Public Shared Function mecab_sparse_tostr(ByVal m As IntPtr, ByVal str As String) As IntPtr
    End Function

    <DllImport("libmecab.dll", CallingConvention:=CallingConvention.Cdecl)>
    Public Shared Sub mecab_destroy(ByVal m As IntPtr)
    End Sub

    Private ptrMeCab As IntPtr

    Sub New()
        Me.New(String.Empty)
    End Sub

    Sub New(ByVal Arg As String)
        ptrMeCab = mecab_new2(Arg)
    End Sub

    Public Function Parse(ByVal [String] As String) As String
        Dim ptrResult As IntPtr = mecab_sparse_tostr(ptrMeCab, [String])
        Dim strResult As String = Marshal.PtrToStringAnsi(ptrResult)
        Return strResult
    End Function

    Public Overloads Sub Dispose() Implements IDisposable.Dispose
        mecab_destroy(ptrMeCab)
        GC.SuppressFinalize(Me)
    End Sub

    Protected Overrides Sub Finalize()
        Dispose()
    End Sub
End Class

CaboCha

Imports System.Runtime.InteropServices

Class CaboCha
    Implements IDisposable

    <DllImport("libcabocha.dll", CallingConvention:=CallingConvention.Cdecl)>
    Public Shared Function cabocha_new2(ByVal arg As String) As IntPtr
    End Function

    <DllImport("libcabocha.dll", CallingConvention:=CallingConvention.Cdecl)>
    Public Shared Function cabocha_sparse_tostr(ByVal m As IntPtr, ByVal str As String) As IntPtr
    End Function

    <DllImport("libcabocha.dll", CallingConvention:=CallingConvention.Cdecl)>
    Public Shared Sub cabocha_destroy(ByVal m As IntPtr)
    End Sub

    Private ptrCaboCha As IntPtr

    Sub New()
        Me.New(String.Empty)
    End Sub

    Sub New(ByVal arg As String)
        ptrCaboCha = cabocha_new2(arg)
    End Sub

    Public Function Parse(ByVal [String] As String) As String
        Dim ptrResult As IntPtr = cabocha_sparse_tostr(ptrCaboCha, [String])
        Dim strResult As String = Marshal.PtrToStringAnsi(ptrResult)
        Return strResult
    End Function

    Public Overloads Sub Dispose() Implements IDisposable.Dispose
        cabocha_destroy(ptrCaboCha)
        GC.SuppressFinalize(Me)
    End Sub

    Protected Overrides Sub Finalize()
        Dispose()
    End Sub
End Class

使い方

Public Class Class1
    Public Shared Sub Main(ByVal args() As String)

        Using m As New MeCab()
            Dim sentence As String = "太郎はこの本を二郎を見た女性に渡した。"
            Dim mecabOut As String = m.Parse(sentence)
            Dim lines() As String = mecabOut.Split(ControlChars.Lf)
            For Each line As String In lines
                Console.WriteLine(line)
            Next
        End Using

        Using c As New CaboCha("-f1 -I0 -O4")
            Dim sentence As String = "太郎は花子が読んでいる本を次郎に渡した"
            Dim cabochaOut As String = c.Parse(sentence)
            Dim lines() As String = cabochaOut.Split(ControlChars.Lf)
            For Each line As String In lines
                Console.WriteLine(line)
            Next
        End Using
    End Sub
End Class

出力結果

太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

* 0 5D 0/1 1.228558
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー    B-PERSON
は      助詞,係助詞,*,*,*,*,は,ハ,ワ    O
* 1 2D 0/1 1.734440
花子    名詞,固有名詞,人名,名,*,*,花子,ハナコ,ハナコ    B-PERSON
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ O
* 2 3D 0/2 0.000000
読ん    動詞,自立,*,*,五段・マ行,連用タ接続,読む,ヨン,ヨン      O
で      助詞,接続助詞,*,*,*,*,で,デ,デ  O
いる    動詞,非自立,*,*,一段,基本形,いる,イル,イル      O
* 3 5D 0/1 0.000000
本      名詞,一般,*,*,*,*,本,ホン,ホン  O
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ O
* 4 5D 1/2 0.000000
次      名詞,一般,*,*,*,*,次,ツギ,ツギ  O
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー  O
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ O
* 5 -1D 0/1 0.000000
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ      O
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ   O
EOS