Skip to content

Instantly share code, notes, and snippets.

@kzinmr
Created June 3, 2020 12:44
Show Gist options
  • Save kzinmr/e399121e78b1248f9729af770b1aa564 to your computer and use it in GitHub Desktop.
Save kzinmr/e399121e78b1248f9729af770b1aa564 to your computer and use it in GitHub Desktop.
import regex
class YomiConverter:
KANA2ROM = {
"ア": "a",
"イ": "i",
"ウ": "u",
"エ": "e",
"オ": "o",
"カ": "ka",
"キ": "ki",
"ク": "ku",
"ケ": "ke",
"コ": "ko",
"サ": "sa",
"シ": "si",
"ス": "su",
"セ": "se",
"ソ": "so",
"タ": "ta",
"チ": "ti",
"ツ": "tu",
"テ": "te",
"ト": "to",
"ナ": "na",
"ニ": "ni",
"ヌ": "nu",
"ネ": "ne",
"ノ": "no",
"ハ": "ha",
"ヒ": "hi",
"フ": "hu",
"ヘ": "he",
"ホ": "ho",
"マ": "ma",
"ミ": "mi",
"ム": "mu",
"メ": "me",
"モ": "mo",
"ヤ": "ya",
"ユ": "yu",
"ヨ": "yo",
"ラ": "ra",
"リ": "ri",
"ル": "ru",
"レ": "re",
"ロ": "ro",
"ワ": "wa",
"ヰ": "wi",
"ヱ": "we",
"ヲ": "wo",
"ガ": "ga",
"ギ": "gi",
"グ": "gu",
"ゲ": "ge",
"ゴ": "go",
"ザ": "za",
"ジ": "zi",
"ズ": "zu",
"ゼ": "ze",
"ゾ": "zo",
"ダ": "da",
"ヂ": "di",
"ヅ": "du",
"デ": "de",
"ド": "do",
"バ": "ba",
"ビ": "bi",
"ブ": "bu",
"ベ": "be",
"ボ": "bo",
"パ": "pa",
"ピ": "pi",
"プ": "pu",
"ペ": "pe",
"ポ": "po",
"ヴ": "vu",
"ァ": "xa",
"ィ": "xi",
"ゥ": "xu",
"ェ": "xe",
"ォ": "xo",
"ッ": "xtu",
"ャ": "xya",
"ュ": "xyu",
"ョ": "xyo",
"ヮ": "xwa",
"ヶ": "xke",
"ヵ": "xka",
"ン": "nn",
}
ROM2KANA = {v: k for k, v in KANA2ROM.items()}
def __init__(self):
pass
def kana_to_romaji(self, katakana_string):
""" カタカナをローマ字読み(IMEでの'単体文字'入力となる形)に変換
Args:
katakana_string: カタカナの結合文字列
Returns:
ローマ字読みごとにスペースで区切られた文字列
"""
def _ctoromaji(c):
c = c.group(0)
if c in self.KANA2ROM:
return self.KANA2ROM[c] + " "
else:
return c
return regex.sub(r"\p{Katakana}", _ctoromaji, katakana_string).rstrip()
def romaji_to_kana(self, romaji_yomi):
""" ローマ字読みをカタカナに変換
Args:
romaji_yomi: ローマ字読みのリストorスペース区切られた文字列
Returns:
カタカナの文字列
"""
def _ctokana(c):
if c in self.ROM2KANA:
return self.ROM2KANA[c]
else:
return c
if isinstance(romaji_yomi, str):
romaji_yomi = romaji_yomi.split(" ")
return "".join(map(_ctokana, romaji_yomi))
@staticmethod
def remove_soundmark(romaji_yomi):
""" 濁点・半濁点を削除
Args:
romaji_yomi: ローマ字の文字列
Returns:
濁点子音が静音子音に置換されたローマ字文字列('ヴ' は例外)
"""
return romaji_yomi.translate(romaji_yomi.maketrans("gzdbp", "ksthh"))
def remove_soundmark_from_kana(self, katakana_string):
""" 濁点除去処理: カタカナ->ローマ字->濁点除去済みカタカナ
Args:
katakana_string: カタカナ文字列
"""
roms = self.kana_to_romaji(katakana_string)
roms_seion = self.remove_soundmark(roms)
kana_seion = self.romaji_to_kana(roms_seion.split(" "))
return kana_seion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment