LoginSignup
2
1

More than 5 years have passed since last update.

NMeCabをExcelから召喚してみる

Last updated at Posted at 2016-03-25

NMeCabComを使わない方法。
こんな具合に使えるよという例示にすぎません。

準備

  • .NET Framework 4.0環境

  • Excel-DNA一式
    ExcelDna.xllは作成するdnaファイル名に合わせてNMeCabTest.xllに変更。

  • MeCabのインストール

  • libnmecab.dll

呪文

以下をテキストエディタで作成して、上記のxllと同じフォルダに置いておくこと。

NMeCabTest.dna
<DnaLibrary RuntimeVersion="v4.0" Name="NMeCabTest" Description="Using NMeCab" Language="CS">
<Reference Path="LibNMeCab.dll" />
<![CDATA[

using System;
using System.Text;
using NMeCab;

public class NMeCabTest
{

    public static string NMeCabParseTest()
    {
        try
        {
            string sentence = "行く川のながれは絶えずして、しかも本の水にあらず。";

            MeCabParam param = new MeCabParam();
            param.DicDir = @"C:\Program Files\MeCab\dic\ipadic";

            // NMeCab はクラス名が変更されている
            MeCabTagger t = MeCabTagger.Create(param);

            // 一気に結果をもらう
            string result = t.Parse( sentence );
            return result;
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
}
]]>
</DnaLibrary>

詠唱

ワークブックにNMeCabTest.xllをドラッグ&ドロップして、「このアドインをこのセッションに限り有効にする」を選択しておく。

セルに数式として下記を入力。

=NMeCabParseTest()

パースした結果が取得できればOK。

追記

少し遊びやすくしてみました。

ExcelDna.xllはUsingNMeCab.xllにファイル名変更。

下記をテキストファイル(UTF-8推奨)で作成。

UsingNMeCab.dna
<DnaLibrary RuntimeVersion="v4.0" Name="UsingNMeCab" Description="Using NMeCab" Language="CS">
<Reference Path="LibNMeCab.dll" />
<![CDATA[

using System;
using System.Text;
using NMeCab;

public class UsingNMeCab
{
    public static string NMeCabParse(string sentence)
    {
        try
        {
            MeCabParam param = new MeCabParam();
            // 辞書のパスは環境に合わせること
            param.DicDir = @"C:\Program Files\MeCab\dic\ipadic";

            // NMeCab はクラス名が変更されている
            MeCabTagger t = MeCabTagger.Create(param);

            string result = "";
            MeCabNode node = t.ParseToNode(sentence);
            while (node != null) {
                if (node.CharType > 0) result += node.Surface + "," + node.Feature + "\n";
                node = node.Next;
            }

            return result;
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
}
]]>
</DnaLibrary>

セルに

=NMeCabParse("行く川のながれは絶えずして、しかも本の水にあらず。")

のように数式を入れると解析結果が文字列として返ってくるので、

Sub SplitResult(s As String)

    Dim i As Long, j As Long
    Dim tmp1 As Variant, tmp2 As Variant

    tmp1 = Split(s, Chr(10))
    For i = LBound(tmp1) To UBound(tmp1)
        tmp2 = Split(tmp1(i), ",")
        For j = LBound(tmp2) To UBound(tmp2)
            Cells(2 + i, 1 + j).Value = tmp2(j) ' 位置調整は好みで
        Next j
    Next i

End Sub

のようなマクロで分割表示できます。

解析結果を多元配列で返すようにすると、意外に後処理が面倒
http://qiita.com/acknpop/items/844b7e8d026fc08ccc7b
なので今回は合わせ技で。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1