Skip to content

Latest commit

 

History

History
209 lines (182 loc) · 11.7 KB

README_intro.md

File metadata and controls

209 lines (182 loc) · 11.7 KB

NLP | 형태소 분석기 원리

1. Introduction

한국어 형태소 분석 결과는 원형 복원, 불규칙 활용 등의 이유로 입력 문자와는 형태와 길이가 달라지게 됩니다. 예를 들어, 져줄래와 같은 입력 어절의 분석 결과는 지/VV + 어/EC + 주/VX + ㄹ래/EF와 같이 출력의 길이와 형태 모두 쉽게 예측이 가능하지 않습니다. 이러한 길이의 불일치 문제로 인해 기계학습 분류기에 기반한 모델의 출력을 설계하는 부분이 중요합니다. 기존에 고전적인 HMM, CRF 등의 방법에서는 TRIE 사전을 이용하여 들쑥날쑥한 형태의 lattice 격자를 Viterbi 알고리즘을 통해 최적의 경로를 탐색하는 형식으로 많이 접근해 왔습니다.

2. Recent work

최근의 딥러닝 방법으로는 번역에서 많이 사용하는 sequence to sequence(seq2seq) 방식을 맨 먼저 생각해 볼 수 있습니다. 져, 줄, 래라는 입력 원문에 대해 인코더를 통해 latent 벡터를 생성하고 지/VV, 어/EC, 주/VX, ㄹ래/EF라는 출력을 디코더를 통해 차례로 생성하는 것입니다. Kakao는 khaiii에서 CNN 모델을 이용해서 형태소 분석기를 구현하지만 단점이 여러가지 있습니다.

  1. 긴 문장 처리 못함. CNN구조 자체가 긴 문장을 파악할 수 없기 때문에 이런 문장을 입력하면 잘못분석하거나 아예 core dump입니다.
  2. 띄어쓰기 없이 입력하면 분석 불가능함. Kakao가 CNN모델을 구현했을 때 띄어쓰기 정보를 갖고 아래와 같은 창을 만들었습니다.
-7	-6	-5	-4	-3	-2	-1	0	1	2	3	4	5	6	7
<s>	<s>	프	<u>	스	의	<w>	세	<u>	적	인	</w>	의	상	디

여기에 가 띄어쓰기 표시입니다. 는 padding이고 는 Unknown 단어입니다. 이렇게 하면은 띄어쓰기 정보 갖고 있지만 띄어쓰기 없이 입력하면 창을 잘 못 구현해서 당연히 결과도 잘못나올겁니다. 3. Convergence 속도 느립니다. 그래서 저희가 이런 단점을 해결하기 위해서 새 모델을 구현했습니다.

3. Our Model

  1. Bi-LSTM + pre-trained embedding (100-dimension Korean character-based embedding)
  2. Multi-task training (형태소 분석과 띄어쓰기 분석)

4. Tagging Method

그런데 형태소 분석은 문자와 형태와 길이가 다르기 때문에 Neural Network를 활용하면 형태소 태그를 바꿔야합니다. 즉, 한 음절로 입력할 때 한 태그만 출력해야 하는겁니다. 그래서 Kakao khaiii의 원형 복원 방법을 활용했습니다. 예를 들어,

입력: 심사숙고했겠지만
분석: 심사/NNG + 숙고/NNG + 하/VX + 였/EP + 겠/EP + 지만/EC
태그: 심/I-NNG, 사/I-NNG, 숙/B-NNG, 고/I-NNG, 하/I-VX, 였/I-EP, 겠/B-EP, 지/I-EC, 만/I-EC

각각의 음절들은 아래와 같이 정렬이 됩니다.

음절 (입력) 분석 결과 태그 (출력)

심	심/I-NNG	I-NNG
사	사/I-NNG	I-NNG
숙	숙/B-NNG	B-NNG
고	고/I-NNG	I-NNG
했	하/I-VX, 였/I-EP	I-VX:I-EP:0
겠	겠/B-EP	B-EP
지	지/I-EC	I-EC
만	만/I-EC	I-EC

5번째 행을 참고하면, 했은 I-VX:I-EP:0라는 복합 태그를 갖는 반면, 나머지 음절들은 단순 태그를 갖습니다. 복합 태그와 단순 태그의 차이는 원형복원 사전의 사용 여부와 관련이 있습니다. 음절과 복합 태그를 합친 했/I-VX:I-EP:0를 key로 하여 원형복원 사전을 검색하면 하/I-VX, 였/I-EP이라는 복원 정보를 얻게 됩니다. 코퍼스에서 모든 음세절에 대해 형태소 분석 결과와 정렬을 수행하고 필요한 경우 복합 태그를 I-VX:I-EP:1, I-VX:I-EP:2와 같이 순차적으로 생성한 다음 자동으로 원형 복원 사전도 생성하게 됩니다. 아래는 이렇게 생성된 학습 데이터의 예시입니다.

