【NLP入門】Pykakasiで文章をひらがなへのバラバラ変換して遊んでみた♪

[先日は、ひらがなを与えれば、音声を発生させるアプリが出来た。](https://qiita.com/MuAuan/items/d2b748aff753592d4048)
そこで次の難関は、文章をひらがな一文字毎に分割することだった。
今回、Pykakasiを使うと、漢字かな交じり文をひらがな一文字ずつ区切ることができたので、記事にしておこうと思う。
もちろん、このPykakasiはもう少し上等なこともできそうなものだということも記載したい。
###インストール
【参考】
[日本語文字をローマ字に変換するpykakasiモジュールのインストールと利用について](https://qiita.com/komorin0521/items/8cd1eb0cdb4a9ede217e)
参考の通り、２系は以下でインストール出来ました。

```
$  pip install git+https://github.com/miurahr/pykakasi
Successfully installed dill-0.3.0 klepto-0.1.7 pox-0.2.6 pykakasi-1.1b1 six-1.12.0
```
３系も同様に

```
$  pip3 install git+https://github.com/miurahr/pykakasi
Successfully installed dill-0.3.0 klepto-0.1.7 pox-0.2.6 pykakasi-1.1b1 six-1.12.0
```
インストール確認２系
ほぼ参考の通り、以下のコードで無事に出力できました。
コメントアウトした命令は、エラーはいて止まりましたが、次の二行で以下の出力がえられました。

```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(conv.do(filename)) # 本日は晴天なり.jpg
print(type(filename.decode('utf-8')))
print(conv.do(filename.decode('utf-8')))
```

```
$ python ex_pykakasi2.py
<type 'unicode'>
honjitsuhaseitennari.jpg
```
３系も無事にインストール確認できました。
ということで、今回は３系で話を進めます。
###pykakasiの仕様について
以下の参考がオリジナルのページです。
【参考】
①[miurahr/pykakasi](https://github.com/miurahr/pykakasi) [pykakasi/COPYING](https://github.com/miurahr/pykakasi/blob/master/COPYING)
②[PYKAKASI documentation](https://pykakasi.readthedocs.io/en/latest/index.html)

参考②より以下のものが使えるみたいです。

|Option	|Description|	Values|	Note|
|:-:|:-:|:-:|:-:|
|K|	Katakana conversion|	a,H,None|	roman, Hiragana or non conversion|
|H	|Hiragana conversion|	a,K,None|	roman, Katakana or non conversion|
|J	|Kanji conversion|	a,H,K,None|	roman or Hiragana, Katakana or noconv|
|a	|Roman conversion|	E,None|	JIS ROMAN or non conversion|
|E	|JIS ROMAN conversion	|a,None|	ascii roman or non conversion|
参考②を見ると、
`v1.1b1`_ (6, Sep, 2019)　Added　Add conversions: kya, kyu, kyo
なので、kya,kyu,kyoは、この６／９／１９にリリースされたばかりなのね。

参考①にはaFでローマ字の振り仮名がつくので、同様にHFでひらがなの振り仮名がつきます。
###コードを試してみる
以下のコードを動かしてみます。
最初のコードはひらがな、かたかな、そして漢字を全てローマ字に変換します。

```py
# coding: utf-8
from pykakasi import kakasi

kakasi_ = kakasi()
kakasi_.setMode('H', 'a') # H(Hiragana) to a(roman)
kakasi_.setMode('K', 'a') # K(Katakana) to a(roman)
kakasi_.setMode('J', 'a') # J(Kanji) to a(roman)

conv = kakasi_.getConverter()
filename = '本日は晴天ナリ'

print(type(filename))
print(filename)
print(conv.do(filename))
```
結果は以下のとおり、ベターとローマ字変換できました。

```
<class 'str'>
本日は晴天ナリ
honjitsuhaseitennari
```
次は、全てひらがなに変換します。

```py
kakasi_.setMode('J', 'H')  # J(Kanji) to H(Hiragana)
kakasi_.setMode('H', 'H') # H(Hiragana) to None(noconversion)
kakasi_.setMode('K', 'H') # K(Katakana) to a(Hiragana)

conv = kakasi_.getConverter()

print(filename)
print(conv.do(filename))
```
いい感じにひらがなになりました。
あとは分離してリストにすればいいのです。

```
本日は晴天ナリ
ほんじつはせいてんなり
```
以下は振り仮名を付けます。

```py
kakasi_.setMode("J","HF") # Japanese to furigana
conv = kakasi_.getConverter()

print(filename)
print(conv.do(filename))
```
以下のように振り仮名もつきました。

```
本日は晴天ナリ
本日[ほんじつ]は晴天[せいてん]なり
```
###wakatiとバラバラ分離をやってみる
wakatiは仕様にあるので、そのまま実施します。
一方、バラバラ分離は参考のような手法があるようです。
【参考】
[python、rubyで文字列を1文字ずつのリストにする](http://y0m0r.hateblo.jp/entry/20130601/1370077334)
コードは以下のとおりです。

```py
# coding: utf-8
from pykakasi import kakasi

kakasi_ = kakasi()

kakasi_.setMode('H', 'a') # H(Hiragana) to a(roman)
kakasi_.setMode('K', 'a') # K(Katakana) to a(roman)
kakasi_.setMode('J', 'a') # J(Kanji) to a(roman)
kakasi_.setMode("s", True) #wakati

conv = kakasi_.getConverter()

filename = '本日は晴天ナリ'

print(type(filename))
print(filename)
print(conv.do(filename))
char_list = list(conv.do(filename))
print(char_list)

kakasi_.setMode('J', 'H')  # J(Kanji) to H(Hiragana)
kakasi_.setMode('H', 'H') # H(Hiragana) to None(noconversion)
kakasi_.setMode('K', 'H') # K(Katakana) to a(Hiragana)

conv = kakasi_.getConverter()

print(filename)
print(conv.do(filename))
char_list = list(conv.do(filename))
print(char_list)
```
ローマ字変換も分かち書きもバラバラ変換も両方できました。

```
<class 'str'>
本日は晴天ナリ
honjitsu ha seiten nari
['h', 'o', 'n', 'j', 'i', 't', 's', 'u', ' ', 'h', 'a', ' ', 's', 'e', 'i', 't', 'e', 'n', ' ', 'n', 'a', 'r', 'i']
```
ひらがな変換では分かち書きもバラバラ変換も両方まんま出来ました。
これが出来たので当初の目標達成です。
これで以前のアプリを使うと、音声変換までできます。
ただし、分かち書きするとスペースが入るので、入れないほうがいい場合もあると思います。

```
本日は晴天ナリ
ほんじつ は せいてん なり
['ほ', 'ん', 'じ', 'つ', ' ', 'は', ' ', 'せ', 'い', 'て', 'ん', ' ', 'な', 'り']
```
最後は振り仮名付きの変換ですが、これも想像通りの結果になりました。

```
本日は晴天ナリ
本日[ほんじつ] は 晴天[せいてん] なり
['本', '日', '[', 'ほ', 'ん', 'じ', 'つ', ']', ' ', 'は', ' ', '晴', '天', '[', 'せ', 'い', 'て', 'ん', ']', ' ', 'な', 'り']
```
分かち書きをやめると以下のように、スペースの無いバラバラ変換ができました。
なんか美しさを感じます♪

```
<class 'str'>
本日は晴天ナリ
honjitsuhaseitennari
['h', 'o', 'n', 'j', 'i', 't', 's', 'u', 'h', 'a', 's', 'e', 'i', 't', 'e', 'n', 'n', 'a', 'r', 'i']
本日は晴天ナリ
ほんじつはせいてんなり
['ほ', 'ん', 'じ', 'つ', 'は', 'せ', 'い', 'て', 'ん', 'な', 'り']
```
最後にローマ字変換をひらがな変換の後で実施すると以下が得られます。

```py
kakasi_.setMode('J', 'H')  # J(Kanji) to H(Hiragana)
kakasi_.setMode('H', 'H') # H(Hiragana) to None(noconversion)
kakasi_.setMode('K', 'H') # K(Katakana) to a(Hiragana)
kakasi_.setMode('a', 'H') # K(Katakana) to a(Hiragana)

conv = kakasi_.getConverter()

print(filename)
print(conv.do(filename))
char_list = list(conv.do(filename))
print(char_list)
kakasi_.setMode('H', 'a') # H(Hiragana) to a(roman)
conv = kakasi_.getConverter()
print(conv.do(char_list))
```
なんかこれも美しい！

```
本日は晴天ナリ
ほんじつはせいてんなり
['ほ', 'ん', 'じ', 'つ', 'は', 'せ', 'い', 'て', 'ん', 'な', 'り']
['ho', 'n', 'ji', 'tsu', 'ha', 'se', 'i', 'te', 'n', 'na', 'ri']
```
###まとめ
・Pykakasiを使って遊んでみた
・漢字かな交じり文をひらがなリストへのバラバラ変換ができた

・出力側はできたので入力側どうにかしよう。。。