初めての自然言語処理 入門 1 ~MeCabを動かしてみよう ~


# 形態素解析とは？
ここでは、簡単に形態素解析を説明します。
まず、形態素(morpheme, モーフィーム)とは、意味をになう最小の言語単位です。例えば、「私は山田太郎です。」は,「私」,「は」,「山田」,「太郎」,「です」,「。」の5つの形態素に分けることができます。
形態素解析は、文章(または文, 文節)を形態素に分解し、各形態素に品詞の情報を付与します。
日本語の形態素解析のより詳しい解説は、[MeCab公式](http://taku910.github.io/mecab/#parse)や[Python による日本語自然言語処理](http://www.nltk.org/book-jp/ch12.html#id32) を参照してください。
# MeCabの使い方
## インストール
インストールは、https://qiita.com/taroc/items/b9afd914432da08dafc8　などを参考にしてください。
## 簡易的な形態素解析
ここでは、PythonからMeCabを利用して形態素解析を行います。
まずは、PythonでMeCabの様々な機能を利用するために、MeCabをインポートします。


```python
import MeCab
mecab_non = MeCab.Tagger ()
```

MeCabのparseを利用して、文字列"私は山田太郎です。"の形態素を取り出します。
parseは品詞で分類し説明するや構文分析をするという意味の通り、引数で指定された文字列に対して解析を行います。この解析の結果は、文字列として得ることができます。

parse メソッドを利用した文字列"私はゴールデンハムスターです。"の形態素解析の結果は次のように文字列として変数に保持されています。


```python
m_data = mecab_non.parse("私はゴールデンハムスターです。")
print(m_data)
```

    私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
    は	助詞,係助詞,*,*,*,*,は,ハ,ワ
    ゴールデン	名詞,固有名詞,一般,*,*,*,ゴールデン,ゴールデン,ゴールデン
    ハムスター	名詞,一般,*,*,*,*,ハムスター,ハムスター,ハムスター
    です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
    。	記号,句点,*,*,*,*,。,。,。
    EOS
    


上記の形態素解析の出力結果のフォーマットは、表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音とされています。
- 表層形: 解析前の文中において文字列として実際に出現した形態素
- \t : タブ
- EOS: End Of Statement


## MeCabと茶筌の互換性
MeCabの出力フォーマットを茶筌の出力フォーマットに合わせるためには、Tagger の引数に"-Ochasen"を指定します。
- -O: --output-format-type
- chasen: 茶筌互換形式で解析結果を出力

その他の指定は[MeCabのコマンドライン引数一覧とその実行例](http://www.mwsoft.jp/programming/munou/mecab_command.html#output-format-type)を参考にしてください。


```python
import MeCab
mecab_chasen = MeCab.Tagger ("-Ochasen")
m_data = mecab_chasen.parse("私はゴールデンハムスターです。")
print(m_data)
```

    私	ワタシ	私	名詞-代名詞-一般		
    は	ハ	は	助詞-係助詞		
    ゴールデン	ゴールデン	ゴールデン	名詞-固有名詞-一般		
    ハムスター	ハムスター	ハムスター	名詞-一般		
    です	デス	です	助動詞	特殊・デス	基本形
    。	。	。	記号-句点		
    EOS
    


上の結果は、タブ(\t)刻みで出現形、読み、原形、品詞、活用の順で出力されている。

## 辞書の追加
MeCabのデフォルトでの形態素解析では、適切な形態素に分けられない場合があります。
例えば、これまでに解析した「私はゴールデンハムスターです。」の「ゴールデンハムスター」は、「ゴールデン」と「ハムスター」ではなく、固有名詞の「ゴールデンハムスター」と識別されるべきです。この問題を解消するために、NEologd と呼ばれる辞書を利用します。



```python
mecab_ipdic = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
m_data_ipdic = mecab_ipdic.parse("私はゴールデンハムスターです。")
m_data_non = mecab_non.parse("私はゴールデンハムスターです。")
print(m_data_ipdic)
print(m_data_non)
```

    私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
    は	助詞,係助詞,*,*,*,*,は,ハ,ワ
    ゴールデンハムスター	名詞,固有名詞,一般,*,*,*,ゴールデンハムスター,ゴールデンハムスター,ゴールデンハムスター
    です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
    。	記号,句点,*,*,*,*,。,。,。
    EOS
    
    私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
    は	助詞,係助詞,*,*,*,*,は,ハ,ワ
    ゴールデン	名詞,固有名詞,一般,*,*,*,ゴールデン,ゴールデン,ゴールデン
    ハムスター	名詞,一般,*,*,*,*,ハムスター,ハムスター,ハムスター
    です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
    。	記号,句点,*,*,*,*,。,。,。
    EOS
    


m_data_ipdicは、NEologd 辞書を用いた形態素解析の結果が格納されています。m_data_non、はデフォルトの形態素解析の結果が格納されています。m_data_ipdicの出力結果から、ゴールデンハムスターは一つの形態素として識別されていることがわかります。


## 複数の文の解析
次のように複数の文(文章)でも分析は可能です。


```python
s = "私はゴールデンハムスターです。名前はラピスラズリです。"
s_data = mecab_ipdic.parse(s)
print(s_data)
```

    私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
    は	助詞,係助詞,*,*,*,*,は,ハ,ワ
    ゴールデンハムスター	名詞,固有名詞,一般,*,*,*,ゴールデンハムスター,ゴールデンハムスター,ゴールデンハムスター
    です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
    。	記号,句点,*,*,*,*,。,。,。
    名前	名詞,一般,*,*,*,*,名前,ナマエ,ナマエ
    は	助詞,係助詞,*,*,*,*,は,ハ,ワ
    ラピスラズリ	名詞,固有名詞,一般,*,*,*,LAPIS LAZULI,ラピスラズリ,ラピスラズリ
    です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
    。	記号,句点,*,*,*,*,。,。,。
    EOS
    


# 参考文献
- MeCab: Yet Another Part-of-Speech and Morphological Analyzer, http://taku910.github.io/mecab/#parse, 2019/05/02
- Steven Bird, Ewan Klein, Edward Loper 著 萩原 正人、中山 敬広、水野 貴明　訳 『入門 自然言語処理』 O'Reilly Japan, 2010. Python による日本語自然言語処理, (http://www.nltk.org/book-jp/ch12.html#id32)