프랑스의    I-NNP I-NNP I-NNP I-JKG
세계적인    I-NNG I-NNG I-XSN I-VCP:I-ETM:0
의상    I-NNG I-NNG
디자이너    I-NNG I-NNG I-NNG I-NNG
엠마누엘    I-NNP I-NNP I-NNP I-NNP
웅가로가    I-NNP I-NNP I-NNP I-JKS
실내    I-NNG I-NNG
장식용    I-NNG I-NNG I-XSN
직물    I-NNG I-NNG
디자이너로    I-NNG I-NNG I-NNG I-NNG I-JKB
나섰다.    I-VV I-VV:I-EP:0 I-EF I-SF

그리고 아래는 동시에 자동으로 생성된 원형복원 사전입니다.

인/I-VCP:I-ETM:0    이/I-VCP ㄴ/I-ETM
섰/I-VV:I-EP:0    서/I-VV 었/I-EP

Training할 때 vocab.in 를 검색해서 character index가 neural network의 input이 되고 vocab.out 를 검색해서 tag number가 output이 됩니다. 예를 들어, vocab.in은:

0: 세
1: 계
2: 적
3: 인 

그럼, “세계적인”은: (0, 1, 2, 3) 로 표시합니다. 만약에 vocab.out 은:

0: I-XSN
1: I-NNG
2: I-ZN
3: I-ZV
4: I-ZZ
5: B-EP:I-EC:0
6: B-EP:I-EF:0
7: B-EP:I-ETM:0
8: B-JKB:I-JKG:0
9: B-JKB:I-JX:0
10: I-VCP:I-ETM:0

그러면 “세계적인”의 태그가 (1, 1, 0, 10) 이 됩니다. 이런 vector를 tensor로 전환하고 training합니다.

5. 띄어쓰기 분석

전에 언급했던것처럼 저희의 모델은 Multi-task 모델이고 하나는 형태소 분석, 하나는 띄어쓰기 분석입니다.
두 task는 model에 넣어준 input이 똑같습니다. Input이 model에 있는 공동 Bi-LSTM layer에 들어가고 마지막으로 Linear layer 두개 가 있습니다. 하나가 형태소 분석기의 결과를 생성하고 하나가 띄어  쓰기 결과를 output합니다. Dataset을 model에 넣기 전에 다 띄어쓰기를 지웠습니다. 예를 들어, corpus에 이런 문장이 있습니다:
프랑스의    I-NNP I-NNP I-NNP I-JKG
세계적인    I-NNG I-NNG I-XSN I-VCP:I-ETM:0
의상    I-NNG I-NNG
디자이너    I-NNG I-NNG I-NNG I-NNG
엠마누엘    I-NNP I-NNP I-NNP I-NNP
웅가로가    I-NNP I-NNP I-NNP I-JKS
실내    I-NNG I-NNG
장식용    I-NNG I-NNG I-XSN
직물    I-NNG I-NNG
디자이너로    I-NNG I-NNG I-NNG I-NNG I-JKB
나섰다.    I-VV I-VV:I-EP:0 Iㅐ-EF I-SF

그럼 model에 들어가는 sentence는:

프랑스의세계적인의상디자이너엠마누엘웅가로가실내장식용직물디자이너로나섰다.

Section 4. Tagging Method 부분을 보면 vocab.in 를 참조하면 위 문장을 이런 list로 표시됩니다:

[4607, 3360, 3848, 4100, 3778, 2872, 4140, 4104, 4100, 3744, 3268, 4115, 4102, 3082, 3987, 3456, 3132, 3986, 4057, 2809, 3405, 2809, 3862, 3067, 4124, 3859, 4048, 4205, 3530, 3268, 4115, 4102, 3082, 3405, 3051, 3775, 3170, 18]

그리고 vocab.out 를 참조하면 형태소 label이 이런 list로 표시됩니다:

[66, 66, 66, 55, 65, 65, 87, 460, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 58, 65, 65, 65, 65, 87, 65, 65, 65, 65, 65, 65, 53, 82, 490, 47, 70]

ground truth data는 다 띄어쓰기가 있는 data니까, ground truth 문장을 보면 음절 뒤에 띄어쓰기 있으면 label에 2을 주고 없으면 1을 줍니다. 문장 끝은 3이 됩니다. 위의 문장의 경우, 띄어쓰기 label은 이렇게 됩니다:

[1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 3]

그래서 한문장이 model에 들어가면 output이 두개 있습니다. 하나는 형태소 분석 label이고 하나는 띄어쓰기 label입니다. Cross Entropy로 각각의 loss를 계산하고 합쳐서 total loss를 gradient descent하면 weight를 update합니다. 한 Epoch가 1시간 10분 정도 걸리고 첫번째 Epoch 지나면 dev data에 형태소 분석의 F1 score가 94.5% 됩니다. 10 Epoch 지나면 형태소 분석 정확도가 95.5% 됩니다.

6. Inference

