[自然言語処理] MeCab, JUMAN, KNPの導入方法とPythonのサンプルプログラム（MacOS, Ubuntu18.04）

# MeCab, JUMAN
自然言語処理の中でも[形態素解析](https://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90)を行うツール

```shell
before: 今日は大変天気が良いです。
↓
after : 今日 / は / 大変 / 天気 / が / 良い / です　。
```

文章を与えると品詞単位に分解してくれます。
品詞情報も利用可能。

# KNP
自然言語処理の中でも[構文解析](https://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90)を行うツール

```terminal
before: 今日は大変天気が良いです。
↓
after : 今日は　→　良いです。
　　　　　大変　 →　天気が
　　　　 天気が　→　良いです。
```
ある単語がどの単語に係っているかを簡単に解析することが出来ます。

# 環境
- MacOS Mojave
- Ubuntu 18.04

# MacOSにinstall

## MeCab

本体と辞書のinstall

```terminal
// 本体
$ brew install mecab
// 辞書
$ brew install mecab-ipadic
```

拡張用の辞書を追加

```terminal
$ brew install git curl xz
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
```

swigとPython用MeCabライブラリのinstall

```terminal
$ brew install swig
$ pip install mecab-python3
```

これでPythonからMeCabを使えるようになります。

## JUMAN

```terminal
$ brew install jumanpp
```

JUMAN自体はこれだけでinstall終了です。
Pythonから利用するには```PyKNP```が必要です。

## KNP

```terminal
$ brew tap uetchy/nlp
$ brew install knp
```
私の場合、終わるまでに16分くらいかかりました。。。

## Pythonから利用できるようにする

```terminal
$ pip install pyknp
```

これでPythonから利用可能です。

# Ubuntu18.04にinstall

## MeCab
本体と辞書のinstall

```terminal
$ sudo apt install mecab
$ sudo apt install libmecab-dev
$ sudo apt install mecab-ipadic-utf8
```
拡張辞書のinstall

```terminal
$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ sudo bin/install-mecab-ipadic-neologd
```

/etc/mecabrcを編集します

```terminal
$ sudo vim /etc/mecabrc
```
dicdirを以下のように指定してください

```terminal
dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
```

### Pythonから使えるようにする

```terminal
$ sudo apt install swig
$ sudo apt install python3-pip
$ sudo pip3 install mecab-python3
```

これでOK。

## JUMAN++

```terminal
$ sudo apt install libboost-all-dev libcdb-dev libjuman zlib1g-dev
$ wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.02.tar.xz
$ tar xJvf jumanpp-1.02.tar.xz
$ cd jumanpp-1.02/
$ ./configure
$ make
$ sudo make install
```
これでOK。

## jumanpp

```terminal
$ wget http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2
$ tar xvf juman-7.01.tar.bz2
$ cd juman-7.01
$ ./configure
$ make
$ sudo make install
```

これでOK。

## KNP

```terminal
$ wget http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2
$ tar jxvf knp-4.19.tar.bz2
$ cd knp-4.16
$ ./configure
$ make
$ sudo make install
```

めちゃくちゃ時間かかるので覚悟しておいてください！


## Pythonから使えるようにする

```terminal
$ pip3 install pyknp
```

これでOK。


# サンプルプログラム

## MeCab

```python:mecab.py
import MeCab


def make_pos_to_word_list(sentence):
    mecab = MeCab.Tagger('mecabrc')
    mecab.parse('')
    node = mecab.parseToNode(text)
    while node:
        word = node.surface.lower()
        pos = node.feature.split(",")[0]
        node = node.next
        if word != '':
            yield {word: pos}


def main():
    sentence = '今日は大変天気が良いです。'
    pos_to_word_list = make_pos_to_word_list(sentence)
    for pos_to_word in pos_to_word_list:
        print(pos_to_word)


if __name__ == '__main__':
    main()
```

```terminal:result
$ python3 mecab.py

{'今日': '名詞'}
{'は': '助詞'}
{'大変': '名詞'}
{'天気': '名詞'}
{'が': '助詞'}
{'良い': '形容詞'}
{'です': '助動詞'}
{'。': '記号'}
```

## JUMAN

```python:juman.py
from pyknp import Juman


def parse_sentence(sentence):
    jumanpp = Juman()
    result = jumanpp.analysis(sentence)
    for mrph in result.mrph_list():
        yield mrph.midasi


def main():
    sentence = '今日は大変天気が良いです。'
    words = parse_sentence(sentence)
    for word in words:
        print(word, end=' ')
    print()


if __name__ == '__main__':
    main()
```

```terminal:result
$ python3 juman.py 

今日 は 大変 天気 が 良い です 。
```

## KNP

```python:knp.py
from pyknp import KNP


def make_dependency_pairs(line):
    knp = KNP()
    result = knp.parse(line)
    tag_list = result.tag_list()
    for tag in tag_list:
        if tag.parent_id == -1:
            continue
        parent_tag = tag_list[tag.parent_id]
        parent_phrase = ''.join(mrph.midasi for mrph in parent_tag.mrph_list())
        children_phrase = ''.join(mrph.midasi for mrph in tag.mrph_list())
        yield (children_phrase, parent_phrase)


if __name__ == '__main__':
    sentence = '今日は大変天気が良いです。'
    dependency_pairs = make_dependency_pairs(sentence)
    for dependency in dependency_pairs:
        child, parent = dependency
        print(child, ' => ', parent)
```

```terminal:result
$ python3 knp.py

今日は  =>  良いです。
大変  =>  天気が
天気が  =>  良いです。
```

# 終わりに
現在だとインストールはすんなりいくかもしれませんが、今後新しいダウンロードファイルに置き換わると404とかになることもあるのでできないなーって思ったら各自ダウンロードページに飛んでください！
リクエスト貰えれば修正します！