有没有办法以编程方式将韩国unicode合并为一个?

时间:2017-02-27 06:59:24

标签: python unicode nlp ime korean-nlp

使用韩语输入法编辑器(IME),可以输入버리 + ,它将自动变为버려

有没有办法以编程方式在Python中执行此操作?

>>> x, y = '버리', '어'
>>> z = '버려'
>>> ord(z[-1])
47140
>>> ord(x[-1]), ord(y)
(47532, 50612)

有没有办法计算47532 + 50612 - > 47140?

以下是一些例子:

  

가보+아 - > 가봐

     

끝나+ㄹ - > 끝날

2 个答案:

答案 0 :(得分:4)

我是韩国人。首先,如果您输入버리 + ,则会变为버리어而不是버려버려버리어的缩写,不会自动生成。此外,가보아在输入过程中也不会因同样的原因自动变为가봐

其次,相比之下,끝나 + 变为끝날,因为没有 jongseong (종성)。请注意,Hangul的一个字符由 chooseong (초성), jungseong (중성)和 jongseong 组成。 chooseong jongseong 是辅音, jungseong 是元音。点击Wikipedia了解更多信息。因此,只有在打字时没有 jongseong (如끝나),才有可能 jongseong (ㄹ)。

如果你想버리 + 버려,你应该实现一些韩语语法,特别是对于这种情况, jungseong 的缩写。例如,您提供的 + = + = 한글 맞춤법 chapter 4. section 5(我现在无法找到英文网页)定义这样的缩写。这是可能的,但不是那么容易的工作,尤其是非韩国人。

接下来,如果您想要的只是끝나 + 끝날,那么它可以是一个相对容易的工作,因为有可以处理合成的图书馆和分解选择 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

但是,如果没有适当的Hangul知识,那将很难完成。

答案 1 :(得分:3)

您可以使用自己的翻译表 缺点是您必须输入所有配对手册或者您有一个文件来获取它。
例如:

# 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 ]) )
  

输入:['버리어','가보아','끝나ㄹ']      输出:['버려','가봐','끝날']
     버리어=버려

使用Python测试:3.4.2