2017-11-14 18 views
0

나는 가타카나와 히라가나 사이의 변환 두 가지 기능을 가지고 있고 그들은 같은 모양 :히라가나와 카타카나로 변환하는 두 가지 유사한 기능을 결합하는 방법은 무엇입니까?

katakana_minus_hiragana = 0x30a1 - 0x3041 # KATAKANA LETTER A - HIRAGANA A 

def is_hirgana(char): 
    return 0x3040 < ord(char[0]) and ord(char[0]) < 0x3097 

def is_katakana(char): 
    return 0x30a0 < ord(char[0]) and ord(char[0]) < 0x30f7 

def hiragana_to_katakana(hiragana_text): 
    katakana_text = "" 
    max_len = 0 
    for i, char in enumerate(hiragana_text): 
     if is_hirgana(char): 
      katakana_text += chr(ord(char) + katakana_minus_hiragana) 
      max_len += 1 
     else: 
      break 
    return katakana_text, max_len 

def katakana_to_hiragana(katakana_text): 
    hiragana_text = "" 
    max_len = 0 
    for i, char in enumerate(katakana_text): 
     if is_katakana(char): 
      hiragana_text += chr(ord(char) - katakana_minus_hiragana) 
      max_len += 1 
     else: 
      break 
    return hiragana_text, max_len 

오리 형 함수 또는 슈퍼/메타 기능에 hiragana_to_katakana()katakana_to_hiragana()을 단순화 할 수있는 방법이 있나요?

예. something like

def convert_hk_kh(text, charset_range, offset): 
    charset_start, charset_end = charset_range 
    output_text = "" 
    max_len = 0 
    for i, char in enumerate(text): 
     if charset_start < ord(char[0]) and ord(char[0]) < charset_end: 
      output_text += chr(ord(char) + offset) 
      max_len +=1 
     else: 
      break 
    return output_text, max_len 


def katakana_to_hiragana(katakana_text): 
    return convert_hk_kh(katakana_text, (0x30a0, 0x30f7), -katakana_minus_hiragana) 


def hiragana_to_katakana(hiragana_text): 
    return convert_hk_kh(hiragana_text, (0x3040, 0x3097), katakana_minus_hiragana) 

매우 유사한 두 가지 기능을 단순화하는 다른 파이썬 방법이 있습니까?

편집을 할

str.translate과 같은 일을 할 것으로 보인다 https://github.com/olsgaard/Japanese_nlp_scripts도있다. 그게 더 효율적입니까? 더 파이톤?

+0

당신은'charset_start Sraw

+0

예,'str.translate'가 1보다 효율적이고 파이썬입니다 : 문자의 1 번역. –

답변

1

나는 이런 식으로 뭔가를 할 거라고는 :

KATAKANA_HIRGANA_SHIFT = 0x30a1 - 0x3041 # KATAKANA LETTER A - HIRAGANA A 

def shift_chars_prefix(text, amount, condition): 
    output = '' 

    for last_index, char in enumerate(text): 
     if not condition(char): 
      break 

     output += chr(ord(char) + amount) 

    return output, last_index 

def katakana_to_hiragana(text): 
    return shift_chars_prefix(text, -KATAKANA_HIRGANA_SHIFT, lambda c: '\u30a0' < c < '\u30f7') 

def hiragana_to_katakana(text): 
    return shift_chars_prefix(text, KATAKANA_HIRGANA_SHIFT, lambda c: '\u3040' < c < '\u3097') 

당신이 교체 된 접두사의 길이를 반환하지 않는 경우 또한 정규식을 사용할 수 있습니다 : 여기

import re 

KATAKANA_HIRGANA_SHIFT = 0x30a1 - 0x3041 # KATAKANA LETTER A - HIRAGANA A 

def shift_by(n): 
    def replacer(match): 
     return ''.join(chr(ord(c) + n) for c in match.group(0)) 

    return replacer 

def katakana_to_hiragana(text): 
    return re.sub(r'^[\u30a1-\u30f6]+', shift_by(KATAKANA_HIRGANA_SHIFT), text) 

def hiragana_to_katakana(text): 
    return re.sub(r'^[\u3041-\u3096]+', shift_by(-KATAKANA_HIRGANA_SHIFT), text) 
+0

그리고'shift_by (n)'은 간단한 시저 암호입니까? – alvas

+1

@alvas :'shift_by (n)'은'SRE_Match'를 받아'n '만큼 이동시키는 함수를 만듭니다. 이것은'SRE_Match' 객체만을 받아들이 기 때문에 시저 암호 함수와 같은 범용 목적이 아닙니다. – Blender

1

은 전환 할 함수의 각 종류의 가나는 다른 것. 주어진 함수와 달리 가나가 발생해도 멈추지 않고 단지 을 변경하지 않고 해당 문자를 전달하기 만하면됩니다.

가나 유형 간의 변환은 이처럼 간단하지 않습니다. 예를 들어, 히라가나에서 긴 "e"소리는 ええ 또는 (예, お ねえ 누나, せ ん せ 교사)로 표시되며 카타카나에서는 은 chōonpu (오네, せ ん せ ー)를 사용합니다. 사용하는 범위 바깥에도 가나 문자가 있습니다.

def switch_kana_type(kana_text): 
    """Replace each kind of kana with the other kind. Other characters are 
    passed through unchanged.""" 

    output_text = '' 
    for c in kana_text: 
     if is_hiragana(c): # Note typo fix of "is_hirgana" 
      output_text += chr(ord(c) + katakana_minus_hiragana) 
     elif is_katakana(char): 
      output_text += chr(ord(c) - katakana_minus_hiragana) 
     else: 
      output_text += c; 
    return output_text, len(output_text)