コンピュータサイエンスの世界での言語といえばプログラミング言語なので、人間が話したり書いたりする言語のことを自然言語と呼びます。なので自然言語を扱う研究・開発領域のことを自然言語処理なんて言ったりします。これまでも自然言語処理はキュレーションメディアや文書分類に応用されてきました。最近ではLINE、Facebook、SlackなどのAPI公開によってチャットボットが盛り上がっているのでこちらの領域でも応用されています。

今回は、その中でも日本語形態素解析の使い方を紹介します。

形態素解析とは

形態素というのは言語で意味を持つ最小単位のことをいいます。英語だったら This is a pen.のうちThis is a pen . それぞれのことです。形態素には品詞や読みが存在します。英語だったら文をspaceでsplitして記号を考慮するだけでいいのですが、日本語は単語が繋がっているのでそう簡単にはいきません。辞書と一致させて品詞のもっともらしい繋がりを計算して分割します。このあたりのアルゴリズムに興味のある方はこちらが参考になります。

Mecabを使ってみよう

日本語形態素解析を開発で利用するときは、一般的にMecabというライブラリを利用します。今回はMecabとPythonで形態素解析する紹介をします。

インストール

Macであれば

$ brew install mecab mecab-ipadic

とします。その後 こちらからpythonバインディングをダウンロードして、

$ tar xvfz mecab-python-x.xx.tar.gz
$ cd mecab-python-x.xx
$ python setup.py install

これでインストール完了します。次にPythonコードを書いていきます。

Taggerのオプションは以下のようになっています。

  • 'mecabrc' : デフォルト
  • '-Ochasen' : ChaSen 互換形式
  • '-Owakati' : 分かち書きのみを出力
  • '-Oyomi' : 読みのみを出力
# -*- coding: utf-8 -*-
import MeCab

def get_surfaces(node):
    words = []
    while node:
        word  = node.surface.decode('utf-8')
        words.append(word)
        node = node.next
    return words

def get_nouns(node):
    nouns = []
    while node:
        noun = node.feature.split(",")[0].decode('utf-8')
        nouns.append(noun)
        node = node.next
    return nouns

raw_string = u"すもももももももものうち"
mt = MeCab.Tagger('mecabrc')

node = mt.parseToNode(raw_string.encode('utf-8'))
words, nouns = get_surfaces(node), get_nouns(node)

for (word, noun) in zip(words, nouns):
    print(u"{0} : {1}".format(word, noun))

実行してみると

 : BOS/EOS
すもも : 名詞
も : 助詞
もも : 名詞
も : 助詞
もも : 名詞
の : 助詞
うち : 名詞
 : BOS/EOS

と上手く単語に切り分けられて、品詞情報を取得することができました。