imadedede のブログ

今出川潤の出張所。

NMeCab を .NET アプリに組み込んで形態素解析

MeCab というものがある。
誤解される恐れがあるのを承知で、かなりざっくりといいかげんに説明すると、これを使うと日本語の漢字の読みとかを文脈に沿って解析してくれる。

MacOS X には(10.5以降から?)標準で入っていて Spotlight 検索などに使われているし、ゆっくり MovieMaker はこれを使っていることが売りの一つになっている。

NMeCab とは、その MeCabC# で書き直されたもの。「ゆっくいち!」は C# 2.0 で開発しているので、試しに NMeCab を使ってみた。

準備

ダウンロードしてくる

NMeCab 配布ページにて最新版をダウンロード。

解凍して、フォルダ内からいくつかテストに必要なモノをもってくる。

現時点での最新版は 0.06.3 。解凍すると NMeCab0.06.3 というフォルダができる。

NMeCab.dll をとってくる

NMeCab0.06.3/trunk/bin にある。 NMeCab の核。

MMF 版もあるけど、これを使うなら C# 4.0 でないといけない。今回は C# 2.0 環境でやりたいのでとりあえずここにあるものを使う。

元々の MeCab に対してバインディングしているわけではないので、この DLL で機能が完結している。

WindowsFormsSample.exe.config をとってくる

NMeCab0.06.3/trunk/bin にある。要は DLL と同じ場所の XML 。辞書のパス指定に使う。

XML 内のシステム辞書を指定するパスの ..\dic\ipadic を、今回は .\dic\ipadic に変更。そしてファイル名を NMeCabTest.exe.config に変更する。

ダウンロードしたものには IPA 辞書が入っているが、自分で NAIST 辞書をダウンロードしてコンパイルしてこのファイルで指定すれば、 NMeCab で NAIST 辞書を使用することも可能。

NMeCab 自体には辞書のコンパイル機能はない。元々の MeCab を使わないといけない。

辞書をとってくる

NMeCab0.06.3/trunk/ にあるdicフォルダをフォルダごととってくる。
DLL の一つ上のフォルダにある。

とってきたものをあつめる

以上、用意したモノを一つのフォルダに集める。
最終的なフォルダ構成はこんな感じ。

temp
├─LibNMeCab.dll
├─NMeCabTest.cs
├─NMeCabTest.exe.config
└─dic
    └─ipadic
        ├─char.bin
        ├─dicrc
        ├─matrix.bin
        ├─sys.dic
        └─unk.dic

この LibNMeCab.dll と同じ場所に NMeCabTest.cs ファイルを作り、コーディングしていく。

テストコード

クラス名やコンストラクタが多少違うもの、基本的には他の MeCab バインディングと変わらない。

/*
 * NMeCab はクラス名が変更されている
 * MeCab::Tagger ⇒ NMeCab.MeCabTagger
 * MeCab::Node ⇒ NMeCab.MeCabNode
 * 
 * 詳しい実装やクラスメンバなどは NMeCab0.06.3/trunk/LibNMeCab/MeCabNode.cs など参照。
 * 
 * mono で使うなら、辞書ファイルパスのバックスラッシュをスラッシュに変更
 * コンパイルは
 * gmcs -r:module.dll use_module.cs
 * 
 */
using System;
using NMeCab;

public class NMeCabTest{
	static public void Main(){
		string sentence = "行く川のながれは絶えずして、しかも本の水にあらず。";
		
		// NMeCab はクラス名が変更されている
		MeCabTagger t = MeCabTagger.Create();
		
		// 形態素を一つずつたどっていく
		Console.WriteLine("形態素をひとつずつたどっていく");
		MeCabNode node = t.ParseToNode( sentence );
		while( node != null ){
			Console.WriteLine(node.Surface + "\t" + node.Feature);
			node = node.Next;
		}
		Console.WriteLine();
		
		// 一気に結果をもらう
		Console.WriteLine("一気に結果をもらう");
		string result = t.Parse( sentence );
		Console.WriteLine(result);
	}
 
}

コンパイル

DLL をライブラリとして指定するのを忘れずに。

