기초 개념
Language understanding
NLU (Neural Language Understanding)는 작성된 텍스트의 의미를 이해하는 것입니다. 즉, 텍스트를 의미 형태로 변환하는 것입니다. named-entity recognition, question answering, sentiment analysis 등이 있습니다.
NLG (Neural Language Generating)은 특정한 입력을 조건으로 해서 텍스트를 생성하는 것입니다. 즉 의미 형태로 되어 있는 vector 등을 텍스트로 변환합니다. machine translation, conversational response generation 등이 있습니다.
Language Model
Language Model은 단어 시퀀스에 대한 확률 분포를 의미합니다. 즉, k개의 단어 배열이 나왔을 때, 실제로 그런 배열이 나올 확률을 의미합니다.
- $P(I, am, a, boy) = 0.001$
- $P(I, a, boy, am) = 0.00000001$
동시 확률 $P(w_1, ..., w_m)$ 은 사후 확률을 이용하여 분해하면,
$P(w_1, ..., w_m) = P(w_m | w_1, ..., w_(m-1)P(w_(m-1)|w_1, ..., w_(m-2)) ... P(w_3|w_1, w_2)P(w_2|w_1)P(w_1)$
Language Model은, 동시에 바라보는 단어 개수에 따라 unigram model과 n-gram model로 나눌 수 있습니다. unigram model은 단어 시퀀스의 확률을 계산할 때 단순히 각각의 단어가 나올 확률을 곱해서 계산합니다. n-gram model은 단어 시퀀스 확률을 계산할 때, 앞에 n-1개의 단어 시퀀스가 나올 때 그 다음에 나온 단어가 나올 확률의 곱으로 계산합니다.
language model은 문장의 자연스러움을 숫자로 나타낼 수 있기 때문에, 기계 번역이나 음성 인식, 새로운 문장 생성 등에 활용할 수 있습니다. 음성 인식을 예로 들면, 여러 개 후보 문장에서 language model을 이용해 가장 자연스러운 문장을 선택할 수 있습니다.
일반적으로 unigram model이나 2-gram model을 사용합니다. n-gram model에서 한 번에 바라보는 단어 개수가 늘어나면 데이터의 양이 지수적으로 증가하기 때문입니다. 경우의 수가 너무 많아져서 model이 학습하지 못한 단어의 쌍도 나오게 됩니다.
TF-IDF
TF-IDF(Term Frequency-Inverse Document Frequency)는, 문서 내에서 가장 비중있는 단어가 무엇인지 나타내는 지표입니다. 특정 term이 한 문서에서 많이 나오지만, 그 term이 나오는 문서 수는 적을수록 값이 큽니다. 여러 문서에서 골고루 나오는 단어(예: 있습니다, 입니다)는 별 의미가 없다고 보고, 한 문서에서만 많이 나오는 단어(예: 키워드, 전문 용어, 고유 명사 등)는 의미가 많다고 봅니다.
TF-IDF는 TF(Term Frequency)와 IDF(Inverse Frequency)의 곱으로 나타냅니다.
- TF (Term Frequency): 문서 내에 특정 단어가 나오는 빈도수. 빈도수가 클수록 값이 커집니다.
- IDF(Inverse Frequency): 특정 단어가 나온 문서 개수의 역수. 특정 단어가 나온 문서 수가 적을수록 값이 작아집니다.
TF-IDF 값이 큰 단어는 그 문서에서 중요한 단어라고 볼 수 있습니다.
- 언론사가 알아야 할 알고리즘③ TF-IDF
- TFIDF – Term Frequency Inverse Document Frequency: tf-idf 개념을 설명하는 한글 문서.
- TF-IDF에 대한 이해 - TFIDF 유사도 구하기
Naive Bayes Classifier
Bayes Theorem은 아래와 같이 사전 확률과 사후 확률을 서로 바꿨을 때 확률을 계산하는 공식입니다.
$P(A|B) = P(B|A)P(A) / P(B)$
텍스트 분석 모델
TextCNN
Seq2CNN
SyntaxNet
논문 링크: https://arxiv.org/abs/1603.06042
자연어를 컴퓨터가 이해할 수 있게 하는 것을 목표로, 문장을 파싱하여 단어 간의 관계를 트리 형태로 내놓는 모델입니다. 2016년에 Google이 만들었습니다.
Attention Mechanism
응용
문장 분류
- 네이버 영화 리뷰 감정 분석: gensim 라이브러리를 이용해서 Doc2Vec + CNN으로 영화 리뷰가 긍정적인지 부정적인지 판단하는 예제
- hoho0443/classify_comment_emotion: Naive Bayes Classifier나 Doc2Vec을 이용하여 리뷰를 긍정, 부정으로 분류하는 예제 (한국어)
- 한국어와 NLTK, Gensim의 만남 - PyCon KR 2015: nltk, gensim 라이브러리로 단어를 vector화하고 문장을 분류/군집화 하는 예제
- 추천시스템이 word2vec을 만났을때 - PyCon KR 2015: word2vec 등으로 영화 추천 시스템을 만드는 예제
기계 번역
- tensorflow/nmt:TensorFlow Neural Machine Translation Tutorial
기계 번역에서 원본 언어를 "입력 문장"으로, 번역된 언어를 "대답 문장"으로 대응하여 학습을 시키면 간단한 챗봇을 만들 수 있습니다.
*[Deep Learning] seq2seq 를 이용한 챗봇 (Neural Machine Chatbot): tensorflow/nmt를 기반으로 챗봇을 만든 예제
한국어 자연어 처리
- 한국어 문법 짚고 넘어가기: link
주의점
영어와 달리 한국어는 같은 어근을 여러 형태로 나타낼 수 있어, 형태소 분석이 필요할 수 있습니다. (예: 바꾸다, 바꾸니, 바꿔, 바꿉니다, ...) TextCNN 같은 경우 형태소 분석 결과를 이용하기도 하나, BERT 이후에는 통계 기반의 Tokenizer도 사용하기도 합니다.
형태소 분석기 종류는 아래와 같다.
- KoNLPy (Python): Java로 된 형태소 분석기를 Python에서 쓸 수 있도록 wrapping
- 꼬꼬마 한글 형태소 분석기 (Java)
한국어 말뭉치
한국어 말뭉치란 한국어로 된 말이나 글을 모아, 문장, 어절, 형태소 별로 분석한 데이터를 의미합니다. 자연어 처리의 기본이 되는 데이터이다. 주요 말뭉치로는 아래와 같은 것이 있습니다.
문자 단위 인코딩
사용하면 좋은 경우
- 문법적인 의미를 추출할 때
- 개체명 인식, 품사 분석 등
- 문법적인 의미는 단어 전체가 일치하지 않더라도 일부 글자만 일치해도 추출할 수 있음
- 예) '공부한다'가 '무엇을 하는 것'이라는 의미를 담고 있다면, '학습한다' 등 '한다'가 공통될 경우 모두 '무엇을 하는 것'이라는 것을 유추할 수 있음.
- 모르는 단어를 벡터로 인코딩해야 할 때
참고자료
- 인공지능 씨앗 한글 말뭉치, 2007년 멈춰선 까닭: 말뭉치 개념 소개
'활용 > NLP' 카테고리의 다른 글
TextCNN (0) | 2020.04.12 |
---|---|
Word2vec 만들어보기 (0) | 2020.04.12 |
Word2vec (0) | 2020.04.12 |
Text Embedding (0) | 2020.04.12 |