KH Coder を Ubuntu にインストールする(2021)

# これはなに？
この記事を読むと KH Coder を Ubuntu に入れるのがいかに大変かがわかります。時系列で書いてありますが、すべてを記録しているわけではないので再現性があるわけではないでしょう。

~~いずれ Docker にして簡単に提供できるようにしたい。~~
[KH Coder を Docker で動かす(2022)](https://qiita.com/ryos36/items/9802b5da6d80d8d73eb5)

# 環境
Azure にインストールした "Ubuntu 20.04.2 LTS" の server
最終的インストールされるもの

- Java(OpenJDK 11.0.11)
- R 3.6.3 といろんなパッケージ
- mecab と辞書
- Perl のモジュール
- mysql 5.6 (5.7 以降はだめ。普通にインストールすると 8.0 とかになるので注意)

参考にした資料
https://github.com/ko-ichi-h/khcoder/issues/91

Perl は 5.30 が入っていたのでそのままつかった。また、漢字コードは UTF-8 でいける。EUC-JP は一切出てこない。

# Java
まずは JRE を入れる。よーわからんけど JDK もいれちゃう。

```
$ sudo apt install default-jre
$ java --version
openjdk 11.0.11 2021-04-20

$ sudo apt install default-jdk
$ javac --version
javac 11.0.11
``` 
# R
たぶん大本命の R。3.6.3 と古め。

```
$ sudo apt install r-base
$ R
R version 3.6.3 (2020-02-29) -- "Holding the Windsock"
```

## R のパッケージ
これが偉く大変だった。本当に全部必要なのかは疑問。そして、全部インストールできたのかも確信が持てない。

```
sudo -i R
````

これで R のプロンプトが出るので以下のパッケージをインストールした。

```
install.packages("ade4", dependencies=TRUE)
install.packages("amap", dependencies=TRUE)
install.packages("Cairo", dependencies=TRUE)
install.packages("cluster", dependencies=TRUE)
install.packages("codetools", dependencies=TRUE)
install.packages("colorspace", dependencies=TRUE)
install.packages("dichromat", dependencies=TRUE)
install.packages("foreign", dependencies=TRUE)
install.packages("ggdendro", dependencies=TRUE)
install.packages("ggplot2", dependencies=TRUE)
install.packages("ggnetwork", dependencies=TRUE)
install.packages("ggsci", dependencies=TRUE)
install.packages("gtable", dependencies=TRUE)
install.packages("igraph", dependencies=TRUE)
install.packages("KernSmooth", dependencies=TRUE)
install.packages("lattice", dependencies=TRUE)
install.packages("maptools", dependencies=TRUE)
install.packages("MASS", dependencies=TRUE)
install.packages("Matrix", dependencies=TRUE)
install.packages("mgcv", dependencies=TRUE)
install.packages("munsell", dependencies=TRUE)
install.packages("nlme", dependencies=TRUE)
install.packages("nnet", dependencies=TRUE)
install.packages("permute", dependencies=TRUE)
install.packages("pheatmap", dependencies=TRUE)
install.packages("plyr", dependencies=TRUE)
install.packages("proto", dependencies=TRUE)
install.packages("RColorBrewer", dependencies=TRUE)
install.packages("Rcpp", dependencies=TRUE)
install.packages("reshape2", dependencies=TRUE)
install.packages("rgl", dependencies=TRUE)
install.packages("rpart", dependencies=TRUE)
install.packages("scales", dependencies=TRUE)
install.packages("scatterplot3d", dependencies=TRUE)
install.packages("slam", dependencies=TRUE)
install.packages("som", dependencies=TRUE)
install.packages("sp", dependencies=TRUE)
install.packages("spatial", dependencies=TRUE)
install.packages("stringr", dependencies=TRUE)
install.packages("survival", dependencies=TRUE)
install.packages("vegan", dependencies=TRUE) 
install.packages("wordcloud", dependencies=TRUE)
```

と簡単に書くが、実はいっこいっこやるといろいろ足りなくてエラーになった。たぶん必要なものを書いておく。

```
gtable が次を要求する
$sudo apt install libcurl4-gnutls-dev
$sudo apt install libcurl4-openssl-dev libssl-dev
maptools が次を要求する
$sudo apt install libgeos-dev
rgl が次を要求する
$sudo apt-get install libfontconfig1-dev
$sudo apt install libv8-dev
$sudo apt install libmagick++-dev
$sudo apt install libharfbuzz-dev libfribidi-dev
```

あと R 起動のたびに LANG のワーニングが出るので気持ち悪いから ja_JP.UTF-8 を使えるようにした。LANG もデフォルトでja_JP.UTF-8になった。

```
$ sudo apt install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
```


# mecab
最初 chasen をいれていたのだが、うまく KH Coder が動かなかった。(chasen は動く)。その過程で darts もコンパイルして入れている。後でよく見たら apt get で darts は入れることができる。そして、darts が mecab に必要なのかどうかはわからない。

```
$ sudo apt install mecab
$ sudo apt install mecab-ipadic-utf8
```

/etc/mecabrc は結局次のように辞書の指定と Chasen 互換の指定が必要になった。dicdir は最初に妙な辞書を入れてしまったため変更の必要があったみたい。順序良く入れれば、変更の必要はなさそう。

```
dicdir = /var/lib/mecab/dic/ipadic-utf8
```

```

; ChaSen
node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen  = %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen  = EOS\n
```

# Perl のモジュール
二回に分けてモジュールをインストール

```
$sudo perl -MCPAN -e shell

cpan> install Bundle::CPAN 
```
ここで一旦プロンプトを抜ける

```
$sudo perl -MCPAN -e shell

cpan >
install Jcode
install Tk
install DBI
install DBD::CSV
途中でテストについて聞かれるので y で続行する 

install File::BOM
install Lingua::JA::Regular::Unicode
install Net::Telnet
install Excel::Writer::XLSX
install DBD::mysql
install Spreadsheet::ParseExcel::FmtJapan
install Spreadsheet::ParseXLSX
install Statistics::ChisqIndep
install Statistics::Lite
install Unicode::Escape
install Algorithm::NaiveBayes
install Lingua::Sentence
install Proc::Background
```

ここでは mysql のモジュールをインストールしている。先に mysql のインストールが必要かも。あと、なんかインストールしたつもりなのにインストールされてなかったりしてここもインストールが怪しい

# mysql 5.6
実はその前に mysql の 8.0 をいれてしまった。これでは KH Coder は動かない。5.6 をインストールするには本当は make するべきなのでしょう。16.04 用のレポジトリを使うと 5.6 がインストールできるようなのでそれに頼ってしまった、、、あまり、いい環境構築の方法ではない。

```
$echo 'deb http://cz.archive.ubuntu.com/ubuntu xenial main' >> /etc/apt/sources.list
$apt-get update
$sudo apt-get install mysql-server-5.6
```

上の mysql 5.6 のインストール過程でパスワードを聞かれるので適当に決める。8.0 では聞かれなかったので、セキュリティ関係で変わったんでしょうね。

あと mysql 5.6 のサーバを立ち上げる必要がある。これは 8.0 を先に入れた関係で環境がぐちゃぐちゃになってしまった。普通に入れればいいだけのような気がする。

# KH Coder のダウンロードと設定、実行
KH Coder は github から clone できる。

```
$ git clone https://github.com/ko-ichi-h/khcoder
```

実行は khcoder の下で perl を実行すればよいが、実はその前に config/coder.ini をちゃんと書かないとうまく動かない。

config/coder.ini は最初存在しない（なぜ？）。一度、実行するとできるみたい。

```
mecab_unicode   UTF-8
mecabrc_path    /etc/mecabrc
sql_username    root
sql_password    mysql の root のパスワード
```

私の環境ではまず、azure に ssh で入って、手元の Linux の X Window にフォワードした。

```
$ ssh -X nn.nn.nn.nn

$ cd khcoder
$ perl ./kh_coder.pl
```

ネットワーク越しなので劇遅。うまくいけばチュートリアルの夏目漱石のこころの解析ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99921/7b052c63-a1d4-2882-0da3-5b7712c6cef3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99921/23ec4ffe-5299-ffc7-dade-7606c7ab471e.png)


# 試行錯誤したところ
簡単に書いてあるけど、２日かかってますから。

## chasen
結局使わなかった。というか使えなかった。どうして使えなかったかは謎。utf-8 で起動するには chasen -iw としなくてはいけないみたいで、その辺は KH Coder は考慮されていなかった。そこを一個 shell プログラムをかますことで回避したつもりだったのだが、、、
mecab で動くので chasen はいらない

## mecab の辞書
最初 mecab の辞書をどっかのサイトが書いてある手順で作ってしまった。この辞書はなんんとなく優秀そうなのだが、KH Coder が想定している Chasen 互換の情報を出すようにならない。mecab-ipadic-NEologd かな？python3 からつかうのにはいいのかも。-Ochasen でうまくいかない場合は辞書を疑うとよさそう。

ここの情報が役に立った。ありがとう。
https://kshi-kshi.hatenadiary.org/entry/20110102/1293920002

## MySQL
最初 8.0 をインストールしてしまった。その後 5.6 をインストールするが、環境がよごれてしまったらしく、うまく立ち上がらない。いろいろ消して、うまくたちあがるようになった。

# stanford postagger 
英語の品詞なので必要ない。ダウンロードして coder.ini に指定すると英語の解析に使えるらしい。