Windows環境のPythonで形態素解析器 -- ChaSen -- を使う方法

# Chasenのインストール手順
### 1.Cygwinのインストール
今回は**Cygwin**環境にChasenをインストールするため、Cygwinをインストールします。
Cygwinのダウンロードは[**こちら**](https://www.cygwin.com/)から
使用するパッケージはlibiconv, libiconv-devel, libcrypt-devel, make, gcc-g++になります。

### 2.Dartsのインストール
Cygwin環境にDartsをインストールします。
Dartsのダウンロードは[**こちら**](http://chasen.org/~taku/software/darts/)から（今回は darts-0.32.tar.gz を使用しています。）

Cygwinを起動し、Dartsの保存先に移動する。(以下はダウンロードに保存した場合)
以下のようにインストールをする。
```
cd /cygdrive/c/Users/○○/Downloads/
tar -xzvf darts-0.32.tar.gz
cd darts-0.32
./configure
make
make check
make install
cd ..
```

### 3.ChaSenのインストール
Cygwin環境にChaSenをインストールします。
ChaSenのダウンロードは[**こちら**](https://osdn.jp/projects/chasen-legacy/)から（今回は chasen-2.4.5.tar.gz を使用しています。）

Cygwinを起動し、ChaSenの保存先に移動する。(以下はダウンロードに保存した場合)
以下のようにインストールをする。
```
cd /cygdrive/c/Users/○○/Downloads/
tar -xzvf chasen-2.4.5.tar.gz
cd chasen-2.4.5
./configure LIBICONV='-liconv' LIBS='-liconv'
make
make check
make install
cd ..
```

### 4.IPAdic（ChaSenの辞書）のインストール
Cygwin環境にIPAdicをインストールします。
IPAdicのダウンロードは[**こちら**](https://osdn.jp/projects/ipadic/releases/)から（今回は ipadic-2.7.0.tar.gz を使用しています。）

Cygwinを起動し、IPAdicの保存先に移動する。(以下はダウンロードに保存した場合)
以下のようにインストールをする。
```
cd /cygdrive/c/Users/○○/Downloads/
tar -xzvf ipadic-2.7.0.tar.gz
cd ipadic-2.7.0.tar.gz
./configure
make
make install
cd ..
```

### 5.辞書の文字コードを変更
ChaSenはEUCで作られているため、このままでは文字化けします。
そのため、辞書をUTF-8に変更する必要があります。
まず、Cygwin環境にnkfをインストールします。
nkfのダウンロードは[**こちら**](https://ja.osdn.net/projects/nkf/)から（今回は nkf-2.1.5.tar.gz を使用しています。）

Cygwinを起動し、nkfの保存先に移動する。(以下はダウンロードに保存した場合)
以下のようにインストールをする。
```
cd /cygdrive/c/Users/○○/Downloads/
tar -xzvf nkf-2.1.5.tar.gz
cd nkf-2.1.5.tar.gz
./configure
make
make install
cd ..
```

次に、以下のように辞書の文字コードを変更する。
```
cd /cygdrive/c/Users/○○/Downloads/
cd ipadic-2.7.0.tar.gz
make clean
find -name '*.dic' | xargs nkf --overwrite -w
find -name '*.cha' | xargs nkf --overwrite -w
`chasen-config --mkchadic`/makemat -i w
`chasen-config --mkchadic`/makeda -i w chadic *.dic
./configure
make
make install
nkf -w --overwrite /usr/local/etc/chasenrc
```

ここで一度、テストする。chasenには-iwのオプションを付けて呼び出します。
```ruby:テスト
echo 'テストです。出来ていますか？'|chasen -iw
```
```ruby:結果
テスト  テスト  テスト  名詞-サ変接続
です    デス    です    助動詞  特殊・デス      基本形
。      。      。      記号-句点
出来    デキ    出来る  動詞-自立       一段    連用形
て      テ      て      助詞-接続助詞
い      イ      いる    動詞-非自立     一段    連用形
ます    マス    ます    助動詞  特殊・マス      基本形
か      カ      か      助詞-副助詞／並立助詞／終助詞
？      ？      ？      記号-一般
EOS
```
このようになれば、ChaSenのインストールは完了です。

# コマンドプロンプトでChaSenを実行
### 1.環境変数を変更する
「Path」を選び、［編集］をクリックする。
「;C:\cygwin\bin;C:\cygwin\usr\bin;C:\cygwin\usr\local\bin」を追加する。

さらに［新規］でLD_LIBRARY_PATH環境変数を追加する。
値は「C:\cygwin\lib;C:\cygwin\lib\w32api;C:\cygwin\usr\local\lib」とする。

### 2.コマンドプロンプトでChaSenを実行
Windowsのコマンドプロンプトの文字コードをUTF-8に変更し、実行する。
```
chcp 65001
echo 'テストです。出来ていますか？'|chasen -iw
```
Cygwinの時と同じ結果が出力されればOK。

# Windows環境のPythonでChaSenを実行
ソースコードを以下に載せております。
```python:chasen.py
import subprocess
import time

def strip_cmd_injection(instr):
    inj = [";", "|", "&", "`", "(", ")", "$", "<", ">", "*", "?", "{", "}", "[", "]", "!", "\n"]
    for s in inj:
        instr = instr.replace(s, "")
    instr = instr.replace("", "")
    return instr

def chasen(arg):
    arg = strip_cmd_injection(arg)
    cmd = "echo {0} | chasen -iw".format(arg)
    subprocess.Popen("chcp 65001", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    time.sleep(0.1) # chcp 65001の反映待ち
    proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    if stderr != b'':
        raise(Exception(stderr.decode('utf-8')))

    try:
        lines = stdout.decode('utf-8').split("\n")
    except:
        raise(Exception(stderr.decode('utf-8')))

    for line in lines:
        if (line == "EOS"):
            break
        yield line.split("\t")

if __name__ == '__main__':
    line = "'テストです。出来ていますか？'"
    for cha in chasen(line):
        print(cha)
```
コマンドプロンプトで実行した時と同じ結果が出力されればOK。
以上、Windows環境のPythonでChaSenを使う方法でした。

# 参考にしたページ
https://www.detch.info/blog/2016/01/15/windows10-64bit-cygwin-64bit-%E3%81%A7-chasen/

http://unno3.blog.fc2.com/blog-entry-7.html

https://umiushizn.blogspot.com/2017/09/python3chasencentos-7.html

https://news.mynavi.jp/article/20131125-zerokaracygwin/