MeCabを使って日本語の単語数を数える。
こんにちは、高木です。
最近、日本語の単語数を数える方法について検討する機会がありました。
せっかくですので、その検討結果について書いておきます。
検討といっても、実際にはほどんど秒殺でした。
こうした機能をスクラッチで実装するのは気が遠くなりそうですが、既存のツールやライブラリを使うのであれば難なくできます。
ヨーロッパ語の場合、単語数は概ねスペース等で区切られたアルファベット列を数えれば済みます。
厳密なことをいえば、ハイフンを使って2行にまたがる単語の処理や、アポストロフィを用いた省略形の処理、数をどう扱うかなどに配慮する必要はありますが……。
日本語の場合、特殊なケースを除けば分かち書きされていません。
よって、漢字仮名交じり文を見て単語数を数えるのは、文を単語に分割する作業が大部分を占めます。
こういうときに役に立つのが形態素解析ツールです。
形態素解析を行うウェブサービスもありますが、いつでも確実に動作させるためには、外部サービスに依存するより自分のシステムに組み込んでしまうほうが確実です。
形態素解析ツールは昔からいくつかあり、中でもChasenやMeCabが有名です。
単に分かち書きをしたいだけであれば、kakasiというツールも使えると思います。
具体的は方法を紹介することにしましょう。
ここではMecabを使うことにします。
コマンドプロンプトからmecab -Owakatiをいうコマンドを打ち、標準入力から解析対象を文字列を与えれば、分かち書きされた結果が標準出力に出力されます。
1 2 3 | C:¥> mecab -Owakati 昨日、天王寺に買い物に行きました。 昨日 、 天王寺 に 買い物 に 行き まし た 。 |
結果から句読点などの記号を取り除き、空白で区切られた文字列の数を数えれば単語数を求めることができそうです。
ただ、若干注意が必要なこともあります。
たとえば、「MeCabを調査した。」という文を分かち書きすると、次のようになります。
1 2 | MeCabを調査した。 MeCab を 調査 し た 。 |
中学校で習った国文法では、「調査する」はサ行変格活用の動詞なので1語に数えるべきです。
けれどもMeCabでは、「調査」という名詞と「し」というサ変動詞「する」の連用形と解釈されてしまいます。
日本語の文法については専門家の間でも意見がわかれるところがあります。
ですので、MeCabの解釈が間違いというわけではありませんが、どんな流儀に従うかによって、ある程度の調整が必要なことがわかります。
このような細かい調整を行う場合、単に分かち書きするだけでは不十分です。
ここからがMeCabの本領発揮です。
コマンドプロンプトからオプション無しで単にmecabとだけ入力すれば次のような結果を得ることができます。
1 2 3 4 5 6 7 8 9 | C:¥> mecab MeCabを調査した。 MeCab 名詞,一般,*,*,*,*,* を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 調査 名詞,サ変接続,*,*,*,*,調査,チョウサ,チョーサ し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 。 記号,句点,*,*,*,*,。,。,。 EOS |
これなら、「調査」がサ変接続の名詞と解釈されていることがわかり、後続の「し」もサ変動詞の連用形であることがわかります。
ここまでわかれば、流儀に従って「調査」と「し」を「調査し」に連結することは簡単です。
ついでにいえば、MeCabを使えば、単に分解するだけでなく、文節に分解することもできそうです。
自立後(体言や用言、副詞など)と後続する付属語(助詞と助動詞)をひとまとめにすれば、おおむね文節とみなすことができます。
小学校低学年向けの文章など、使える漢字が少ない場合は文節単位で分かち書きしたほうが読みやすくなります。
手作業で分かち書きしてもいいのですが、入力しにくいので、こうして機械的に変換できれば便利ですね。
ほかにも文節に分解できると嬉しいケースがあります。
たとえば、点字への翻訳です。
点字は基本的に仮名文字しかありませんので、分かち書きが必須になります。
分かち書きの単位は文節と考えてよいでしょう。
MeCabを使えば読みも得られますので、点字に翻訳する上での一番の難関はすべてクリアできることになります。
ほかにも、MeCabのような形態素解析ツールを使えば、人工無能のようなものは比較的簡単に高機能を付加できるかもしれませんね。