csc \r:LibNMeCab.dll NMeCabTest.cs

あと実行前に EXE ファイル名と .exe.config のファイル名が対応していることを確認。

NMeCabTest.exe
NMeCabTest.exe.config

実行結果

コマンドを実行。

$ .¥NMeCabTest.exe
形態素をひとつずつたどっていく
行く川のながれは絶えずして、しかも本の水にあらず。	BOS/EOS,*,*,*,*,*,*,*,*
行く	動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク
川	名詞,一般,*,*,*,*,川,カワ,カワ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ながれ	動詞,自立,*,*,一段,連用形,ながれる,ナガレ,ナガレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
絶えず	副詞,一般,*,*,*,*,絶えず,タエズ,タエズ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
しかも	接続詞,*,*,*,*,*,しかも,シカモ,シカモ
本	名詞,一般,*,*,*,*,本,ホン,ホン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
あら	動詞,自立,*,*,五段・ラ行,未然形,ある,アラ,アラ
ず	助動詞,*,*,*,特殊・ヌ,連用ニ接続,ぬ,ズ,ズ
。	記号,句点,*,*,*,*,。,。,。
	BOS/EOS,*,*,*,*,*,*,*,*

一気に結果をもらう
行く	動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク
川	名詞,一般,*,*,*,*,川,カワ,カワ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ながれ	動詞,自立,*,*,一段,連用形,ながれる,ナガレ,ナガレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
絶えず	副詞,一般,*,*,*,*,絶えず,タエズ,タエズ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
しかも	接続詞,*,*,*,*,*,しかも,シカモ,シカモ
本	名詞,一般,*,*,*,*,本,ホン,ホン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
あら	動詞,自立,*,*,五段・ラ行,未然形,ある,アラ,アラ
ず	助動詞,*,*,*,特殊・ヌ,連用ニ接続,ぬ,ズ,ズ
。	記号,句点,*,*,*,*,。,。,。
EOS

解析できてる。

その他

ライセンスは GPL / LGPL のデュアルライセンス。アプリに組み込むのも悪くない。

そんな感じで、将来的には「ゆっくいち!」にも組み込みたい。

yukktalk の処理を助けるツールを作ってみた

ゆっくいち!

これは、動画製作ソフト yukktalk の Step1 での作業を補助するためのツールです。
ダウンロード

2012/10/28 更新

ver.1.3.0
・字幕
 形態素改行。
・そのほか
 辞書サイズを改善。台本タイトルを台本のファイル名から取得。

インストール

Vista 以降の人は、解凍してすぐ使えます。

Windows XP 以前の人は .NET 2.0 が必要です。
たぶんここらへん
http://www.microsoft.com/ja-jp/download/details.aspx?id=1639
http://www.microsoft.com/ja-jp/download/details.aspx?id=5913

アンインストールはゴミ箱に捨てるだけです。

あと前提として、 yukktalkAviUtl棒読みちゃんがインストール済みの環境を想定してます。

使い方

1. 台本テキストを用意します。
2. 台本テキストを EXE ファイルにドラッグ&ドロップします。
3. できたファイルを見直して、足りない部分を書き足します。
4. yukktalk の Step2 に進みます。

複数ファイルを同時に投げてもオッケーです。
たぶん「送る」に登録しても動くと思います。


台本テキストの書式について

台本の素.txt を実際に変換してみればだいたいわかると思います。
わかった人はこのセクションを読む必要ないです。

この「ゆっくいち!」は、普通に書いたシナリオを yukktalk で使えるように変換できればいいなあ、と思ったのが開発の動機です。
なので、だいたい一般的なシナリオの書き方に沿っていると思います。
具体的に例を挙げてみます。

カギ括弧

ゆっくり霊夢「ゆっくりしていってね!」

こう書いたときは、カギ括弧の手前を発言者として抜き取り、カギ括弧の内側を発言内容として抜き取っています。
字幕にも棒読みちゃん用台本にも、カギ括弧の中身が渡されます。

◆ゆっくり霊夢
[字幕]ゆっくり霊夢
[字幕]ゆっくりしていってね!
[音声]ゆっくりしていってね!

