3. 소개
텍스트앳: 카톡감정분석
진저: 사랑을 이해하는 인공지능
연애의 과학: 모든 연애의 답• 스캐터랩
• 연애 콘텐츠 및 인공지능(?) 회사
• 시리즈 B
• 사람들의 일상에 큰 영향을 미치는 연애를 도
와줍니다.
• 연애 관련 논문을 쉽게 풀어서 설명해줍
니다.
• 채팅 데이터를 분석해서 썸 혹은 연애를
과학적으로 분석해드립니다.
• 서비스를 통해 수집된 채팅 데이터를 통해 기
능을 수행하는 인공지능이 아닌 일상적인 대
화를 할 수 있는 인공지능을 개발 중입니다.
• 채팅 데이터 비식별화 조치
• 개인을 특정할 수 있는 정보(이름, 유저id 등)
는 저장하지 않습니다.
• 개인정보(이름, 전화번호, 계좌번호 등)이 포
함된 문장은 사용하지 않습니다.
!3
4. 발표 내용
• Intro
• 소개
• 자연어 처리의 어려움
• 한국어 자연어 처리의 어려움
• 커플 채팅 데이터의 어려움
• 한국어 자연어 처리
• Preprocessing
• Word Embedding
• Document Similarity
• 그 외
!4
6. 본격적으로 들어가기에 앞서
• 발표에서 다루는 내용
• 한국어 채팅 데이터를 다룬 경험
• 기본적으로 “상황” -> “문제" -> “해결” 의 형식을 따릅니다.
• “해결” 에서는 알고리즘에 대한 개념을 소개합니다.
• 머신러닝에 대한 기본 개념은 알고 있다고 가정합니다.
• 머신러닝 혹은 발표 주제와 관련된 키워드는 영어를 사용합니다.
• 발표에서 다루지 않는 내용
• 구체적인 수식과 알고리즘에 대한 자세한 설명은 하지 않습니다.
• 참고자료에 대한 링크는 공개합니다.
!6
7. 한국어 자연어 처리의 어려움 - 언어적 특성에 따른 어려움
• Hell조사
• 어떤 조사를 사용하느냐에 따라 문장의 뉘앙스가 달라집니다.
• 자유로운 언어의 변형
• 줄임말
• 쉬운 외국어 표현
• 유행어
• 말장난
<예시>
- 여자친구 있어?
- 여자친구는 있어? / 여자친구가 있어? 여자친구랑 있어?
<예시> 소확행, 성덕, 갑분띠 등
<예시> 더럽, 빼박캔트, 레알트루
<예시> 오지고 지리고 레릿고
<예시> 이런, 삼런, 사런, 오런
!7
8. • 혀 꼬인 소리
• 맞춤법 혹은 띄어쓰기
• 채팅에서만 할 수 있는 표현
한국어 자연어 처리의 어려움 - 커플 채팅 데이터의 어려움
<예시>
쟉이능 머해 / 알게떠 엽오 / 이제 모할꼬야? / 누워이또 / 나 잘해쪄? / 오구오구 그래쪄? /
울애긔 오디얌 빤니왕
<예시>
- 오구오구 잘햇당 잘햇어 (X) -> 오구오구 잘했다 잘했어 (O)
- 밥먹기전에 전화해줄까? (X) -> 밥 먹기 전에 전화해줄까? (O)
- 뭐할꺼야? (X) -> 뭐 할 거야? (O)
- 비온다 (X) -> 비 온다 (O)
<예시>
- 나 솢ㅜ ㅅ병 마셔써ㅓㅓ
- 아ㅏㅏㅏㅏㅏㅏㅏㅏ 힘드러ㅓㅓㅓㅓㅓㅓㅓㅓ
!8
9.
10. 한국어 자연어 처리의 어려움 - preprocess의 중요성
• Data Science의 격언
• Garbage in, Garbage out
• 너무나도 다양한 형태와 변형이 있기 때문에, 불필요한 정보를 날리고 정제하는 preprocess 과정
이 필수입니다.
• 그렇다면 어떤 식으로 preprocess 해야할까요?
!10
12. Preprocessing - 형태소 분석기
• 형태소 분석기
• 일반적으로 한국어 데이터 preprocess를 위해서 사용하는 툴은 형태소 분석기(POS1 tagger)
입니다.
• 형태소: 의미를 가지는 최소 단위
• 파이썬에서 가장 많이 사용하는 라이브러리는 KoNLPy2
• 한국어 정보처리를 위한 파이썬 패키지
• 꼬꼬마, 트위터, 한나눔 등 형태소 분석기
1) POS: Part of speech
2) http://konlpy-ko.readthedocs.io/ko/v0.4.3/
!12
13. Preprocessing - 형태소 분석기 사용 예시(꼬꼬마)
• 자기 너무 보고싶다. 언제 만날까?
• 자기_NP 너무_MAG 보_VV 고_ECE
싶_VXA 다_EFN ._SF 언제_MAG
만나_VV ㄹ까_EFQ ?_SF
• 우리 영원히 사랑하자
• 우리_NP 영원히_MAG 사랑_NNG
하_XSV 자_ECE
• 점심 맛있게 먹어요. 다 먹고 연락해
• 점심_NNG 맛있_VA 게_ECD 먹_VV
어요_EFN ._SF 다_MAG 먹_VV
고_ECE 연락_NNG 하_XSV 어_ECS
<원문> <형태소 분석>
!13
17. Preprocessing - 형태소 분석기
• 잘 안되는 이유
• 형태소 분석기 학습에 사용된 데이터(말뭉치, corpus)의 단어 분포가 채팅 데이터의 단어분포
와 다름
• 말뭉치(corpus)
• 자연어 연구를 위해 특정한 목적을 가지고 언어의 표본을 추출한 집합
!17
출처: https://ko.wikipedia.org/wiki/말뭉치
18. Preprocessing - 형태소 분석기
• Sejong Corpus
• National Institute of the Korean Language, 1998-2007.
• 채팅데이터에 비해 아주 예쁘고 잘 정제된 형태의 데이터
• 온실 속의 화초에서 키운 애를 야생에 던져놓았으니 살아남을 리가 있나 (..)
!18
출처: https://ithub.korean.go.kr/user/guide/corpus/guide1.do
19. • 모든 데이터를 합리적인 기준으로 패턴을 찾고 그 패턴으로 preprocess
• 일종의 normalize(표준화)
• 이 원칙을 바탕으로 preprocessing
• 채팅 데이터에는 문법에 맞지 않는 데이터가 많으니까
• 문법적 요소를 제외한 방식의 tokenizing
<예시>
만약 count(“어디야”) < count(“오디야?”)이면, “오디야”는 문법적으로 틀린 표현이지만 기준으로 삼을 수 있다.
Preprocessing - 형태소 분석기 대안
!19
20. Preprocessing - Tokenizing
• Tokenizing: 여러 단어로 이루어진 문장 혹은 어절에서 단어를 구분하는 것
• 영어의 경우에는 띄어쓰기 단위로 token이 나뉘어지지만, 한국어는 그렇지 않음.
• 형태소가 의미를 가진 최소의 단위라면, token은 의미를 가진 실질 단위
• “의미를 가진 실질 단위”를 “단어”라고 생각한다면 tokenizing 문제는 문장에서 단어를 추출하는
문제로 생각할 수 있습니다.
!20
<예시>
before tokenizing:
제철에 수확한 국산 유기농 양배추와 브로콜리를 엄선하고 국산 사과즙을 더해 맛있는 유기가공식품 인증제품입
니다.
after tokenizing:
제철 / 에 / 수확 / 한 / 국산 / 유기농 / 양배추 / 와 / 브로콜리 / 를 / 엄선 / 하고 / 국산 / 사과즙 / 을 /더해 / 맛있
는 / 유기가공식품 / 인증 /제품 / 입니다.
21. • 가정
• 연속된 글자의 연관성이 높을 수록 단어일 가능성이 높음
• c1c2..cn-1 다음에 cn이 많이나온다면 문자열 c1..cn은 단어일 것
• 공식
Preprocessing - Tokenizing(Cohesion Probability)
!21
<예시>
“빅데이” 라는 연속된 글자 다음에 “터”라는 글자가 나타나는게 가장 자연스럽다.
출처: https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/05/05/cohesion/
23. Preprocessing - Tokenizing
• 단어를 추출하는 방법은 Cohesion probability 외에 다른 방법들도 있습니다.
• 구체적인 이론과 코드는 다음 자료를 참고해주세요.
• [파이콘 2017] 노가다 없는 텍스트 분석을 위한 한국어 NLP - 김현중
• 이론
• https://www.slideshare.net/kimhyunjoonglovit/pycon2017-koreannlp
• 코드
• https://github.com/lovit/soynlp
!23
25. Word Embedding - Word2Vec
• 단어 정보를 이용하여 머신러닝을 하려면 단어를 vector로 변환해주어야 합니다.
• 이를 word embedding 또는 word representation이라고 합니다.
• 가장 대표적인 알고리즘은 word2vec
• You shall know a word by the company it keeps (Firth, J. R. 1957:11)
!25
26. Word Embedding - Word2Vec의 한계
• word2vec은 이론도 간단하고 공개되어 있는 패키지가 많아서 이용이 간단하지만 OOV 문제가
있습니다.
• OOV(Out-of-vocabulary): 데이터에 포함되어 있지 않은 (=dictionary에 없는) vocabulary
는 vector로 나타낼 수 없는 문제
• training 단계에서는 모델의 input으로 들어가는 vocabulary를 통제하기 때문에 OOV 문제가 생
기기 어렵지만, inference 단계에서는 충분히 생길 수 있습니다.
• inference 단계: 모델을 서비스에 실제로 적용하는 단계
• 커플간의 채팅은 의도적으로든 실수로든 오타를 많이 내서 사전에 없는 단어가 만들어질 확률
이 높음
• 채팅데이터는 다른 텍스트데이터(뉴스, 문학작품 등)에 비해 한 문서당 단어의 수가 적기 때문
에, dictionary에 없는 단어가 하나라도 들어오면 큰 문제가 발생할 수 있습니다.
!26
27. • word2vec과 비슷한 원리이나 두 단어간의 점수를 측정하는 부분이 다름
• word2vec:
•
• fasttext:
• where the set of n grams appearing in w
• 단어 내부의 subword를 이용하는 방식
Word Embedding - Fasttext
!27
<예시>
w: Alpaca
n grams of w (n=3) = <Al, Alp, lpa, pac, aca, ca>
출처: Bojanowski, P., Grave, E., Joulin, A., & Mikolov, T. (2016). Enriching word vectors with subword information. arXiv preprint arXiv:
1607.04606.
28. Word Embedding - Fasttext + 한국어
• 한국어 데이터에 fasttext를 적용하는 방법은 두 가지가 있습니다.
• 글자(character) 단위의 subword를 사용하는 방법
• 자모 단위의 subword를 사용하는 방법
• 글자 단위보다 자모 단위가 더 작으므로, OOV 문제에 대해 더 유연하게 대처할 수 있습니다.
!28
<예시>
subwords(미세먼지는) = <미세, 미세먼, 세먼지, 먼지는, 지는>
<예시>
미세먼지는 = ㅁㅣ_ㅅㅔ_ㅁㅓㄴㅈㅣ_ㄴㅡㄴ
subwords(미세먼지는) = <ㅁㅣ, ㅁㅣ_, ㅣ_ㅅ, …, ㄴㅡㄴ>
30. Word Embedding - Fasttext
• 자세한 이론과 코드는 다음을 참고해주세요
• 이론
• Bojanowski, P., Grave, E., Joulin, A., & Mikolov, T. (2016). Enriching word
vectors with subword information. arXiv preprint arXiv:1607.04606.
• 코드
• https://github.com/facebookresearch/fastText
• https://radimrehurek.com/gensim/models/fasttext.html
• https://github.com/summatic/hangul_jamo_fasttext
!30
32. Setence Similarity
• 자연어 처리 분야서 주로 다루는 문제 중 하나는 서로 다른 두 document간의 유사도를 비교하는
문제입니다.
• 커플 채팅데이터가 일반적인 document와 다른점은 short sentence라는 점입니다.
• 가장 쉽게 비교할 수 있는 방법은 word embedding과 같이 문장을 vector로 embedding해서
cosine similarity를 이용하는 방법입니다.
!32
<예시>
sim(우리 여보는 어디야, 자기 어디까지 왔어?)
33.
34. Sentence Similarity - BOW + Word Embedding
• 문장에 있는 모든 word의 vector를 단순히 더하는 방식의 방법
• doc2vec도 포함합니다
• word embedding의 성능에 큰 영향을 받습니다
• 그렇다면 word embedding은 신뢰할 수 있을까요?
• 채팅 데이터에서 학습시킨 word embedding 중 이상한 결과들
• 유사한 단어 != 뜻이 비슷한 단어
!34
- similarity(춥다, 덥다) = 0.9011
- similarity(일찍, 늦게) = 0.8839
- similarity(흰색, 검은색) = 0.9707
35. Sentence Similarity - RNN
• 자연어 처리 관련 딥러닝 모델은 sentence embedding을 위해 RNN 계열의 모델(LSTM, Bi-
RNN, GRU 등)을 많이 씁니다.
• RNN의 본질은 language modeling
• “반갑습니다 캠퍼스 서울입니다.” <-> “반습갑니다 캠퍼스 서울니입다” 중 어떤 문장이 더 말
이 되는지를 판단
• 주어진 sequence에서 다음에 올 단어 혹은 글자를 예측하는 방향으로 embedding이 된다.
• 그래서.. “우리 언제볼까”와 “어디까지 왔어”가 비슷하게 embedding 되는 경향이 있습니다.
• 두 문장 모두 다음에 올 글자는 “?”
!35
36. Sentence Similarity - Term vector
• 문장 혹은 문서를 vector로 표현할 때는 embedding 알고리즘 혹은 모델이 의도하는 방향으로
embedding이 됩니다.
• 애매하게 embedding할 바에 term vector로 표현
• one hot encoding이랑 같은 방법이라고 생각하시면 됩니다.
• term vector로 표현을 하고 나면 cosine similarity, edit distance 등으로 두 문장의 유사도를
비교할 수 있습니다.
!36
<예시>
- I love you, you love me
- {“I”: 1, “love”: 2, “you”: 2, “me”: 1}
37.
38. Sentence Similarity - Term vector
• term vector로 채팅 데이터를 나타냈을 때 발생하는 문제점
• 단어의 변화에 너무 민감. 특히 짧은 문장이 많은 채팅 데이터일수록 문제가 생길 여지가 많음
• 단어의 의미정보를 이용할 수 없음
• pair1의 유사도가 pair2의 유사도보다 더 커야할 것 같지 않나요?
!38
<예시>
pair1: I love you <-> I like you
pair2: I love you <-> I hate you
39. Sentence Similarity - ESA Similarity
• ESA: Explicit Semantic Analysis
• 명시적인 정보(=word vector)를 이용하자
• cosine similarity
• ESA similarity
!39
I love you
I like you
similarity I love you
I 1 0.2 0.5
like 0.3 0.9 0.4
you 0.5 0.4 1
1 0.9 1
40. Sentence Similarity - ESA Similarity
• ESA: Explicit Semantic Analysis
• 명시적인 정보(=word vector)를 이용하자
• cosine similarity
• ESA similarity
!40
I love you
I hate you
similarity I love you
I 1 0.2 0.5
hate 0.3 0.5 0.4
you 0.5 0.4 1
1 0.5 1
41. Sentence Similarity - ESA Similarity
• ESA: Explicit Semantic Analysis
• I love you와의 유사도 비교
• 유의미한 차이를 만들어 낼 수 있습니다.
!41
I like you I hate you
cosine 0.667 0.667
ESA 0.967 0.833
42. Sentence Similarity - ESA Similarity
• 구체적인 이론과 코드는 다음 자료를 참고해주세요.
• 이론
• Song, Y., & Roth, D. (2015). Unsupervised sparse vector densification for short
text similarity. In Proceedings of the 2015 Conference of the North American
Chapter of the Association for Computational Linguistics: Human Language
Technologies (pp. 1275-1280).
• 코드
• (작업중)
!42
44. 그 외 자잘한 팁
• 한국어 자연어 처리는 preprocessing가 80% 이상
• Zipf’s law
• corpus에서 나타나는 단어들을 사용빈도 순으로 나열한다면, 사용빈도와 해당 단어의 수는 반
비례한다
• (문제마다 다르겠지만) 데이터의 모든 단어를 이용할 필요는 없음. 빈도수가 적은 단어는 과감
히 쳐내자
• 문제 정의를 잘 하는것이 모델을 구현하는 것보다 훨씬 중요
• 현실에서 마주하는 문제는 복합적인 요소들이 작용
• 기술적으로 뛰어난 모델을 적용하는 것도 좋지만, 간단한 통계 혹은 count based 모델을 사용
하는 것이 효과적일수도 있다
• unlabeled data에 직접 label을 달아보자
• label을 달다가 보면 뜻밖의 insight를 얻기도 함
!44