다운로드
작성자: admin 작성일시: 2018-11-20 10:09:33 조회수: 1838 다운로드: 87
카테고리: 기타 태그목록:

KoNLPy 사용자 사전 추가

한국어 형태소 분석 성능을 높이기 위해 사용자 사전을 추가하는 방법에 대해 설명한다.

Komoran 사용자 사전 추가

In [1]:
sentence = '자유한국당, "박근혜-최순실 국정농단 태블릿 PC는 거짓"이라고 주장'

위 문장에 대해 품사 분석을 진행하면, 최순실이라는 고유명사가 사전에 없기 때문에 다음과 같이 잘못 분석된다.

In [2]:
from konlpy.tag import Komoran
komoran = Komoran()
komoran.pos(sentence)
Out:
[('자유', 'NNG'),
 ('한국당', 'NNP'),
 (',', 'SP'),
 ('"', 'SS'),
 ('박근혜', 'NNP'),
 ('-', 'SS'),
 ('최순', 'NNP'),
 ('실', 'NNP'),
 ('국정', 'NNG'),
 ('농', 'NNG'),
 ('단', 'NNG'),
 ('태블릿 PC', 'NNP'),
 ('는', 'JX'),
 ('거짓', 'NNG'),
 ('"', 'SS'),
 ('이라고', 'JKQ'),
 ('주장', 'NNG')]

이 문제는 사용자 사전을 추가 함으로 해결할 수 있다. Komoran을 이용 할 때는 비교적 손쉽게 사용자 사전을 추가할 수 있다. 참조하고 싶은 단어와 그 품사를 txt 파일로 만들어 객체를 생성할 때 userdic 인수에 txt 파일의 경로를 입력하면 된다. 이 때, txt 파일 내에서 단어와 품사는 탭(tab)으로 구분한다. 다음은 추가할 user_dic.txt 라는 파일의 내용이다.

In [3]:
!cat './user_dic.txt'
최순실	NNP

Komoran 객체를 다시 생성하며 userdic 인수에 이 파일의 경로를 입력하면 다음과 같이 원하는대로 품사 분석이 이루어진다.

In [4]:
komoran = Komoran(userdic='./user_dic.txt')
komoran.pos(sentence)
Out:
[('자유', 'NNG'),
 ('한국당', 'NNP'),
 (',', 'SP'),
 ('"', 'SS'),
 ('박근혜', 'NNP'),
 ('-', 'SS'),
 ('최순실', 'NNP'),
 ('국정', 'NNG'),
 ('농', 'NNG'),
 ('단', 'NNG'),
 ('태블릿 PC', 'NNP'),
 ('는', 'JX'),
 ('거짓', 'NNG'),
 ('"', 'SS'),
 ('이라고', 'JKQ'),
 ('주장', 'NNG')]

Hannanum 사용자 사전 추가

같은 문장을 Hannanum 을 사용하여 품사 분석을 진행하면 결과는 다음과 같이 박근혜-최순실이 하나의 명사로 인식된다.

In [5]:
from konlpy.tag import Hannanum
hannanum = Hannanum()
hannanum.pos(sentence)
Out:
[('자유한국당,', 'N'),
 ('"박근혜-최순실', 'N'),
 ('국정농단', 'N'),
 ('태블릿', 'N'),
 ('PC', 'F'),
 ('는', 'J'),
 ('거짓', 'N'),
 ('"', 'S'),
 ('이', 'J'),
 ('라', 'E'),
 ('고', 'J'),
 ('주장', 'N')]

Hannanum 형태소 분석기에서 사용자 사전을 추가 하는 방법은 dic_user.txt 파일에 원하는 정보를 추가하는 것이다. KoNLPy 패키지가 있는 위치로 이동하면, java/data/kE 라는 디렉토리를 확인 할 수 있다. KoNLPy패키지의 위치는 설치 환경마다 다르므로 독자가 스스로 찾아야 한다. 예를 들어 이 책이 제공하는 도커 환경에서의 경로는 ~/anaconda3/lib/python3.6/site-packages/konlpy/java/data/kE이다. 이 디렉토리에 사용자 사전인 dic_user.txt 파일이 있다. 내용을 확인하면 다음과 같다.

