6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

$  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

3系も同様に

$  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

インストール確認2系
ほぼ参考の通り、以下のコードで無事に出力できました。
コメントアウトした命令は、エラーはいて止まりましたが、次の二行で以下の出力がえられました。

# 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

3系も無事にインストール確認できました。
ということで、今回は3系で話を進めます。
###pykakasiの仕様について
以下の参考がオリジナルのページです。
【参考】
miurahr/pykakasi pykakasi/COPYING
PYKAKASI documentation

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

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は、この6/9/19にリリースされたばかりなのね。

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

# 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

次は、全てひらがなに変換します。

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))

いい感じにひらがなになりました。
あとは分離してリストにすればいいのです。

本日は晴天ナリ
ほんじつはせいてんなり

以下は振り仮名を付けます。

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

print(filename)
print(conv.do(filename))

以下のように振り仮名もつきました。

本日は晴天ナリ
本日[ほんじつ]は晴天[せいてん]なり

###wakatiとバラバラ分離をやってみる
wakatiは仕様にあるので、そのまま実施します。
一方、バラバラ分離は参考のような手法があるようです。
【参考】
python、rubyで文字列を1文字ずつのリストにする
コードは以下のとおりです。

# 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']
本日は晴天ナリ
ほんじつはせいてんなり
['ほ', 'ん', 'じ', 'つ', 'は', 'せ', 'い', 'て', 'ん', 'な', 'り']

最後にローマ字変換をひらがな変換の後で実施すると以下が得られます。

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を使って遊んでみた
・漢字かな交じり文をひらがなリストへのバラバラ変換ができた

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

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?