まる括弧

ゆっくり霊夢(どういうことなの……?)

こう書いたときは、マル括弧の手前を発言者として抜き取り、マル括弧つきの台詞を字幕として抜き取り、マル括弧の内側を棒読みちゃん用台本として抜き取っています。

◆ゆっくり霊夢
[字幕]ゆっくり霊夢
[字幕](どういうことなの……?)
[音声]どういうことなの……?

カギ括弧付きの字幕

もし字幕をカギ括弧付きで表示したいときは

ゆっくり霊夢:「ゆっくりしていってね!」

のように、カギ括弧と名前の間に全角コロンを挟んで下さい。これで、字幕にはカギ括弧つきで表示されるはずです。

◆ゆっくり霊夢
[字幕]ゆっくり霊夢
[字幕]「ゆっくりしていってね!」
[音声]ゆっくりしていってね!

名前にまる括弧つき

では、次のようなときはどう変換されるでしょうか。

村人(ゆっくり霊夢)「なんでしょうかな」

これは、このように変換します。

◆ゆっくり霊夢
[字幕]村人(ゆっくり霊夢)
[字幕]なんでしょうかな。
[音声]なんでしょうかな。

個人的に、動画の制作中に悩んだのはこういう表記のときです。このときは、発言者の括弧の内側を発言者として抜き出し、そして皮とゆっくり霊夢の声を統一しました。
ですがニコニコで他の方の動画を拝見している限り、それをあえて別々にする方も見受けられます。なので、そこらへんは設定で変えられるようになってます。


設定.txt について

書いてあるとおりです。
いろいろいじってみて下さい。
上記の作例では常に発言者を字幕表示しておりますが、設定で消すことはできます。

その他

MeCab 対応などは Python 版の方を使って下さい。他にもあっちの方が高機能な気がします。
将来的にはたぶんこっちも対応するんじゃないかな、とは思います。

2012年10月2日追記

棒読みちゃんの台詞部分の読み解析機能つきました。

たぶん今はあっちの Python スクリプトよりもこっちの方が高機能です。

サポート

とりあえずここのコメント欄にでも。


ツイッターとかはこらら
@imadedede

使用したライブラリなど

カタカナひらがな変換

kanaxs_ex-1.0.1.cs

http://wiki.dobon.net/index.php?free%2FkanaxsCSharp#extension

Copyright (c) 2011, DOBON! http://dobon.net
kanaxs_ex-1.0.1.cs は 修正 BSDライセンスで保護されています。

形態素解析

LibNMeCab.dll

http://sourceforge.jp/projects/nmecab/

NMeCab was ported from MeCab by Tsuyoshi Komuta, and is released under
any of the GPL (see the file GPL) or the LGPL (see the file LGPL).

MeCab is copyrighted free software by Taku Kudo and
Nippon Telegraph and Telephone Corporation, and is released under
any of the GPL (see the file GPL), the LGPL (see the file LGPL), or the
BSD License (see the file BSD).

LibNMeCab.dll は GPL / LGPL のデュアルライセンスで保護されています。
「ゆっくいち!」では LGPL にのっとり、動的なリンクで利用しています。

形態素解析用辞書

NAIST Japanese Dictionary

http://sourceforge.jp/projects/naist-jdic/

Copyright (c) 2009, Nara Institute of Science and Technology, Japan.
NAIST Japanese Dictionary は広告条項無しの BSD ライセンスで保護されています。

バージョン履歴

New! 2012/10/28 ver.1.3.0 ダウンロード
・字幕
 形態素改行。
・そのほか
 辞書サイズを改善。台本タイトルを台本のファイル名から取得。

2012/10/09 ver.1.2.0
・字幕
 半角文字は文字幅0.5として計算する設定を追加。

2012/10/03 ver.1.1.0
・そのほか
 設定.txt の読み込みを改善。
 読み解析と形態素置換の設定を改善。

2012/10/02 ver.1.0.0
棒読みちゃん用台本
 読み解析。形態素置換。
・そのほか
 エラーメッセージを修正。


2012/09/28 ver.0.4.1 ダウンロード
・全体
 アイコン変更