In [6]:
dic_user = "~/anaconda3/lib/python3.6/site-packages/konlpy/java/data/kE/dic_user.txt"
!tail {dic_user}
그분들	npp
극진	ncps
당신들	npp
동량재	ncn
서충원	ncn
우체통	ncn
의미	ncpa
이신목	nqpc
자동사	ncn
·	sy

이 파일에 원하는 단어를 추가 한다. 이때도 단어와 품사는 탭(tab)으로 구분한다.

최순실  nq
In [7]:
!cp {dic_user} {dic_user}.org
!echo "\n최순실  nq" >> {dic_user}
!tail {dic_user}
극진	ncps
당신들	npp
동량재	ncn
서충원	ncn
우체통	ncn
의미	ncpa
이신목	nqpc
자동사	ncn
·	sy
최순실  nq

파일을 저장하고 Hannanum 클래스를 다시 생성하면 원하는 분석을 할 수 있다.

In [8]:
hannanum = Hannanum()
hannanum.pos(sentence)
Out:
[('자유한국당,', 'N'),
 ('"', 'S'),
 ('박근혜', 'N'),
 ('-', 'S'),
 ('최순실', 'N'),
 ('국정농단', 'N'),
 ('태블릿', 'N'),
 ('PC', 'F'),
 ('는', 'J'),
 ('거짓', 'N'),
 ('"', 'S'),
 ('이', 'J'),
 ('라', 'E'),
 ('고', 'J'),
 ('주장', 'N')]
In [9]:
# 다시 원래대로 복원
!mv -f {dic_user}.org {dic_user}
!tail {dic_user}
그분들	npp
극진	ncps
당신들	npp
동량재	ncn
서충원	ncn
우체통	ncn
의미	ncpa
이신목	nqpc
자동사	ncn
·	sy

Kkma 사용자 사전 추가 방법

역시 같은 문장을 Kkma를 이용해 분석하면 다음과 같이, 잘못된 품사 분석 결과가 출력된다.

In [10]:
from konlpy.tag import Kkma
kkma = Kkma()
kkma.pos(sentence)
Out:
[('자유', 'NNG'),
 ('한국', 'NNG'),
 ('당', 'NNG'),
 (',', 'SP'),
 ('"', 'SS'),
 ('박근', 'NNG'),
 ('혜', 'UN'),
 ('-', 'SW'),
 ('최', 'NNP'),
 ('순', 'NNG'),
 ('실', 'NNG'),
 ('국정', 'NNG'),
 ('농단', 'NNG'),
 ('태블릿', 'NNG'),
 ('PC', 'OL'),
 ('는', 'JX'),
 ('거짓', 'NNG'),
 ('"', 'SS'),
 ('이', 'VCP'),
 ('라고', 'ECD'),
 ('주장', 'NNG')]

Kkma 형태소 분석기의 사용자 사전을 추가 하는 방법은 직접 분석기가 사용하는 사전에 단어와 품사 정보를 입력하는 것이다. Kkma가 사용하는 사전은 꼬꼬마 형태소 분석기의 kkma-2.0.jar 파일 내에 존재한다. 이 kkma-2.0.jar 파일 역시 KoNLPy 패키지 디렉토리 내 java 디렉토리 안에 있다. 해당 .jar 파일의 내용을 다음과 같이 출력할 수 있다. 다음은 kkma-2.0.jar 파일 내의 사전 관련 파일 만 출력한다.

