2. 자연어 처리 과정
형태소 분석
Morpheme analysis
구문 분석
Syntax analysis
의미 분석
semantic analysis
화용 분석
Pragmatic analysis
형태소 단위의 분절 및
POS 태그 부착
구문 태그 부착
문장구조 파악
단어의 중의성 해소 정보 추출
(대명사가 가리키는 의미부터...)
3. 구문 분석
• 어절 단위로 '구문 태그' 부착하고 '문장 구조' 파악
구(Phrase)를 기본 단위로 사용하며,
한국어 자연어 처리에서는 어절을 구로 하여,
문장 구조를 표현하고 있다.
(형태소 단위로 문장 구조를 분석하기엔
문장 내 형태소가 많아 복잡도가 높아진다고 본 것 같음..)
(그냥 통사론 이론을 바탕으로 제일 적합한 단위가
어절이어서 사용하는 것 같다)
4. 구문 태그
구문 태그 = 구문 표지 + 기능 표지
Phrase tag Functional tag
용어가 자료마다 혼재되어 있음..
태그 = Tag
표지 = Tag
구문 태그 = 구문 표지 ??
NP_OBJ = NP + OBJ
목적격 체언구 체언구 목적어
5. 구문 태그
구문 표지 기능 표지
기타 표지
• 오진영, 지배소 후위 언어를 위한 효율적 분석
• 홍정하, 구문분석 말뭉치의 이해와 활용
6. 구문 표지와 형태소 품사 태그
• mecab-ko-dic 품사 태그 설명, https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=589544265
세종 품사 태그
총 42개
구문 표지
보통 총 8개 안팎
7. 기능 표지와 문장 성분
기능 표지 한국어 문장 성분
비슷
≈
• https:// https://ko.wikipedia.org/wiki/한국어의_문장_성분
9. 문장 구조
• 구 구조 문법(Phrase structure grammar): 구를 구성하는 구조를 중심으로
• 의존 문법(Dependency grammar): 의존관계에 의해 구조를 정의
• 통사론, https://ko.wikipedia.org/wiki/통사론
• Dependency Grammar, http://taweb.aichi-u.ac.jp/tmgross/DG.html
10. 문장 구조
• 안광모, 지배소 후보 집합을 이용한 한국어 의존 구문 분석 알고리즘
찾아본 대부분의 자료는
'의존 문법'을 통한 문장 구조 해석을 진행
"한국어와 같이 비교적 어순이 자유로운 언어에서는
주로 의존 구문 분석 방법이 연구되어 왔으며 ... (후략)"
문장 구조에 대한 자세한 내용은
다음에...
11. 구문 태거 구현 과정
1. 말뭉치 전처리
2. 구문 태깅 모델 학습: 기본 자질 학습, 1차/2차 추가 자질 학습
3. 구문 태거 구현
• 구현 과정은 아래 논문 2편을 따라서 진행
오진영, "엔트로피 지도 CRF를 이용한 한국어 어절 구문 태그 예측", 2009
오진영, "지배소 후위 언어를 위한 효율적 구문분석", 2013
12. 1. 말뭉치 전처리
• 세종계획 21 구문분석 말뭉치를 사용
• 구 구조 문법의 말뭉치: 의존구조 학습을 위해서는 형태 변경이 필요
• 433,839어절, 43,828문장
• 전처리 과정
1. 말뭉치 파서 생성
2. 오류 문장 수정
14. 세종계획 21 구문분석 말뭉치
말뭉치 파일 목록 말뭉치 파일 내용
문장
구조
문장
구조
15. 1-1. 말뭉치 파서 생성
• pyparsing 패키지를 이용하여 파서 생성
• pyparsing, https://github.com/pyparsing/pyparsing/
16. 1-2. 오류 문장 수정
• 구 구조의 규칙이 명확하게 설명되어 있지 않아 직접 확인하면서 만듦
• 말뭉치 내에 오류로 보이는 구조가 있어 수정
• 미진한 부분
• 개별 어절이나 형태소의 문제가 아닌
'인용절에 대한 처리'는 수정에 시간이 많이 걸릴 것 같았고,
어떤 방식으로 수정하는게 적절한지 몰라 이번 과정에서는 제외
17. 말뭉치 내 인용절 등장
상위에 인용절을 포함한 문장이 나오고
하위에 인용절이 Q와 같은 기호를 달고
존재하는데
Q=2라는 문장을 복구하게 위해
Q1절과 Q2절을 어떻게 합쳐야 할지
모르겠음
Q=2가 형태소 분석이 되어있는 것도
이상함...
상위 문장
하위 문장 1
하위 문장 2
18. 2. 구문 태깅 모델 학습
• CRF(Continuous Random Field) 알고리즘을 사용하여 학습
• sklearn-crfsuite 패키지를 사용
• 학습 과정
1. Feature를 정의
2. 모델 학습: 기본, 1차, 2차 학습, Feature를 누적하여 학습, 이후 결과 비교
• 참고 1: 구문 태깅과 같은 문제를 'Sequence labeling problem'이라고 부름
• 참고 2: HMM -> CRF -> RNN -> LSTM로 알고리즘 사용 트랜드가 이어짐
• 이창기, 딥러닝 기반의 자연어 처리 기술, https://spri.kr/posts/view/21854?code=speech
• Conditional Random Field (CRF) 기반 품사 판별기의 원리와 HMM 기반 품사 판별기와의 차이점, https://lovit.github.io/nlp/2018/09/13/crf_based_tagger/
19. 2-1. Feature 정의
Feature 설명
H_POS 어절의 첫 번째 형태소 품사
T_POS 어절의 마지막 형태소 품사, 하나의 형태소로 구성된 어절인 경우 H_POS와 같음
t_POS 어절의 마지막 전 형태소 품사, 어절의 길이가 3보다 작으면 사용 안함
h_POS
어절 첫 번째 형태소부터 마지막 전 형태소 사이에 XSA(형용사 파생 접미사), XSV(동사 파생 접미사), VCP(긍정 지정사)가 존재하면 해당
품사 지정
n_POS 다음 어절의 첫 번째 형태소 품사, 해당 형태소 뒤의 형태소 품사가 XSA, XSV면 통합 후 VA(형용사), VV(동사) 품사 지정
n_surface 다음 어절의 첫 번째 형태소 문자열, n_POS와 같이 통합되는 경우에는 문자열을 통합하여 지정
• 예시: 침실과 식당, 욕실에서 사용하는 (후략)
= 침실/NNG+과/JC 식당/NNG+,/SP 욕실/NNG+에서/JKB 사용/NNG+하/XSV+는/ETM
어절 H_POS T_POS t_POS h_POS n_POS n_surface
침실/NNG+과/JC NNG JC NNG 식당
식당/NNG+,/SP NNG SP NNG 욕실
욕실/NNG+에서/JKB NNG JKB VV 사용하
사용/NNG+하/XSV+는/ETM NNG ETM XSV XSV (후략) (후략)
20. 2-2. 모델 학습
• Feature를 추가하며 학습
• 기본 학습: [H_POS, T_POS, t_POS]
• 1차 학습: [H_POS, T_POS, t_POS, h_POS, n_POS]
• 2차 학습: [H_POS, T_POS, t_POS, h_POS, n_POS, n_surface]
• L-BFGS 알고리즘, 10-fold cross validation, 50회 진행
Feature 설명
H_POS 어절의 첫 번째 형태소 품사
T_POS 어절의 마지막 형태소 품사, 하나의 형태소로 구성된 어절인 경우 H_POS와 같음
t_POS 어절의 마지막 전 형태소 품사, 어절의 길이가 3보다 작으면 사용 안함
h_POS
어절 첫 번째 형태소부터 마지막 전 형태소 사이에 XSA(형용사 파생 접미사), XSV(동사 파생 접미사), VCP(긍정 지정사)가 존재하면 해당
품사 지정
n_POS 다음 어절의 첫 번째 형태소 품사, 해당 형태소 뒤의 형태소 품사가 XSA, XSV면 통합 후 VA(형용사), VV(동사) 품사 지정
n_surface 다음 어절의 첫 번째 형태소 문자열, n_POS와 같이 통합되는 경우에는 문자열을 통합하여 지정
Feature 정의
21. 2-3. 학습 결과: 기본 평가
best_params {'c1': 1.1139, 'c2': 0.0183}
best CV score 0.9297
model size 0.14M
mean_train_score mean_test_score
count 50 50
mean 0.9363 0.9295
std 0.0006 0.0001
max 0.9371 0.9297
22. 2-3. 학습 결과: 1차 평가
best_params {'c1': 0.7351, 'c2': 0.0027}
best CV score 0.9359
model size 0.22M
mean_train_score mean_test_score
count 50 50
mean 0.9422 0.9355
std 0.0007 0.0001
max 0.9431 0.9359
23. 2-3. 학습 결과: 2차 평가
best_params {'c1': 0.9273, 'c2': 0.0725}
best CV score 0.9586
model size 1.01M
mean_train_score mean_test_score
count 50 50
mean 0.9842 0.9570
std 0.0109 0.0017
max 0.9969 0.9586
24. 2-3. 학습 결과: 종합
기본 1차 2차
사용 Feature 집합
H_POS(첫 번째 품사)
T_POS(마지막 품사)
t_POS(마지막 전 품사)
H_POS
T_POS
t_POS
h_POS(파생 접미사, 긍정 지정사)
n_POS(다음 어절 첫 번째 품사)
H_POS
T_POS
t_POS
h_POS
n_POS
n_surface
(다음 어절 첫 번째 문자열)
최고 성능
Hyperparameter
c1: 1.1139
c2: 0.0183
c1: 0.7351
c2: 0.0027
c1: 0.9273
c2: 0.0725
최고 Train 정확도 0.9371 0.9431 0.9969
최고 Test 정확도 0.9297 0.9359 0.9586
모델 사이즈 0.14M 0.22M 1.01M
25. 3. 구문 태거 구현
• MeCab와 연결 작업
• MeCab와 세종 POS 태그 구조가 달라 호환을 위한 작업 진행
• MeCab의 형태소 분석 이후 구문 태깅이 이루어지도록 연결