코어닷 기술 세미나 2018
Session #3 : 도승헌 (코어닷투데이 개발자)
LDA와 3개월 함께한 자연어처리 시행착오기
16:00 ~ 16:50
한국어 자연어 처리를 하면서 알아야 할 최소한의 지식을 전달합니다. 전처리부터 토픽모델링까지 3개월간 동거동락한 Gensim 라이브러리의 비밀을 알려드립니다.
- 자연어 처리의 기본 이론
- 토픽 모델링과 LDA
- Gensim을 이용한 매우 쉬운 자연어 처리
https://coredottoday.github.io/2018/10/15/Coredot-기술-세미나/
16. Ideation : Keyword Tagging
관보의 내용을 대표하는 주제를 찾아주자
- 문서집합 내부 정보로 모델링
- 주제는 숨어져 있는 latent한 요소
- Unsupervised & Clustering
관보의 내용을 연관된 산업을 찾아주자
- 산업이라는 외부의 정보를 가지고 있어야한다.
- 관보문서는 Classifier를 제작하는 feature를 제공한다.
- Supervised & Classification
17. Hypothesis : 숨겨진 패턴이 있을 것이다!
Government
- Department
Industry
Unfounded Pattern
User input
UserGwanbo
Industry
Definition
Topic
23. Data Representation : 우리의 관보를 표현해보자
문단 안에 문장
(word Sentence)
문서 안에는 문단
(word Sentence)
문장안에 어절
(word phrase)
24. Data Representation : 우리의 관보를 표현해보자
그리고 어절 안에는 품사 ( part of speech )
한국어의 품사 체계는 5언 9품사로 되어있습니다.
품사란 단어를 문법적 성질의 공통성에 따라 몇 갈래로 묶어 놓은 것입니다.
https://ratsgo.github.io/korean%20linguistics/2017/04/21/wordclass/
25. 문서를 품사 단위로 쪼개 버리고!
선형 자료 구조에 단어들을 넣어서 문서를 표현하자!
26. 그런데 품사 단어를 그대로 넣으면, 정성적인 카테고리 데이터
정량화 시킬 순 없어?? 그러면 벡터로 표현이 되겠는데?
27. 단어에는 의미가 Mapping 되어있을테니
그러면 단어가 등장하면 문장 내에 의미가 생기겠군!
= 빈도(frequency)를 기반으로 정량화 시키자!
35. 준비사항 : 내가 처리하고 싶은 한글 문서의 list 형태
리스트 안에는 (문장 단위 or 문단 단위가 좋을 듯!)
36.
37. ' 도로법 시행령 을 개정하는 데에 있어, 그 개정이유와 주요내용을 국민에게 미리 알려 이에 대한 의견을 듣기 위하여 행정절차법 제41조에 따라 다음과 같
이 공고합니다. 2017년 3월 16일 국토교통부장관 도로법 시행령 일부개정령(안) 입법예고 1. 개정이유 도로법 제68조 도로점용료 감면조항에「영유아보육법」
제2조제3호에 따른 어린이집 또는「유아교 육법」제2조제2호에 따른 유치원(민간어린이집과 민간유치원)에 출입하기 위하여 통행로로 사용하는경우가 신설
되었기에 이에 대한 하위법령을 마련하고자 함2. 주요내용 가. 도로점용료 감면 대상 추가(안 제73조제3항제1호가목) ㅇ 도로법 제68조(점용료 징수의 제한)
제9호 “「영유아보육법」제2조제3호에 따른 어린이집 또는「유아교육법」제2조제2호에 따른 유치원에 출입하기 위하여 통행로로 사용하는 경우” 신설에 따른
하위법령 마련 나. 도로점용료에 대한 경과규정 명확화(안 부칙 제6조) ㅇ 영 제27751호 도로법 시행령 일부개정령안 부칙 제6조에서 규정한 도로점용료에
대한 경과규정을 명확하게 하여 행정업무상 혼란 예방 3. 의견제출 이 개정안에 대해 의견이 있는 기관 단체 또는 개인은 2017년 3월 20일까지 통합입법예
고센터 (http://opinion.lawmaking.go.kr)를 통하여 온라인으로 의견을 제출하시거나, 다음 사항을 기재한 의견서를 국토교통부장관에게 제출하여 주시기 바
랍니다. 가. 예고 사항에 대한 찬성 또는 반대 의견(반대 시 이유 명시) 나. 성명(기관ㆍ단체의 경우 기관ㆍ단체명과 대표자명), 주소 및 전화번호다. 그 밖의
참고 사항 등※ 제출의견 보내실 곳 - 일반우편 : (30103) 세종특별자치시 도움6로 11 국토교통부 도로운영과- 전자우편 : jwsuh@korea.kr- 전화 : 044-201-
3920 / 팩스 : 044-201-5591'
혹시라도 mongodb가 안 익숙한 분들을 위해
41. 목표는 문장을 대표하는 Keyword를 찾는 것!
문장의 의미를 이해하는데 필요 없는 요소들을 제거해 보자!
1. 숫자 & 특수문자 & 영어
42. 정규 표현식 : input을 문장을 요소로 하는 list형태의 문서로 받는다.
1. re.compile 을 이용하여 정규표현식( )을 컴파일하고 컴파일된 패턴객체를 제작
2. sub 메서드를 이용하면 정규식과 매치되는 문장 내 단어를st 공백 문자로 변환시킴.
3. String.strip() 매서드를 이용하여 문자열 양쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다.
4. 잘린 단어들을 다시 docs3라는 빈 list에 append 시켜주자.
https://wikidocs.net/4308
61. Term-document matrix로 문서를 표현해 보자!
음 아직 Categorical data인 단어와
그 단어의 list 로 구성된 문서
그 문서의 list형태야 (문서집합)
62. Term-document matrix로 문서를 표현해 보자!
음 아직 Categorical data인 단어와
그 단어의 list 로 구성된 문서
그 문서의 list형태야 (corpus, 말뭉치)
63. Term-document matrix로 문서를 표현해 보자!
Categorical data인 단어
단어가 품사단위로 쪼개져서,
혹은 너무 잘게 쪼개진 친구가 있지 않을까?
일반적인 연어collocation 에 대해서 처리를 못하지 않을까?
연어를 잡기 위한 단어 단위의 Bigram
64.
65. 품사 태깅에서 놓치게 되는 요소들을 잡아줍니다
빈번하게 같이 나오는 용어들을 하나로 묶어줍니다.
체언과 용언 사이의 관계가 명확한 것을 잡아줍시다.
66. 160799개 단어
(word - term)
사전으로 만들어주자
그런데 우리는 중복된 단어도 포함되어 있고
단어의 frequency도 파악을 못했구나!
67. Dictionary (token string – id int)
Doc1 = (1,1,1,1,0,1,1,0)
Doc2 = (1,2,1,1,0,1,0,1)
Vector Representation
Local Representation
Spare matrix
72. Save & Load Data
1289개 unique한 토큰이 (단어)
202개의 문서에 존재한다. (문서)
0번째 문서를 조회했을 때,
0이라는 단어는 이 문서에 1번
1이라는 단어는 이 문서에 2번
2이라는 단어는 이 문서에 3번
3이라는 단어는 이 문서에 1번
4이라는 단어는 이 문서에 1번 등장함
74. Ideation : Keyword Tagging
관보의 내용을 대표하는 주제를 찾아주자
- 문서집합 내부 정보로 모델링
- 주제는 숨어져 있는 latent한 요소
- Unsupervised & Clustering
여태까지는 단어, 문서를 표현하는 방식을 이야기했었다.
그렇다면 문헌집단을 표현하는 방법이 무엇이 있을까?
왜? 문헌집단의 관점에서 개별 문서를 본다면,
전체와 개별자의 관계를 나타낼 수 있을 것이다.
75. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
Assumption
문헌을 여러 개의 주제를 포함할 수 있다.
주제에는 여러 개의 단어가 포함될 수 있다.
문헌에 사용된 단어 하나하나는 어떤 주제에 포함된다.
글을 쓰는 과정
1. 먼저 문헌에 어떤 주제들이 들어갈지를 대략 생각해 놓는다. (문헌의 주제 분포 결정)
2. 주제들 중에서 하나를 고른다. (주제 선정)
3. 주제들에 포함된 단어들 중에서 하나를 고른다. (단어 선정)
4. 그 단어를 문헌에 추가한다.
5. 2로 돌아가 반복
76. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
문헌의 수 주제의 수
문헌에 속한 단어의 수
φ: 주제의 단어 분포 (topic-term)
(총 φ1~φK까지 K개의 단어 분포가 있을 겁니다)
θ: 문서의 주제 분포 (doc-topic)
(총 θ1~θd까지 D개의 주제 분포가 있겠죠.)
Z : 단어의 주제 분포 (term-topic)
( d문서의 n 번째 단어가 n개의 주제 분포가 있을 것입니다)
77. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
확률 생성 모형 (Generative Model)
특정 확률 분포와 그 파라미터가 있다고 가정할때,
특정한 Process에 의해서 데이터를 생성한다.
LDA
이미 관찰된 단어를 가지고, 단어가 주어졌을때,
주제가 assign될 확률을 계산하고,
전체 데이터에 대해
이때 P(Z|W)를 극대화 시키는 Z 를 찾는 과정
Z를 알면 나머지 θ, φ 는 찾기 쉽지!
83. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
문헌의 수 주제의 수
문헌에 속한 단어의 수
φ: 주제의 단어 분포 (topic-term)
(총 φ1~φK까지 K개의 단어 분포가 있을 겁니다)
θ: 문서의 주제 분포 (doc-topic)
(총 θ1~θd까지 D개의 주제 분포가 있겠죠.)
Z : 단어의 주제 분포 (term-topic)
( d문서의 n 번째 단어가 n개의 주제 분포가 있을 것입니다)
84. φ: 주제의 단어 분포 (topic-term)
주제 별 어떤 단어가 등장할 확률!
근데 하나의 주제만 볼 수 없을까?
85. φ: 주제의 단어 분포 (topic-term)
하나의 주제에 대해서 등장 확률이 높은 단어의 ID
ID값이 계산 효율은 좋은 건 알지만, 뭔지 궁금해!
86. φ: 주제의 단어 분포 (topic-term)
Print_topics는
주제 – 확률 – 단어
셋다 알려준다.
좀더 좋은 시각화는 없을까?
87. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
도로교통부의
건축과 관련된 주제구나
주제에 대한 해석은 사람이 추측해야한다!
도메인 지식이 필요한 이유!
도로 교통부 공무원과 코워킹하면 좋겠다,,,, 건축가나,,,
내가 잘하는건지,,, 에라이
88. 더 정확히는 토픽이 주어졌을때 단어가 발생할 확률인 P(w|t)
1. salience P(w|t)
한 토픽의 키워드라면, 각 토픽에 속한 많은 문서들에서 등장해야 합
니다. 즉 P(w|t) 가 커야 합니다.
2. Discriminative power
하지만 그러면 너무 일반적인 단어들이 많이 등장하게 되겠죠
때문에 토픽 대비 자주 등장한다면 그 중요도를 낮추겠다는
패널티를 P(w|t)를 P(w)로 나누면서 적용했습니다. (IDF)
그리고 빈출단어와 특수단어를 나누는 것이 바로 Lamdba
https://lovit.github.io/nlp/2018/09/27/pyldavis_lda/
89. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
도로교통부의
건축과 관련된 주제구나
좀더 주제에 속하면서 관보 개별 문서에
특수단어들이 나오게 된다
Estimated term frequency within the selected topic
이 올라 가는 걸 확인할 수 있다.
90. 그래 그러면 이제 문헌집단 전체의 관점이 아니라
문서 개별의 관점에서 LDA를 보자!
91. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
문헌의 수 주제의 수
문헌에 속한 단어의 수
φ: 주제의 단어 분포 (topic-term)
(총 φ1~φK까지 K개의 단어 분포가 있을 겁니다)
θ: 문서의 주제 분포 (doc-topic)
(총 θ1~θd까지 D개의 주제 분포가 있겠죠.)
Z : 단어의 주제 분포 (term-topic)
( d문서의 n 번째 단어가 n개의 주제 분포가 있을 것입니다)
96. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
문헌의 수 주제의 수
문헌에 속한 단어의 수
φ: 주제의 단어 분포 (topic-term)
(총 φ1~φK까지 K개의 단어 분포가 있을 겁니다)
θ: 문서의 주제 분포 (doc-topic)
(총 θ1~θd까지 D개의 주제 분포가 있겠죠.)
Z : 단어의 주제 분포 (term-topic)
( d문서의 n 번째 단어가 n개의 주제 분포가 있을 것입니다)
97. Z : 단어의 주제 분포 (term-topic)
( d문서의 n 번째 단어가 n개의 주제 분포가 있을 것입니다)
도로가 mapping된 ID값은 60입니다.
98. Z : 단어의 주제 분포 (term-topic)
( d문서의 n 번째 단어가 n개의 주제 분포가 있을 것입니다)
도로라는 term은 2번 토픽에
가장 빈번하게 등장하는 군요!
108. 관보의 내용을 대표하는 주제를 찾아주자
- 문서집합 내부 정보로 모델링
- 주제는 숨어져 있는 latent한 요소
- Unsupervised & Clustering
우리가 궁금한 것
= 주제 (를 대표하는 단어분포)
109. 잠재디리클레할당(Latent Dirichlet Allocation, LDA)
문헌의 수 주제의 수
문헌에 속한 단어의 수
φ: 주제의 단어 분포 (topic-term)
(총 φ1~φK까지 K개의 단어 분포가 있을 겁니다)
θ: 문서의 주제 분포 (doc-topic)
(총 θ1~θd까지 D개의 주제 분포가 있겠죠.)
Z : 단어의 주제 분포 (term-topic)
( d문서의 n 번째 단어가 n개의 주제 분포가 있을 것입니다)
119. 그러면
Goal : 문서 내 단어와, 주제를 대표하는 단어를
문서 내 assign된 주제의 확률로 관계를 만들어주자
1. Doc을 대표하는 확률이 높은 주제를 뽑는다. (doc-topic)
2. 확률이 높았던 주제에 대해서 단어 분포를 받는다. (topic-term)
3. 상위 확률 단어와, Doc에 있는 단어를 비교한다. (topic-term & doc-term)
4. 교집합을 문서의 index로 tagging
120.
121.
122.
123.
124. 이런
문제가 있다.
1. Doc을 대표하는 확률이 높은 주제를 뽑는다. (doc-topic)
2. 확률이 높았던 주제에 대해서 단어 분포를 받는다. (topic-term)
3. 상위 확률 단어와, Doc에 있는 단어를 비교한다. (topic-term & doc-term)
4. 교집합을 문서의 index로 tagging
125. φ: 주제의 단어 분포 (topic-term)
등장이 확률이 높다고
그 문서를 대표하는건 아니다
음 전체를 얼마나 잘
표현하는가? 일반적인가?
147. 마무리
• 문서 집합을 정량화 하는 방법을 살펴보았다.
• Gensim을 Dictionary객체를 만들어보고 Corpus로 문서를 표현해 보았다.
• Gensim을 통해 LDA객체를 만들어 보았고 모델 아키텍처를 데이터로 받아보았다.
• LDA 파라미터 튜닝 도전!
• LDA를 가지고 auto-tagging한번 해보았다.