파이썬용 일한 번역 프로그램

lifthrasiir의 이미지

...물론 이 프로그램이 직접 번역하는 건 아니고, 천리안 트랜스위즈를 사용해서 번역을 해 줍니다. -_-; 원래는 HTML 파일을 번역하는 데 써 먹으려고 했던 거라서 거기에 대한 대비가 되어 있습니다. 코드는... 무지 지저분합니다 -_-

code snippet에도 올라 와 있습니다.

"""jktrans.py -- Meta Japanese-Korean translator using Chollian Transwiz
Kang Seonghoon (Tokigun) @ TokigunStudio 2005
Distributable under the GNU LGPL.
"""

import urllib, urllib2, time, re, sys

def translate(s, buf=32768):
    """Translate unicode string s, with buf-byte buffer. Returns UTF-8 string."""
    avoidlist = ('image/', 'images/')
    regexp = re.compile('(?:x-)?(?:shift[-_]?jis|sjis)|euc[-_]?jp|iso-2022-jp|euc[-_]?kr|ks[-_]?c?[-_]?5601(?:.1989)?', re.I)
    def _translate(s):
        _s = s
        s = re.sub(regexp, 'utf-8', s.encode('utf-8'))
        t = str(time.time())
        for x in avoidlist:
            s = s.replace(x, t+x.encode('base64')+t)
        req = urllib2.Request(
            'http://transwiz.chol.com/files1003/exec/experience_text.asp',
            urllib.urlencode(
                {'guid': '{3155F703-DB3B-447a-B5ED-130DC640E263}',
                 'trans_mode1': 'j', 'trans_mode2': 'k', 'trans_message': s}),
            {'Referer': 'http://transwiz.chol.com/files1003/exec/main.asp'})
        try: r = urllib2.urlopen(req).read()
        except urllib2.HTTPError: return _s.encode('utf-8')
        p1 = r.find('>', r.find('<TEXTAREA')) + 1
        p2 = r.find('</TEXTAREA></TEXTAREA></td>', p1)
        s = r[p1:p2]
        for x in avoidlist:
            s = s.replace(t+x.encode('base64')+t, x)
        return s
    
    t = u''; r = ''
    for ss in s.splitlines():
        t += ss + u'\n'
        if len(t) > buf:
            r += _translate(t)
            t = ''
    r += _translate(t)
    return r

def detect_encoding(s):
    """Returns the encoding of given Japanese string."""
    sa = s.decode('shift-jis', 'replace').count(u'\ufffd')
    sb = s.decode('iso-2022-jp', 'replace').count(u'\ufffd')
    sc = s.decode('utf-8', 'replace').count(u'\ufffd')
    if sb > sa < sc: return 'shift-jis'
    elif sc > sb < sa: return 'iso-2022-jp'
    else: return 'utf-8'

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print 'Usage: python %s <infile> <outfile>' % sys.argv[0]
    else:
        contents = file(sys.argv[1], 'rb').read()
        contents = contents.decode(detect_encoding(contents), 'ignore')
        file(sys.argv[2], 'wb').write(translate(contents))

- 토끼군

덤: 이 글을 올린 이후에도 이 프로그램이 정상 작동한다는 보장은 물론 없습니다.

Forums: 
lifthrasiir의 이미지

이 코드에서 찾을 수 있는 흥미로운 것은 사실 translate 함수가 아니라 detect_encoding 함수입니다. 이 함수가 작동하는 방법은 요렇습니다.

  1. 가능한 인코딩으로 각각 변환해 본다.
  2. 그 결과를 비교해서 에러가 가장 적게 난 것을 찾는다. (에러가 안 나면 당연히 가장 적게 나오겠죠)
  3. 그 인코딩을 골라서 진짜로 해석해 본다.
1번 과정에서 사용되는 것은 str.decode 메소드입니다. 이 메소드는 첫째 인자로 인코딩 이름을 바꿔서 유니코드 문자열을 반환하는데, 둘째 인자에 문자열을 집어 넣을 수도 있습니다. (파이썬 레퍼런스에는 물론 써 있지요) 이 경우 둘째 인자는, decode 과정에서 오류가 날 때 해당 문자를 어떻게 처리할 지를 결정합니다. 여기서는 'replace'를 썼는데, 이 경우 오류가 난 문자는 U+FFFD로 치환됩니다. (이 문자는 유니코드에서 표시 불가능한 문자를 나타낼 때 씁니다) 이것의 갯수를 세면 오류가 난 갯수를 알 수 있겠죠.

2번 과정이야 비교를 통해서 간단하게 알 수 있고, 3번 과정에서는 U+FFFD로 진짜 치환하면 번역할 때 난리가 날 테니까 -_- 무시하고 넘어 가도록 'ignore'를 넣어 줬습니다.

- 토끼군

[/]
doodoo의 이미지

제가 영 허접하다 보니

if __name__ == '__main__':

이 구문에서 __name__ 과 같은 변수는
일부러 만들어서 사용하는 가요?

자룡의 이미지

오래전에 잠깐 봤던거라 가물거립니다만..
__main__ 은 파이썬의 예약어라고 해야할까요?

jktrans.py 가 단독으로 실행된다면
if __name__ == '__main__': 이 참이 되어
그 내부가 C 의 main() 함수처럼 진입점이 됩니다.

만일 jktrans.py 이 다른 모듈에서 import 되어 사용된다면
위 조건절이 부정이 되어
내부가 실행이 안되구요.

음 더욱 자세한 내용은 밑에 답글 달아주실 분에게;;;

-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;

lifthrasiir의 이미지

자룡 wrote:
음 더욱 자세한 내용은 밑에 답글 달아주실 분에게;;;

흐흐흐... __name__은 import blahblah 처럼 import될 때는 그 모듈의 이름(이 경우 "blahblah")을, 그냥 실행할 때는 "__main__"을 가리킵니다. 그래서 그냥 실행할 때와 import될 때를 구별할 수 있는 거죠.

- 토끼군

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.