2012/09/28 ver.0.4.0
・全体
 エフェクトリスト。置換の不具合修正
・字幕
 置換の不具合修正
・設定.txt
 エフェクト設定を yukktalk 4f 台本を元に追加。

2012/09/26 夜くらい ver.0.3.0
・全体
 キャラ設定
・字幕
 表示速度の変更
・設定.txt
 キャラ設定を yukktalk 4f 台本を元に追加。
・そのほか
 台本の素を修正。設定.txt読み込みの不具合修正。

2012/09/26 ver.0.2.0
・全体
 置換。台本変換。
・字幕について
 置換。折り返し。禁則処理。はてな後空白。
棒読みちゃん用台本について
 置換
・そのほか
 初リリース

yukktalk の処理を助けるスクリプトを作ってみた

2012年10月2日追記

Windows アプリにしました。こちらをおすすめします。



yukktalk の処理を助けるスクリプトを作ってみました。

ダウンロード

ゆっくいち

yukktalk を便利にする Python スクリプトです。

これを使うと、 yukktalk の Step1 での作業が少し楽になります。

台本形式のテキストを yukktalk での Step1 の書式に変換します。

yukktalk の Step1 を助けるのでゆっくいちです。

Python 2.7.3 で動作確認してます。

使い方

Python をインストール

Windows 版。64bit でも動きますが、 MeCab (後述)を使うなら 32bit 版をインストールして下さい。
インストール後はパスを通しといてください。

Python スクリプトとして使う

コマンドプロンプトとかから Python スクリプトとして使ってください。

python yukk_ichi.py 台本テキスト.txt

ファイル名とかは適時読みかえて下さい。

できたファイルに適切なヘッダをつける

これだけだとまだ Step2 には足りないので、設定などのヘッダを手動でつけます。

◎タイトル/シーン
※共通,設定いろいろ・・・

これを追加すれば、 yukktalk の Step1 用台本として使えます。 Step2 に進んでください。

何が嬉しいの?

  • 台本を好きなエディタで書ける。
  • 字幕を自動で折り返しできる。

他にもいろいろおせっかいな機能付き。

使用例

変換前

霊夢「こんな感じで文章を書くと」
魔理沙「yukktalk書式に出力するよ!」
霊夢,効果=エコー「エコー指定だってかかるよ!」
魔理沙:「あえて括弧付きにしてみたり」
魔理沙,間=1.0「……とか間をとってみたり」
霊夢「そんな感じで変換できるよ」

変換後

◎

※魔理沙=,
※霊夢=,

◆霊夢
[字幕]霊夢
[字幕]こんな感じで文章を書くと。
[音声]こんな感じで文章を書くと
◆魔理沙
[字幕]魔理沙
[字幕]yukktalk書式に出力するよ!
[音声]yukktalk書式に出力するよ!
◆霊夢,効果=エコー
[字幕]霊夢
[字幕]エコー指定だってかかるよ!
[音声]エコー指定だってかかるよ!
◆魔理沙
[字幕]魔理沙
[字幕]「あえて括弧付きにしてみたり」
[音声]あえて括弧付きにしてみたり
◆魔理沙,間=1.0
[字幕]魔理沙
[字幕]……とか間をとってみたり。
[音声]…とか間をとってみたり
◆霊夢
[字幕]霊夢
[字幕]そんな感じで変換できるよ。
[音声]そんな感じで変換できるよ

ソースコード内で設定は変えられるので、いろいろ改造してみてください。

おまけ

MeCab 対応について

Python から MeCab を使って、音声台本の漢字の一部をカタカナに変換することができます。

Python

import MeCab

できる環境なら、 MeCab を使って棒読みちゃん用の音声台本部分を変換します。
MeCab を使うと「わ」と読む「は」と、「え」と読む「へ」は、ほぼ完璧に変換します。

UTF-8 辞書での動作確認しかしてません。

ここらへん参考にしました

ここらへんで紹介されている方法で MeCab Python をインストールするなら、 32bit Python でないとエラーがでると思います。

今後の予定

設定項目が多すぎるので GUI で設定できるようにしたい。
C# 難しい。