ユーザ用ツール

サイト用ツール


korean:mecab:python

HanDicをPythonで利用する

はじめに

ここではHanDicをPythonで利用する方法について紹介します.

Pythonのバージョンは3.7.11,HanDicはhandic-mecab-20210116を用いました.MeCabを扱うためのモジュールmecab-python3ほか,必要なモジュールがインストールされていることが前提です.HanDicはPythonスクリプトのあるディレクトリ下,handicという名前のディレクトリに保存されているとします.

なお,HanDicに含まれるファイルのうちdicrcに記述の不備があり,「bos-feature」行の末尾に「,*,*」を追加しました.

注意

筆者がPython初心者なので,無駄なコードや誤りなどが含まれている可能性があることをお断りしておきます.また,HanDicによる形態素解析が誤っている可能性もありますので,その点ご承知おきください.

準備

HanDicでは完成型のハングルではなく,字母に分解した文字列を入力として用いるため,完成形ハングルを字母に分解するスクリプトを用意します.

k2jamo.py
# k2jamo
# substitute(text)
import re
 
REGEX = '[가-힣]'
pattern = re.compile(REGEX)
 
 
def convert_main(match):
    '正規表現でマッチした完成形ハングル<match>を字母に分解する'
    value = ord(match.group(0))
    my_int = value - 44032
    my_int_index = int(my_int / 588)
    my_final_index = my_int % 28
    my_medial_index = \
        int((my_int - (my_int_index * 588) - my_final_index) / 28)
    result = initial[my_int_index] + \
        medial[my_medial_index] + \
        final[my_final_index]
    return result
 
 
def substitute(text):
    '正規表現で完成形ハングルにマッチした入力<text>を置換する'
    result = re.sub(pattern, convert_main, text)
    return result
 
 
if __name__ == '__main__':
    for letters in ['가', '안녕', '한국어 문장입니다.', '영문자 a/b를 포함']:
        output = substitute(letters)
        print(letters, '=>', output)

これをk2jamo.pyとして保存します.

MeCabの呼び出し

MeCabを使うためのモジュールと,k2jamo.pyをimportします.その上で,MeCabのインスタンスを作成します.

import MeCab
import k2jamo
tokenizer = MeCab.Tagger('-d handic')
tokenizer.parse('')

形態素解析の実行

k2jamo.pyにある関数substitute()を使って字母に分解し,MeCabで解析します.

input = u'한상혁 방송통신위원장이 코로나19 확진 판정을 받으면서 김부겸 국무총리를 비롯한 국무위원들이 코로나 검사 대상이 됐다.'
# 한겨레 2021年11月5日付け記事(https://www.khan.co.kr/politics/politics-general/article/202111050751001/)より
input = k2jamo.substitute(input)
print(tokenizer.parse(input))

結果は以下の通り.

한    Noun,固有名詞,姓,*,*,한10,한,韓,*,*,NNP
상혁        Noun,固有名詞,名,*,*,상혁,상혁,*,*,*,NNP
방송        Noun,普通,動作,*,*,방송01,방송,放送,*,B,NNG
통신        Noun,普通,動作,*,*,통신01,통신,通信,*,B,NNG
위원장     Noun,普通,*,*,*,위원장,위원장,委員長,*,C,NNG
이     Ending,助詞,主格,*,*,이,이,*,*,*,JKS
코로나       Noun,普通,*,*,*,코로나,코로나,*,corona,*,NNG
19      Symbol,数字,*,*,*,*,*,*,*,*,SN
확진        Noun,普通,動作,*,*,확진,확진,確診,*,*,NNG
판정        Noun,普通,動作,*,*,판정,판정,判定,*,*,NNG
을    Ending,助詞,対格,*,*,을,을,*,*,*,JKO
받으 Verb,自立,*,語基2,*,받다01,받으,*,선물을 ~,A,VV
면서 Ending,語尾,接続形,*,2接続,면서,면서,*,*,*,EC
김    Noun,固有名詞,姓,*,*,김06,김,金,*,*,NNP
부겸 Noun,固有名詞,名,*,*,부겸,부겸,*,*,*,NNP
국무 Noun,普通,*,*,*,국무02,국무,國務,*,*,NNG
총리 Noun,普通,*,*,*,총리01,총리,總理,*,C,NNG
를    Ending,助詞,対格,*,*,를,를,*,*,*,JKO
비롯 Root,語根,動作,*,*,비롯,비롯,*,*,*,XR
하     Suffix,動詞派生,*,語基2,*,하다02,하,*,*,*,XSV
ᆫ       Ending,語尾,連体形,*,2接続,ㄴ,ㄴ,*,*,*,ETM
국무 Noun,普通,*,*,*,국무02,국무,國務,*,*,NNG
위원 Noun,普通,*,*,*,위원01,위원,委員,*,C,NNG
들    Suffix,名詞派生,*,*,*,들09,들,*,우리들,*,XSN
이     Ending,助詞,主格,*,*,이,이,*,*,*,JKS
코로나       Noun,普通,*,*,*,코로나,코로나,*,corona,*,NNG
검사 Noun,普通,動作,*,*,검사03,검사,檢査,*,B,NNG
대상 Noun,普通,*,*,*,대상11,대상,對象,*,*,NNG
이     Ending,助詞,補格,*,*,이,이,*,*,*,JKC
돼     Verb,自立,*,語基3,*,되다01,돼,*,어른이 ~,A,VV
ᆻ       Prefinal,過去,*,語基1,*,ㅆ,ㅆ,*,*,*,EP
다     Ending,語尾,終止形,*,1接続,다,다,*,*,*,EF
.       Symbol,ピリオド,*,*,*,.,.,*,*,*,SF
EOS

うまくいっているようです.

参考にしたページ

korean/mecab/python.txt · 最終更新: 2021/11/14 22:49 by yoshi