====== HanDicをPythonで利用する ====== ===== はじめに ===== ここでは[[https://ja.osdn.net/projects/handic/|HanDic]]をPythonで利用する方法について紹介します. Pythonのバージョンは3.7.11,HanDicはhandic-mecab-20210116を用いました.MeCabを扱うためのモジュールmecab-python3ほか,必要なモジュールがインストールされていることが前提です.HanDicはPythonスクリプトのあるディレクトリ下,''handic''という名前のディレクトリに保存されているとします. なお,HanDicに含まれるファイルのうち''dicrc''に記述の不備があり,「bos-feature」行の末尾に「'',*,*''」を追加しました. ==== 注意 ==== 筆者がPython初心者なので,無駄なコードや誤りなどが含まれている可能性があることをお断りしておきます.また,HanDicによる形態素解析が誤っている可能性もありますので,その点ご承知おきください. ===== 準備 ===== HanDicでは完成型のハングルではなく,字母に分解した文字列を入力として用いるため,完成形ハングルを字母に分解するスクリプトを用意します. # k2jamo # substitute(text) import re REGEX = '[가-힣]' pattern = re.compile(REGEX) def convert_main(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): '正規表現で完成形ハングルにマッチした入力を置換する' 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 うまくいっているようです. ====== 参考にしたページ ====== * [[https://taku910.github.io/mecab/bindings.html|スクリプト言語のバインディング]] * [[https://atmarkit.itmedia.co.jp/ait/articles/2102/05/news027.html|[文章生成]MeCabをインストールして分かち書きを試してみよう]] * [[https://water2litter.net/rum/post/python_wordcloud_jp/|PythonでWord Cloudを作ってみた(和文編)]] * [[https://analytics-note.xyz/programming/frequencies-word-cloud/|単語の頻度データからWord Cloudを作成する方法]] {{indexmenu_n>204}}