Created
June 3, 2020 12:44
-
-
Save kzinmr/e399121e78b1248f9729af770b1aa564 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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