有没有办法以编程方式将韩文 unicode 合并为一个?
Is there a way to programmatically combine Korean unicode into one?
使用韩语输入法编辑器 (IME),可以键入 버리
+ 어
,它会自动变为 버려
。
有没有办法在 Python 中以编程方式执行此操作?
>>> x, y = '버리', '어'
>>> z = '버려'
>>> ord(z[-1])
47140
>>> ord(x[-1]), ord(y)
(47532, 50612)
有没有办法计算 47532 + 50612 -> 47140?
这里还有一些例子:
가보 + 아 -> 가봐
끝나 + ㄹ -> 끝날
您可以使用自己的翻译 table。
缺点是你必须手动输入所有对,或者你有一个文件可以从中获取它。
例如:
# Sample Korean chars to map
k = [[('버리', '어'), ('버려')], [('가보', '아'), ('가봐')], [('끝나', 'ㄹ'), ('끝날')]]
class Korean(object):
def __init__(self):
self.map = {}
for m in k:
key = m[0][0] + m[0][1]
self.map[hash(key)] = m[1]
def __getitem__(self, item):
return self.map[hash(item)]
def translate(self, s):
return [ self.map[hash(token)] for token in s]
if __name__ == '__main__':
k_map = Korean()
k_chars = [ m[0][0] + m[0][1] for m in k]
print('Input: %s' % k_chars)
print('Output: %s' % k_map.translate(k_chars))
one_char_3 = k[0][0][0] + k[0][0][1]
print('%s = %s' % (one_char_3, k_map[ one_char_3 ]) )
Input: ['버리어', '가보아', '끝나ㄹ']
Output: ['버려', '가봐', '끝날']
버리어 = 버려
测试 Python:3.4.2
我是韩国人。首先,如果您键入 버리
+ 어
,它将变为 버리어
而不是 버려
。 버려
是 버리어
的缩写,它不是自动生成的。同样的原因,가보아
不能在输入时自动变成 가봐
。
其次,相比之下,끝나
+ ㄹ
变成了 끝날
因为 나
没有 jongseong(종성)。请注意韩文的一个字符由choseong(초성)、jungseong(중성)和jongseong[=61=组成]. choseong和jongseong是辅音,jungseong是元音。在 Wikipedia 查看更多信息。所以只有当打字时没有jongseong时(比如끝나),才有可能有jongseong(ㄹ).
如果你想把 버리
+ 어
变成 버려
,你应该实现一些韩语语法,特别是对于这种情况,jungseong 的缩写。例如 ㅣ
+ ㅓ
= ㅕ
, ㅗ
+ ㅏ
= ㅘ
如您所提供。 한글 맞춤법 chapter 4. section 5(我现在找不到英文页面)这样定义缩写。这是可能的,但不是那么容易的工作,尤其是对于非韩国人。
下一步,如果你想要的只是将 끝나
+ ㄹ
变成 끝날
,这可能是一个相对容易的工作,因为有库可以处理合成和choseong、jungseong、jongseong的分解。在 Python 的情况下,我找到了 hgtk。你可以这样尝试(非实用代码):
# hgtk methods take one character at a time
cjj1 = hgtk.letter.decompose('나') # ('ㄴ', 'ㅏ', '')
cjj2 = hgtk.letter.decompose('ㄹ') # ('ㄹ', '', '')
if cjj1[2]) == '' and cjj2[1]) == '':
cjj = (cjj1[0], cjj1[1], cjj2[0])
cjj2 = None
不过,如果没有适当的韩文知识,将很难完成。
使用韩语输入法编辑器 (IME),可以键入 버리
+ 어
,它会自动变为 버려
。
有没有办法在 Python 中以编程方式执行此操作?
>>> x, y = '버리', '어'
>>> z = '버려'
>>> ord(z[-1])
47140
>>> ord(x[-1]), ord(y)
(47532, 50612)
有没有办法计算 47532 + 50612 -> 47140?
这里还有一些例子:
가보 + 아 -> 가봐
끝나 + ㄹ -> 끝날
您可以使用自己的翻译 table。
缺点是你必须手动输入所有对,或者你有一个文件可以从中获取它。
例如:
# Sample Korean chars to map
k = [[('버리', '어'), ('버려')], [('가보', '아'), ('가봐')], [('끝나', 'ㄹ'), ('끝날')]]
class Korean(object):
def __init__(self):
self.map = {}
for m in k:
key = m[0][0] + m[0][1]
self.map[hash(key)] = m[1]
def __getitem__(self, item):
return self.map[hash(item)]
def translate(self, s):
return [ self.map[hash(token)] for token in s]
if __name__ == '__main__':
k_map = Korean()
k_chars = [ m[0][0] + m[0][1] for m in k]
print('Input: %s' % k_chars)
print('Output: %s' % k_map.translate(k_chars))
one_char_3 = k[0][0][0] + k[0][0][1]
print('%s = %s' % (one_char_3, k_map[ one_char_3 ]) )
Input: ['버리어', '가보아', '끝나ㄹ']
Output: ['버려', '가봐', '끝날']
버리어 = 버려
测试 Python:3.4.2
我是韩国人。首先,如果您键入 버리
+ 어
,它将变为 버리어
而不是 버려
。 버려
是 버리어
的缩写,它不是自动生成的。同样的原因,가보아
不能在输入时自动变成 가봐
。
其次,相比之下,끝나
+ ㄹ
变成了 끝날
因为 나
没有 jongseong(종성)。请注意韩文的一个字符由choseong(초성)、jungseong(중성)和jongseong[=61=组成]. choseong和jongseong是辅音,jungseong是元音。在 Wikipedia 查看更多信息。所以只有当打字时没有jongseong时(比如끝나),才有可能有jongseong(ㄹ).
如果你想把 버리
+ 어
变成 버려
,你应该实现一些韩语语法,特别是对于这种情况,jungseong 的缩写。例如 ㅣ
+ ㅓ
= ㅕ
, ㅗ
+ ㅏ
= ㅘ
如您所提供。 한글 맞춤법 chapter 4. section 5(我现在找不到英文页面)这样定义缩写。这是可能的,但不是那么容易的工作,尤其是对于非韩国人。
下一步,如果你想要的只是将 끝나
+ ㄹ
变成 끝날
,这可能是一个相对容易的工作,因为有库可以处理合成和choseong、jungseong、jongseong的分解。在 Python 的情况下,我找到了 hgtk。你可以这样尝试(非实用代码):
# hgtk methods take one character at a time
cjj1 = hgtk.letter.decompose('나') # ('ㄴ', 'ㅏ', '')
cjj2 = hgtk.letter.decompose('ㄹ') # ('ㄹ', '', '')
if cjj1[2]) == '' and cjj2[1]) == '':
cjj = (cjj1[0], cjj1[1], cjj2[0])
cjj2 = None
不过,如果没有适当的韩文知识,将很难完成。