Training한 모델을 써서 새로운 문장을 주면 Infer를 합니다. Infer할 때 일단 뛰어쓰기 분석 결과를 이용해서 띄어쓰기 있는 원문을 회복합니다. 그리고 한 어절 안에 원형복원사전을 참고해서 원형 형태소 태그를 찾습니다. 만약에 띄어쓰기 정보 안쓰면은 형태소 분석은 어절 단위로 진행하지않고 문장 단위로 진행됩니다. 이 때 단어를 합쳐서 형태소 태그를 주는 문제가 있습니다. 예를 들어:

오늘  오늘/NNG
날씨  날씨/NNG

이런 경우는 띄어쓰기 정보 안쓰면 아래와 같은 형태소 태그가 됩니다:

오늘날씨    오늘날씨/NNG

그래서 띄어쓰기 정보를 가지면 이문제를 해결할 수 있습니다.

예를 들면, 아래는 한 긴문장을 input하는 경우:

(원문)정기보험과 종신보험 모두 사망을 보장하는 상품이지만, 보장기간에 따른 차이가 있습니다. 정기보험은 필요로 하는 보장기간을 선택하셔서 그 기간 동안만 사망보장을 받을 수 있고, 종신보험은 정해진 기간이 따로 없이 평생토록 사망에 대한 보장이 가능한 특징이 있습니다. 이러한 보험기간의 차이로 종신보험의 보험료가 정기보험에 비해 높은편이며, 정기보험은 일정기간 동안만 집중 보장하기 때문에 좀 더 합리적인 보험료로 사망보장을 받을 수 있습니다.

(처리 후)정기보험과 종신보험 모두 사망을 보장하는 상품이지만, 보장기간에 따른 차이가 있습니다.정기보험은 필요로 하는 보장기간을 선택하ㄹ셔서 그 기간 동안만 사망보장을 받을 수 있고, 종신보험은 정해진 기간이 따로 없이 평생토록 사망에 대한 보장이 가능한 특징이 있습니다.이러한 보험기간의 차이로 종신보험의 보험료가 정기보험에 비해 높은 편이며, 정기보험은 일정기간 동안만 집중보장하기 때문에 좀더 합리적인 보험료로 사망보장을 받을 수 있습니다.

그리고 형태소 태그가 나옵니다:

정기보험과      정기/NNG + 보험/NNG + 과/JC
종신보험        종신/NNG + 보험/NNG
모두    모두/MAG
사망을  사망/NNG + 을/JKO
보장하는        보장/NNG + 하/XSV + 는/ETM
상품이지만,     상품/NNG + 이/VCP + 지만/EC + ,/SP
보장기간에      보장/NNG + 기간/NNG + 에/JKB
따른    따르/VV + ㄴ/ETM
차이가  차이/NNG + 가/JKS
있습니다.정기보험은     있/VV + 습니다/EF + ./SF + 정기/NNG + 보험/NNG + 은/JX
필요로  필요/NNG + 로/JKB
하는    하/VV + 는/ETM
보장기간을      보장/NNG + 기간/NNG + 을/JKO
선택하셔서      선택/NNG + 하/XSV + 시/EP + 어서/EC
그      그/MM
기간    기간/NNG
동안만  동안/NNG + 만/JX
사망보장을      사망/NNG + 보장/NNG + 을/JKO
받을    받/VV + 을/ETM
수      수/NNB
있고,   있/VV + 고/EC + ,/SP
종신보험은      종신/NNG + 보험/NNG + 은/JX
정해진  정하/VV + 여/EC + 지/VX + ㄴ/ETM
기간이  기간/NNG + 이/JKS
따로    따로/MAG
없이    없이/MAG
평생토록        평생토록/MAG
사망에  사망/NNG + 에/JKB
대한    대하/VV + ㄴ/ETM
보장이  보장/NNG + 이/JKS
가능한  가능/NNG + 하/XSA + ㄴ/ETM
특징이  특징/NNG + 이/JKS
있습니다.이러한 있/VV + 습니다/EF + ./SF + 이러/XR + 하/XSA + ㄴ/ETM
보험기간의      보험/NNG + 기간/NNG + 의/JKG
차이로  차이/NNG + 로/JKB
종신보험의      종신/NNG + 보험/NNG + 의/JKG
보험료가        보험료/NNG + 가/JKS
정기보험에      정기/NNG + 보험/NNG + 에/JKB
비해    비하/VV + 여/EC
높은    높/VA + 은/ETM
편이며, 편/NNB + 이/VCP + 며/EC + ,/SP
정기보험은      정기/NNG + 보험/NNG + 은/JX
일정    일정/NNG
기간    기간/NNG
동안만  동안/NNG + 만/JX
집중보장하기    집중/NNG + 보장/NNG + 하/XSV + 기/ETN
때문에  때문/NNB + 에/JKB
좀더    좀/MAG + 더/MAG
합리적인        합리/NNG + 적/XSN + 이/VCP + ㄴ/ETM
보험료로        보험료/NNG + 로/JKB
사망보장을      사망/NNG + 보장/NNG + 을/JKO
받을    받/VV + 을/ETM
수      수/NNB
있습니다        있/VV + 습니다/EC