In [11]:
kkma_jar = "~/anaconda3/lib/python3.6/site-packages/konlpy/java/kkma-2.0.jar"
!jar tf {kkma_jar} | grep \\.dic
dic/ecat/ChemFormula.dic
dic/ecat/CompNoun.dic
dic/ecat/JunkWord.dic
dic/ecat/UOM.dic
dic/ecat/VerbJunkWord.dic
dic/ecat/VerbNoun.dic
dic/kcc.dic
dic/noun.dic
dic/person.dic
dic/prob/lnpr_morp.dic
dic/prob/lnpr_pos.dic
dic/prob/lnpr_pos_g_exp.dic
dic/prob/lnpr_pos_g_morp_inter.dic
dic/prob/lnpr_pos_g_morp_intra.dic
dic/prob/lnpr_syllable_bi.dic
dic/prob/lnpr_syllable_uni_noun.dic
dic/raw.dic
dic/simple.dic
dic/verb.dic

각 사전에는 형태소 분석을 위해 참조하는 단어들과 그 품사가 적혀져 있다. 다음은 noun.dic 의 내용이다.

$ cat noun.dic
// ==============================================================
// 명사
// ==============================================================
// 일반 명사
각/NNG
간/NNG
감/NNG
값/NNG
강/NNG
개/NNG
거/NNG
게/NNG

사전을 수정하기 위해서는 먼저 jar 파일의 압축을 해제 한다.

  1. kkma-2.0.jar 파일이 있는 디렉토리로 이동하여, kkma라는 디렉토리를 생성하고 그 안에 kkma-2.0.jar파일을 압축 해제 한다.
    $ cd kkma_jar_directory/java
    $ mkdir kkma 
    $ cd kkma
    $ jar xvf ../kkma-2.0.jar
  2. kkma 디렉토리 안에 dic, META-INF, org 라는 디렉토리가 생성될 것이다. 이 중 dic 디렉토리 내의 noun.dic 파일을 수정 할 것이다. dic 디렉토리로 이동하고, vi 혹은 다른 텍스트 파일 에디터를 이용하여 noun.dic를 읽는다. 여기선 vim 에디터를 사용하겠다.

    $ cd dic 
    $ vi noun.dic
    // ==============================================================
    // 명사
    // ==============================================================
    // 일반 명사
    각/NNG
    간/NNG
    감/NNG
    값/NNG
    강/NNG
    개/NNG
    거/NNG
    게/NNG
    .
    .
    .
  3. vim editor 창에서 i 를 입력하고, 원하는 단어를 추가 한다. 어느 위치에 추가 해도 큰 관계는 없지만, 가나다 순으로 정렬해 놓으면 추후 수정이나 조회가 쉬울 것이다.

    .
    .
    최산/NNG
    최상/NNG
    최선/NNG
    최성/NNG
    최소/NNG
    최승/NNG
    최순실/NNG
    최신/NNG
    최심/NNG
    최악/NNG
    -- INSERT --
  4. 변경 사항을 저장한다.(vim editor 기준으로는 :wq) 그리고 kkma 디렉토리로 돌아와, jar 파일로 압축하고 기존의 것을 대체한다. 원본은 만약을 위해 다른 곳에 저장해두기를 추천한다.

    $ cd ..
    $ jar cvf kkma-2.0.jar *
    $ mv kkma-2.0.jar ../

그 다음, Jupyter notebook를 재시작하고 , Kkma 객체를 생성하면 다음과 같이 우리가 원하는 품사 분석이 가능해진다.

>>> from konlpy.tag import Kkma
>>> kkma = Kkma()
>>> sentence = '자유한국당 "박근혜-최순실 국정농단 태블릿 PC는 거짓"이라고 주장'
>>> kkma.pos(sentence)

[('자유', 'NNG'),
 ('한국', 'NNG'),
 ('당', 'NNG'),
 (',', 'SP'),
 ('"', 'SS'),
 ('박근혜', 'NNG'),
 ('-', 'SW'),
 ('최순실', 'NNG'),
 ('국정', 'NNG'),
 ('농단', 'NNG'),
 ('태블릿', 'NNG'),
 ('PC', 'OL'),
 ('는', 'JX'),
 ('거짓', 'NNG'),
 ('"', 'SS'),
 ('이', 'VCP'),
 ('라고', 'ECD'),
 ('주장', 'NNG')]

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!