【RasPi4入門】環境構築；自然言語処理系mecabなどなど。。。♪

会話アプリを動かすために、自然言語処理系のLibをインストールします。
~~-nanoとほぼ同様ですが~~**それなりに苦労したので**、丁寧に記載したいと思います。
ほぼ参考のとおりですが、一部ディレクトリが異なるので、対応します。
【参考】
・[ubuntu 18.10 に mecab をインストール](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)
###mecabのインストール
####mecabのインストール
```
$ sudo apt install mecab
$ sudo apt install libmecab-dev
$ sudo apt install mecab-ipadic-utf8
```
ここまではまんま出来ました。

```
$ mecab
特急はくたか
特急    名詞,一般,*,*,*,*,特急,トッキュウ,トッキュー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
く      動詞,自立,*,*,カ変・クル,体言接続特殊２,くる,ク,ク
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
か      助詞,副助詞／並立助詞／終助詞,*,*,*,*,か,カ,カ
EOS
```
上記の出力が得られます。
####neologd をインストール

```
$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ sudo bin/install-mecab-ipadic-neologd
```
ここまで問題なくインストールできます。
辞書のダウンロードに時間(約30分)がかかりました。
####/etc/mecabrc を編集する
ここで問題発生。ubuntuでは、辞書は以下のディレクトリにインストールされますが、Raspbianでは異なるようです。

