Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@MuAuan

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

More than 1 year has passed since last update.

先日は、ひらがなを与えれば、音声を発生させるアプリが出来た。
そこで次の難関は、文章をひらがな一文字毎に分割することだった。
今回、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を使って遊んでみた
・漢字かな交じり文をひらがなリストへのバラバラ変換ができた

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

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
MuAuan
2021年為になる記事にする 記事420いいね2000フォロワー200 2020年;いい記事を書く 記事359/350いいね1590/1500フォロワ ー144/150 2019年 記事275/300いいね1035/1000フォロワー97/100 2018年 記事140/200いいね423/500フォロワー48/50 7/8/2018 記事90いいね227フォロワー25

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?