#やったこと
MeCabとPythonで日本語の発音をカナで取得する関数を作りました。
例えば、「今日はよく寝ました」と入力したら「キョーワヨクネマシタ」と返すようなものです。
#環境
- macOS Catalina 10.15.4
- python3.8.0
下記を参考にMeCab、mecab-ipadic-neologd、mecab-python3をインストールしました。
https://qiita.com/taroc/items/b9afd914432da08dafc8
下記を参考にpythonからimportするMeCabのデフォルト辞書をmecab-ipadic-neologdにしておきました。
https://qiita.com/shimajiroxyz/items/3b475da3b6cd850d2c22
辞書はneologdでなくても構いません。
またひらがなをカタカナに変換する'jaconv'をインストールしておきます。
pip install jaconv
#方針
MeCabの出力結果はデフォルトでは下記のようになっています。
表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
このため、入力日本語をMeCabで形態素解析して、「発音」の部分を取得すればよいです。
ただし発音が取得できない未知語はどうしようもないので、「表層形」を可能な範囲でカタカナに変換したもので、代用することとします。
なお、今回の実装では発音を取得するため「今日は」は「キョーワ」と変換されます。もし「キョウハ」のようにルビを取得したい場合は「読み」の部分を取得するようにしてください。
#コード
import MeCab
import jaconv
#記号を削除する関数
#(以下
#http://prpr.hatenablog.jp/entry/2016/11/23/Python%E3%81%A7%E5%85%A8%E8%A7%92%E3%83%BB%E5%8D%8A%E8%A7%92%E8%A8%98%E5%8F%B7%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E6%B6%88%E3%81%97%E5%8E%BB%E3%82%8B
#よりそのまま引用)
import unicodedata
import string
def format_text(text):
text = unicodedata.normalize("NFKC", text) # 全角記号をざっくり半角へ置換(でも不完全)
# 記号を消し去るための魔法のテーブル作成
table = str.maketrans("", "", string.punctuation + "「」、。・")
text = text.translate(table)
return text
#(引用ここまで)
m = MeCab.Tagger() #形態素解析用objectの宣言
def getPronunciation(text):
m_result = m.parse(text).splitlines() #mecabの解析結果の取得
m_result = m_result[:-1] #最後の1行は不要な行なので除く
pro = '' #発音文字列全体を格納する変数
for v in m_result:
if '\t' not in v: continue
surface = v.split('\t')[0] #表層形
p = v.split('\t')[1].split(',')[-1] #発音を取得したいとき
#p = v.split('\t')[1].split(',')[-2] #ルビを取得したいとき
#発音が取得できていないときsurfaceで代用
if p == '*': p = surface
pro += p
pro = jaconv.hira2kata(pro) #ひらがなをカタカナに変換
pro = format_text(pro) #余計な記号を削除
return pro
#出力確認
text = '今日はよく寝ました'
print(text)
print(getPronunciation(text))
出力は下記です。
今日はよく寝ました
キョーワヨクネマシタ
#参考
(https://qiita.com/shimajiroxyz/items/3b475da3b6cd850d2c22)
意味悲鳴: Pythonで全角・半角記号をまとめて消し去る