okirako
@okirako (inoue yoshiharu)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pykakasi で glob.glob() であつめたひらがなのファイルリストを突っ込むと濁点がついた文字が化ける

Discussion

Closed

解決したいこと

pykakasiでひらがな→ローマ字に変換されたあと辞書のなかみが直打ちとリストで異なる
直打ちと同じ結果にしたい

元データ "が"
期待結果 "ga"
実際結果 "ka゛" か + 濁点

※ターミナルで確認

import pykakasi
import glob

kks = pykakasi.kakasi()
kks.convert('りざーどん')#そのまま入力
kks.convert('リザードン')
[{'orig': 'リザードン', 'hira': 'りざーどん', 'kana': 'リザードン', 'hepburn': 'rizaadon', 'kunrei': 'rizaadon', 'passport': 'rizaadon'}]

#りざーどん.txt が 同じフォルダにあるとします。

textlist = glob.glob('./*.txt')
list = [] #空のリスト作成
for i in textlist:
j = i.lsplit('./')#余計な文字をけす
k = j.split('.') # . で分割

list[0]
'りざーどん'
kks.convert(list[0])
[{'orig': 'りざーどん', 'hira': 'りざーどん', 'kana': 'リザードン', 'hepburn': 'risa゙゙to゙n', 'kunrei': 'risa゙゙to゙n', 'passport': 'risa゙゙to゙n'}]

おそらく ひらがな としては同じようにみえるが、文字コード?が異なるので結果が違うのだろうとおもいますが、まだ解決していません。
globでリスト化してしまうと直打ちとは違う?でも解決方法が見つからない ←現状
・文字コードをどこかで変換する?
・他の方法でファイルリストをつくる?

0

見たところですが、濁点が結合文字U+3099になっていると思います。つまり「が(U+304C)」が「か(U+304B) ゛(U+3099)」となっているということです。
これを修正するにはUnicode正規化という作業を行えば良いです。

pythonであればunicodeddataという標準ライブラリが使えるはずです。以下の記事などを参考に、入力テキストをUnicode正規化してからpykakasiにかければうまくいくと思います。

2Like

補足です。

Unicode の正規化には何種類かの方法があって

  • 例えば「ざ」を一文字にする方法が NFC (Normalization Form Canonical Composition)
  • 例えば「さ」+「結合用濁点」の二文字にする方法が NFD (Normalization Form Canonical Decomposition)

この2つが有名どころです。

また、Mac のファイルシステムは NFD の正規化を使っています。
そのため、Mac でファイル名を読み込むと、その文字列は NFD で正規化されています。

おそらく pykakasi は入力文字列として NFC を想定しているのだと思います。

とりあえず試しに

kks.convert(list[0])

の部分を

import unicodedata

nfc = unicodedata.normalize('NFC', list[0])
kks.convert(nfc)

としてみてください( nfc は適当な変数名に変えてもらっても大丈夫ですし、直接 kks.convert(unicodedata.normalize('NFC', list[0])) としてもらってもよいです)

インポートは先に1回だけやっておけば毎回は不要です。

【追記】github の pykakasi を見ると

Overview
(略) It can handle characters in NFC form.

と書いてあるので、やはり pykakasi を利用する際には、NFC にしてから呼び出す必要がありますね。

2Like

@yoshi389111 さま
大変遅くなってしましましたが、教えていただいたUnicode の正規化 をして、期待結果が得られるようになりました。ありがとうございます。
おかげで、子供用なんちゃってポケモンタイピング 仮完成できました。

0Like

Your answer might help someone💌