```
dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
```
ということで、ファイルの存在するディレクトリを検索します。
【参考】
[ファイルを探す[findとlocate]](https://qiita.com/ottyajp/items/1ac218164f1daf643262)

```
$ sudo find / -name '*mecab-ipadic-neologd*'
/usr/lib/arm-linux-gnueabihf/mecab/dic/mecab-ipadic-neologd
```
これで以下のコマンドで書き換えできました。
ちなみに、viのコマンドは参考見てください。
【参考】
[viの基本操作](http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html)

```
$ sudo vi /etc/mecabrc
```
ということで、以下のように書き換えました.

```
$ cat /etc/mecabrc
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
;dicdir = /var/lib/mecab/dic/debian
dicdir =/usr/lib/arm-linux-gnueabihf/mecab/dic/mecab-ipadic-neologd 
; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
```
そして、辞書が変わったことを確認します。
ちゃんと「はくたか」として、まとまった形で分離できました。

```
$ mecab
特急はくたか
特急	名詞,一般,*,*,*,*,特急,トッキュウ,トッキュー
はくたか	名詞,固有名詞,一般,*,*,*,はくたか,ハクタカ,ハクタカ
EOS
```
####python3 で使えるようにする
```
sudo apt install swig
sudo apt install python3-pip
sudo pip3 install mecab-python3
```
これで以下のように参考にあるサンプルが動きます。

```
$ python3 mecab_sample.py
名詞,固有名詞,一般,*,*,*,はくたか,ハクタカ,ハクタカ
はくたか
名詞,固有名詞,地域,一般,*,*,富山,トヤマ,トヤマ
富山
名詞,固有名詞,地域,一般,*,*,金沢,カナザワ,カナザワ
金沢
名詞,固有名詞,地域,一般,*,*,兼六園,ケンロクエン,ケンロクエン
兼六園
```
###pyaudioのインストール
会話アプリは一応、音声会話出力をしているので、pyaudioを利用しています。
【参考】
[PyAudioのインストール| Python備忘録](https://engineer-fumi.hatenablog.com/entry/2018/03/28/214700)

```
$ sudo apt-get install python3-pyaudio
```
無事にインストールできました。
###Pykakasiをインストール
これは録音音声発生（ファイル名がアルファベット）や発生音声のTextへの変換に使います。

```
$ pip3 install pykakasi --user
```
以下のコードで確認します

```py
# coding: utf-8
from pykakasi import kakasi
kakasi = kakasi()
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
conv = kakasi.getConverter()
filename = '本日は晴天なり.jpg'
print(filename) # 本日は晴天なり.jpg
print(type(filename))
print(conv.do(filename))
```

```出力例.
$ python3 pykakasi_ex.py
本日は晴天なり.jpg
<class 'str'>
honjitsuhaseitennari.jpg
```

####環境

```
$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```
###会話アプリの実行
[gensm_ex1.py](https://github.com/MuAuan/RaspberryPi4_conversation/blob/master/gensm_ex1.py)

```
$ python3 gensm_ex1.py

訓練開始
Epoch: 1
gensm_ex1.py:16: DeprecationWarning: Call to deprecated `iter` (Attribute will be removed in 4.0.0, use self.epochs instead).
  model.train(sentences, epochs=model.iter, total_examples=model.corpus_count)
Epoch: 2
Epoch: 3
Epoch: 4
Epoch: 5
Epoch: 6
Epoch: 7
Epoch: 8
Epoch: 9
Epoch: 10
Epoch: 11
Epoch: 12
Epoch: 13
Epoch: 14
Epoch: 15
Epoch: 16
Epoch: 17
Epoch: 18
Epoch: 19
Epoch: 20
SENT_0
[('SENT_2', 0.08270145207643509), ('SENT_3', 0.0347767099738121), ('SENT_1', -0.08307887613773346)]
SENT_3
[('SENT_0', 0.0347767099738121), ('SENT_1', 0.02076556906104088), ('SENT_2', -0.003991239238530397)]
SENT_1
[('SENT_3', 0.02076556347310543), ('SENT_2', 0.010350690223276615), ('SENT_0', -0.08307889103889465)]
gensm_ex1.py:33: DeprecationWarning: Call to deprecated `similar_by_word` (Method will be removed in 4.0.0, use self.wv.similar_by_word() instead).
  print (model.similar_by_word(u"魚"))
[('今', 0.15166150033473969), ('海', 0.09887286275625229), ('明日', 0.03284810855984688), ('猫', 0.019402338191866875), ('吠えた', -0.0008345211390405893), ('泳ぐ', -0.02624458074569702), ('今日', -0.05557712912559509), ('犬', -0.0900348424911499)]
```
[RaspberryPi4_conversation/model_skl.py /](https://github.com/MuAuan/RaspberryPi4_conversation/blob/master/model_skl.py)

```
$ python3 model_skl.py
TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
                dtype=<class 'numpy.float64'>, encoding='utf-8',
                input='content', lowercase=True, max_df=1.0, max_features=None,
                min_df=1, ngram_range=(1, 1), norm='l2', preprocessor=None,
                smooth_idf=True, stop_words=None, strip_accents=None,
                sublinear_tf=False, token_pattern='(?u)\\b\\w\\w+\\b',
                tokenizer=None, use_idf=True, vocabulary=None)
{'私は': 5, '醤油': 6, 'ラーメン': 2, 'とんこつ': 1, '好き': 4, 'です': 0, '味噌': 3}
{'醤油': 4, 'ラーメン': 1, 'とんこつ': 0, '好き': 3, '味噌': 2}
醤油 4
ラーメン 1
とんこつ 0
好き 3
味噌 2
['とんこつ', 'ラーメン', '味噌', '好き', '醤油']
  (0, 4)	0.4976748316029239
  (0, 1)	0.7081994831914716
  (0, 0)	0.3540997415957358
  (0, 3)	0.3540997415957358
  (1, 1)	0.7081994831914716
  (1, 0)	0.3540997415957358
  (1, 3)	0.3540997415957358
  (1, 2)	0.4976748316029239
{'醤油': 6, 'ラーメン': 3, 'とんこつ': 2, '好き': 5, '味噌': 4, 'かつ丼': 1, 'お好み焼き': 0}
  (0, 6)	0.5486117771118656
  (0, 3)	0.6480379064629606
  (0, 2)	0.4172333972107692
  (0, 5)	0.3240189532314803
  (1, 3)	0.6480379064629607
  (1, 2)	0.41723339721076924
  (1, 5)	0.32401895323148033
  (1, 4)	0.5486117771118657
  (2, 3)	0.35959372325985667
  (2, 5)	0.35959372325985667
  (2, 1)	0.6088450986844796
  (2, 0)	0.6088450986844796
[[1.         0.69902512 0.34954555]
 [0.69902512 1.         0.34954555]
 [0.34954555 0.34954555 1.        ]]
```

こうして、無事に会話アプリにたどりつきました.
[RaspberryPi4_conversation/auto_conversation_.py](https://github.com/MuAuan/RaspberryPi4_conversation/blob/master/auto_conversation_.py)

```
$ python3 auto_conversation_.py -i data/conversation_n.txt  -s data/stop_words.txt
data/conversation_n.txt
> 今日は良い天気だね
(0.41): あれ ね 。
> あれってなに
(0.55): ワンちゃん って 何
> ワンちゃんは犬だろ
(0.41): どこ で ワンちゃん に あっ た の
> あそこの路地だよ
(0.46): ＊ ＊ ＊ って 何 よ
> 公園の近く
(0.00): """「 どー し て 私 だけ やら なく ちゃ いけ ない の ？ 少し は 手伝っ て よ 。 」 ,"""
> 何を手伝えばいいの
(0.46): （ そう 、 いい ね ）
> なんとなく津っ つっかっているでしょ
(0.38): 誰 の 話 を し て いる の
> ほ ら
(0.00): あ ワン ちゃーん とか 言っ て なで て 、 ほ い で 、 この 人 たち は こっち 行っ て 、 あたし ら こっち 行っ た じゃん 。
> そんあなの覚えてないよ
(0.35): ばか に なんか し て ない よ
> やはりばかだとおもってるんだ
(0.33): 格好 は しっかり し てる ん だ 。
> 
```

以下、必要なもののインストールです。

【参考】
[How to install scipy and numpy on Ubuntu 16.04?
](https://askubuntu.com/questions/868599/how-to-install-scipy-and-numpy-on-ubuntu-16-04)

```
$ sudo apt update
$ sudo apt upgrade
```

```
$ sudo apt install python3-numpy python3-scipy
```

```
$ sudo pip3 install numpy scipy
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (1.16.2)
Requirement already satisfied: scipy in /usr/lib/python3/dist-packages (1.1.0)
```

```
$ pip3 install --user gensim

Successfully installed boto-2.49.0 boto3-1.11.14 botocore-1.14.14 gensim-3.8.1 jmespath-0.9.4 s3transfer-0.3.3 smart-open-1.9.0
```
【参考】
[scikit-learnのインストール in Ubuntu](https://www.iandprogram.net/entry/2015/09/15/221518)

```
$ sudo pip3 install scikit-learn
...
Requirement already satisfied: scipy>=0.17.0 in /usr/lib/python3/dist-packages (from scikit-learn) (1.1.0)
Requirement already satisfied: numpy>=1.11.0 in /usr/lib/python3/dist-packages (from scikit-learn) (1.16.2)
Installing collected packages: joblib, scikit-learn
Successfully installed joblib-0.14.1 scikit-learn-0.22.1
```
###まとめ
・RasPi4に自然言語系中心に必要なLibをインストールした
・一応、自然言語系のアプリが動かせた

・もう少し、会話アプリをまともにしたいと思う
###おまけ
これでだいたい入った。
【参考】
・[pipのlistとfreezeの違い](http://kuteken.hatenablog.com/entry/2015/03/21/211936)

```
$ pip3 freeze > requirements.txt
```
・[RaspberryPi4_conversation/requirements.txt](https://github.com/MuAuan/RaspberryPi4_conversation/blob/master/requirements.txt)

```
$ pip3 freeze
absl-py==0.9.0
arrow==0.15.5
asn1crypto==0.24.0
astor==0.8.1
astroid==2.1.0
asttokens==1.1.13
attrs==19.3.0
automationhat==0.2.0
backcall==0.1.0
beautifulsoup4==4.7.1
bleach==3.1.0
blinker==1.4
blinkt==0.1.2
boto==2.49.0
boto3==1.11.14
botocore==1.14.14
buttonshim==0.0.2
Cap1xxx==0.1.3
certifi==2018.8.24
chardet==3.0.4
Click==7.0
colorama==0.3.7
colorzero==1.1
cookies==2.2.1
cryptography==2.6.1
cycler==0.10.0
Cython==0.29.14
decorator==4.4.1
defusedxml==0.6.0
dill==0.3.1.1
docutils==0.14
drumhat==0.1.0
entrypoints==0.3
envirophat==1.0.0
ExplorerHAT==0.4.2
Flask==1.0.2
fourletterphat==0.1.0
gast==0.3.3
gensim==3.8.1
google-pasta==0.1.8
gpiozero==1.5.1
grpcio==1.27.1
h5py==2.10.0
html5lib==1.0.1
idna==2.6
importlib-metadata==1.5.0
ipykernel==5.1.4
ipython==7.12.0
ipython-genutils==0.2.0
ipywidgets==7.5.1
isort==4.3.4
itsdangerous==0.24
jedi==0.13.2
jinja2-time==0.2.0
jmespath==0.9.4
joblib==0.14.1
jsonschema==3.2.0
jupyter==1.0.0
jupyter-client==5.3.4
jupyter-console==6.1.0
jupyter-core==4.6.1
Keras==2.3.1
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
keyring==17.1.1
keyrings.alt==3.1.1
kiwisolver==1.1.0
klepto==0.1.8
lazy-object-proxy==1.3.1
logilab-common==1.4.2
lxml==4.3.2
make==0.1.6.post1
Markdown==3.2
MarkupSafe==1.1.0
matplotlib==3.1.3
mccabe==0.6.1
mecab-python3==0.996.3
microdotphat==0.2.1
mistune==0.8.4
mote==0.0.4
motephat==0.0.2
mypy==0.670
mypy-extensions==0.4.1
nbconvert==5.6.1
nbformat==5.0.4
notebook==6.0.3
numpy==1.16.2
oauthlib==2.1.0
olefile==0.46
opencv-python==3.4.6.27
pandocfilters==1.4.2
pantilthat==0.0.7
parso==0.3.1
pexpect==4.8.0
pgzero==1.2
phatbeat==0.1.1
pianohat==0.1.0
picamera==1.13
pickleshare==0.7.5
piglow==1.2.5
pigpio==1.44
pox==0.2.7
prometheus-client==0.7.1
prompt-toolkit==3.0.3
protobuf==3.11.3
psutil==5.5.1
ptyprocess==0.6.0
PyAudio==0.2.11
pygame==1.9.4.post1
Pygments==2.3.1
PyGObject==3.30.4
pyinotify==0.9.6
PyJWT==1.7.0
pykakasi==1.2
pylint==2.2.2
pyOpenSSL==19.0.0
pyparsing==2.4.6
pyrsistent==0.15.7
pyserial==3.4
python-apt==1.8.4.1
python-dateutil==2.8.1
PyYAML==5.3
pyzmq==18.1.1
qtconsole==4.6.0
rainbowhat==0.1.0
requests==2.21.0
requests-oauthlib==1.0.0
responses==0.9.0
roman==2.0.0
RPi.GPIO==0.7.0
RTIMULib==7.2.1
s3transfer==0.3.3
scikit-learn==0.22.1
scipy==1.1.0
scrollphat==0.0.7
scrollphathd==1.2.1
SecretStorage==2.3.1
Send2Trash==1.5.0
sense-hat==2.2.0
simplejson==3.16.0
six==1.12.0
skywriter==0.0.7
smart-open==1.9.0
sn3218==1.2.7
soupsieve==1.8
spidev==3.4
ssh-import-id==5.7
tensorboard==1.13.1
tensorflow-estimator==1.14.0
termcolor==1.1.0
terminado==0.8.3
testpath==0.4.4
thonny==3.2.6
tornado==6.0.3
touchphat==0.0.1
traitlets==4.3.3
twython==3.7.0
unicornhathd==0.0.4
wcwidth==0.1.8
webencodings==0.5.1
widgetsnbextension==3.5.1
wrapt==1.11.2
zipp==2.2.0
```