02. 텍스트 전처리(Text Preprocessing)
- 용도에 맞게 text를 사전처리 하는 작업
- 토큰화(tokenization), 정제(cleaning), 정규화(normalization)
1. 토큰화(Tokenization)
- corpus(말뭉치)는 자연언어 연구를 위해 특정한 목적을 가지고 언어의 표본을 추출한 집합
- 주어진 corpus에서 token 단위로 나누는 작업, 상황에 따라 다르지만 보통 의미있는 단위로 token 정의
- module: nltk.tokenize, tensorflow.keras.processing.text
1. 단언 토큰화(Word Tokenization)
- nltk.tokenize
- word_tokenize
- WordPunctTokenizer
- TreebankWordTokenizer
- tensorflow.keras.processing.text.text_to_word_sequence
- token 기준을 단어로 하는 경우, 단어는 단어 단위 외에도 단어구, 의미를 갖는 문자열로 간주되기도 함
2. 토큰화 중 생기는 선택의 순간
3. 토근화에서 고려해야 할 사항
- 구두점이나 특수문자를 단순 제외해서는 안됨
- 줄임말과 단어내 띄어스기가 있는 경우
4. 문장 토큰화(Sentence Tokenization)
- 문장(sentence) 단위로 token화. 문장 분류(sentence segmentation)이라고도 함
- nltk.tokenize
- sent_tokenize
- kss
5. 이진 분류기(Binary Classifier)
- 예외사항을 발생키니는 온점의 처리를 위해서 입력에 따라 두개의 class로 분류하는 이진 분류기 사용
6. 한국어에서의 토큰화 어려움
- 영어 띄어쓰기 기준으로 하는 띄어쓰기 token화를 해도 단어 token화가 잘 동작함
- 어절: 한국어에서의 띄어쓰기 단위
- 한국어에서는 영어와 달리 어절 token화를 지양 => 어절 token화와 단어 tonken화가 같지 않음
1. 한국어는 교착어
- 형태소(morpheme): 뜻을 가진 가장 작은 말의 단위
- 자립 형태소
- 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소
- 그 자체로 단어가 됨
- 체언(명사, 대명사, 수사), 수식언(관형사, 부사), 감탄사 등
- 의존 형태소
- 다른 형태소와 결합하여 사용되는 형태소
- 접사, 어미, 조사, 어간
- 한국어에서 영어의 단어 token화와 유사한 형태를 얻으려면 어절 token화가 아닌 형태소 token화를 수행해야함
2. 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않음
- 한국어는 띄어쓰기를 지키지 않아독 글을 쉽게 이해할 수 있음
- 한국어:모아쓰기 방식, 영어:풀어쓰기 방식
7. 품사 태깅(Part-of-speech tagging)
- 단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 보는 것도 주요 지표가 될 수 있음
- nltk.tag
- pos_tag
- konlpy.tag
- Okt
- Kkma
2. 정제(Cleaning)와 정규화(Normalization)
- token화 작업 전,후 처리
- 정제(cleaning): 갖고 있는 corpus로부터 noise data를 제거
- 정규화(normalization): 표현 방법이 다른 단어들을 통합시켜 같은 단어로 만듦
- 정제와 정규화 기법
1. 규칙에 기반한 표기가 다른 단어들의 통합
- ex: US, USA
- 어간 추출(stemming), 표제어 추출(lemmatization) 사용하여 통합시켜
2. 대,소문자 통합 -
3. 불필요한 단어의 제거(Removing Unnecessary Words)
- noise data: 아무 의미도 갖지않는 글자들, 분석 목적에 맞지 않는 단어들
1. 불용어 제거
2. 등장 빈도가 적은 단어(Removing Rare words)
3. 길이가 짧은 단어(Removing words with very a short length)
4. 정규 표현식(Regular Expression)
- ex) html tag 제거시
3. 어간 추출(Stemming) and 표제어 추출(Lemmatization)
- 정규화 기법
- 형태학(morphology)이란 형태소로부터 단어를 만들어가는 학문
- 형태소
-어간(stem)
-단어의 의미를 닫고 있는 핵심부분
-접사(affix)
-단어에 추가적인 의미를 부여하는 부분
-형태학적 parsing
-형태소에서 어간과 접사를 분리하는 작업 ex) cats -> cat(어간) + s(접사)
- 단어의 빈도수를 기반으로 문제를 풀고자하는 BoW(Bag of Word)표현을 사용하는 자연어 처리에서 주로 사용함
1. 표제어 추출(Lemmatization)
- 표제어(lemma): 표제어 또는 기본 사전형 단어, 표체어 추출은 딘어로부터 표제어를 찾아가는 과정
- 단어의 품사 보존(POS tag 보존)
- 단어들이 다른 형태를 가지더라도 그 뿌리 단어를 찾아서 단어의 개수를 줄일 수 있는지 판단 ex) am, are, is -> be(표제어)
- nltk.stem
- WordNetLemmatizer
- ex)
- am -> be, the going -> the going, having -> have
2. 어간추출(Stemming)
- 형태학적 분석의 단순화 version. 섬세한 작업이 아니므로 사전에 존재하지 않는 단어일 수 있음
- 단어의 품사 미보존(POS tag 미보존) => 사전에 존재하지 않는 단어일 수 있음
- 일반적으로 표제어 추출보다 빠름
- nltk.step
- PorterStemmer
- LancasterStemmer
- ex)
- am -> am, the going -> the go, having -> have
3. 한국어에서으 어간 추출
- 한국어 5언 9품사
-체언(명사, 대명사, 수사), 수식언(관형사, 부사), 관계언(조사), 독립언(감탄사), 용언(동사, 형용사)
- 용언은 어간(stem)과 어미(ending)으로 구성
- 어간(stem)
- 용언 활용시 원칙적으로 모양이 변하지 않는 부분 (때론 바뀔 수 있음. ex: 긋다, 긋고, 그어서, 그어라)
- 활용에서 어미의 선행부분
- 어미(ending)
- 용언의 어간뒤에 붙어서 활용시 변하는 부분
- 여러 문법적 기능 수행
- 활용(conjugatio)
- 한국어뿐 아니라, 인도유럽어에서 주로 볼수 있는 언어적 특징
- 활용은 어간(stem)과 어미(ending)을 가지는 것
- 규칙활용
- 어간이 어미를 취할때 어간의 모습이 일정
- ex) 잡/어간 + 다/어미
- 불규칙 활용
- 어간이 어미를 취할때 어간의 모습이 바꾸거나 취하는 어미가 특수한 어미인 경우
- ex)
- 어간의 모습이 바뀌는 경우: ‘듣-, 돕-, 곱-, 잇-, 오르-, 노랗-’ -> ‘듣/들-, 돕/도우-, 곱/고우-, 잇/이-, 올/올-, 노랗/노라-’
- 특수한 어미를 취하는 경우: ‘오르+ 아/어→올라, 하+아/어→하여, 이르+아/어→이르러, 푸르+아/어→푸르러’
4. 불용어(Stopword)
- Data에서 유의미한 단어 token만을 선별하기 위해 무의미(자주 등장하지만 분석에 큰 도움이 되지 않은 단어 )한 token제거
- nltk.corpus
- stopwords
- 한국어에서 불용어 제거하기
5. 정수 인코딩(Integer Encoding)
- computer 인식을 위해 자연어 처리에서 text를 숫자로 바꾸는 기법
- text를 숫자로 바꾸는 것은 본격적으로 자연어 처리 작업에 들어간단느 의미이므로, 단어가 text일때 할 수 있는 최대한의 전처리를 끝내놔야 합
1. 정수 encoding(Integer Encoding)
- dictionary 사용하기
- data -> 문장 tokenization -> 단어 tokenization / cleaning -> token별 빈도수 dictionary 생성(vocab) -> 빈도수가 높은 순으로 정렬 -> 빈도수가 높은 token에 낮은 index 부여 및 빈도수가 낮은 token제거(word_to_index) -> 단어 tokenization / cleaning data에 대한 word_to_index값 부여(없는 값은 OOV(Out-Of-Vocabulary))
- Counter 사용하기
- collections.Counter
- NLTK의 FreqDist 사용하기
- nltk.FreqDist
2. 케라스(Keras)의 text 전처리
- tensorflow.keras.processing.text.Tokenizer
- 때로 text의 정수 encoding을 위해 사용함
6. 원-핫 인코딩(One-hot encoding)
- 문자를 숫자로 바꾸는 많은 기법 중에서 가장 기본적인 표현방법
- vocabulary: 서로 다른 단어들의 집합, book과 books은 다른 단어로 간주
1. 원-핫 인코딩(One-hot encoding)이란?
- 단어 집합 크기를 vector의 차원으로하고 표현하고 싶은 단어의 index에 1, 다른 index에는 0을 부여하는 표현방식
- 과정: 각 단어에 고유한 index를 부여함(정수 encoding) -> 표현하고 싶은 단어의 index에 1, 다른 index에는 0을 부여
2. 케라스(Keras)를 이용한 원-핫 인코딩(One-hot encoding)
- tensorflow.keras.utils.to_categorical
3. 원-핫 인코딩(One-hot encoding)의 한계
- 단어의 개수가 늘어날수록, vector 를 저장하기 위한 공간이 계속 늘어남 => vector의 차원이 계속 늘어남
- 단어이 유사도를 표현하지 못함
- 이런 단점을 해결하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 vector화 하는 기법이 크게 두 가지 존재
- Count 기반 vector화: LSA, HAL
- 예측 기반 vector화: NNLM, RNNLM, Word2Vec, FastText
- Count 기반 + 예측 기반 vector화: GloVe
7. 단어 분리하기(Byte Pair Encoding, BPE)
- Machine Learning을 이용한 자연어 처리 목표는 기계가 사람 이상의 성능을 내는것
- OOV 문제: 기계가 training 단계에서 단어집합(vocabulary)에 없는 모르는 단어(OOV: Out Out-Of-Vocabulary or UNK: Unknown)가 있는 경우 문제를 풀지 못하는 상황
- 단어 분리(Subword segmentation): 하나의 단어는 (단어보다 작은 단위의) 의미있는 여러 내부 단어들(subwords)의 조합으로 구성된 경우가 많기 때문에, 하나의 단어를 여러 내부 단어로 분리해서 단어를 이해해보겠다는 의도를 가진 전처리 작업
- 아직 배운 적이 없는 단어에 대해 어느 정도 대체할 수 있음
- 기계 번역 등에서 주요 전처리로 사용됨
- BPE(Byte Pair Encoding): OOV 문제 완화를 위한 대표적인 단어 분리 tokenizer
- Sentencepiece: 실무에서 사용할 수 잇는 단어 분리 tokenizer
1. BPE(Byte Pair Encoding)
- 글자(character) 단위에서 점자척으로 단어 집합(vocabulary)를 만들어 내는 Bottom up방식의 접근
- 훈련 data에 있는 단어들을 모든 글자(chracters) 또는 유니코드(unicode) 단위로 단어 집합(vocabulary)를 만들고, 가장 많이 등장하는 unigram 을 하나의 unigram으로 통합
2. WPM(Wordpiece Model)
- BPE의 변형
3. 센텐스피스(Sentencepeice)
- 구굴에서 공개한 BPE algorithm과 Unigram Language Model Tokenizer를 구현체
8. Data의 분리(Splitting Data)
1. 지도학습(Supervised Learning)
2. X와 y 분리하기
1. zip 함수 이용
2. 데이터프레임 이용
3. Numpy 이용
3. 테스트 데이터 분리하기
1. 사이킷 런 이용
- sklearn.model_selection.train_test_split
03. 언어 모델(Language Model)
- 언어 모델(Language Model, LM)은 언어라는 현상을 modeling하고자 단어 시퀀스(또는 문장)에 확률을 할당(assign)하는 model
- 통계를 이용한 방법, 인공 신경망을 이용한 방법으로 구분
1. 언어 모델이란?
1. 언어 모델(Language Model)
- 단어 시퀀스(Sequence)에 확률을 할당(assign) => 가장 자연스러운 단어 sequence를 찾아내는 model
- 이전 단어로부터 다음 단어 예측
- 앞뒤 단어로부터 중간 단어 예측
- 언어 모델링(Language Modeling): 주어진 단어들로부터 아직 모르는 단어를 예측하는 작업
- 문법(grammar)에 비유하기도 함
2. 단어 시퀀스의 확률 할당
- 기계 번역(Machine Translation)
- 오타 교정(Spell Correction)
- 음성 인식(Speech Recognition)
3. 주어진 이전 단어들로부터 다음 단어 예측하기
4. 언어 모델의 간단한 직관
5. 검색 엔진에서의 언어 모델의 예
2. 통계적 언어 모델(Statistical Language Model, SLM)
- 언어 model의 전통적 접근 방법
1. 조건부 확률
- 두 확률 P(A), P(B) 존재시
- p(B|A) = P(A,B)|P(A)
- P(A,B) = P(A)P(B|A)
- 조건부 화률 연쇄 법칙(rule chain)
- P(A,B,C,D)=P(A)P(B|A)P(C|A,B)P(D|A,B,C)
- 일반화: P(x1,x2,x3...xn)=P(x1)P(x2|x1)P(x3|x1,x2)...P(xn|x1...xn−1)
2. 문장에 대한 확률
- 문장의 확률을 구하기 위해서 각 단어에 대한 예측 확률들을 곱함
- P(w1,w2,w3,w4,w5,...wn)=∏n=1nP(wn|w1,...,wn−1)
- 문장 'An adorable little boy is spreading smiles'의 확률
- P(An adorable little boy is spreading smiles)= P(An)×P(adorable|An)×P(little|An adorable)×P(boy|An adorable little)×P(is|An adorable little boy) ×P(spreading|An adorable little boy is)×P(smiles|An adorable little boy is spreading)
3. 카운트 기반의 접근
- An adorable little boy가 나왔을 때, is가 나올 확률인 P(is|An adorable little boy)
- P(is|An adorable little boy)=count(An adorable little boy is) / count(An adorable little boy )
4. 카운트 기반 접근의 한계 - 희소 문제(Sparsity Problem)
- 충분한 데이터를 관측하지 못하여 언어를 정확히 모델링하지 못하는 문제
- n-gram, 스무딩, 백오프와 같은 여러가지 일반화(generalization)기법이 존재
- 근복적 해결책이 아니되어 언어 모델의 트렌드가 통계적 언어 모델에서 인공 신경망 언어 모델로 넘어감
3. N-gram 언어 모델(N-gram Language Model)
- Count에 기반한 통계적 접근을 사용하므로 SLM의 일종임.
- 이전에 등장한 모든 단어를 고려하는것이 아니라 일부 단어만 고려하는 접근법
1. 코퍼스에서 카운트하지 못하는 경우 감소
- SLM의 한계
- 훈련 코퍼스에 확률을 계산하고 싶은 문장이나 단어가 없을 수 있다는 점
- 확률을 계산하고 싶은 문장이 길어질수록 갖고있는 코퍼스에서 그 문장이 존재하지 않을 가능성이 높음
- 단점에 대한 대안
- An adorable little boy가 나왔을 때 is가 나올 확률을 그냥 boy가 나왔을 때 is가 나올 확률로 생각
- P(is|An adorable little boy)≈ P(is|boy) 또는 P(is|An adorable little boy)≈ P(is|little boy)
2. N-gram
- 갖고 있는 코퍼스에서 n개의 단어 뭉치 단위로 끊어서 이를 하나의 토큰으로 간주
- ex) An adorable little boy is spreading smiles
- unigrams : an, adorable, little, boy, is, spreading, smiles
- bigrams : an adorable, adorable little, little boy, boy is, is spreading, spreading smiles
- trigrams : an adorable little, adorable little boy, little boy is, boy is spreading, is spreading smiles
- 4-grams : an adorable little boy, adorable little boy is, little boy is spreading, boy is spreading smiles
- ex) 'An adorable little boy is spreading' 다음에 나올 단어 예측, 4-gram시
-P(w|boy is spreading)=count(boy is spreading w)/count(boy is spreading)
3. N-gram Language Model의 한계
- 희소 문제(Sparsity Problem)
- n을 선택하는 것은 trade-off 문제.
4. 적용 분야(Domain)에 맞는 코퍼스의 수집
5. 인공 신경망을 이용한 언어 모델(Neural Network Based Language Model)
4. 한국어에서의 언어 모델(Language Model for Korean Sentences)
- 영어나 기타 언어에 비해서 한국어는 언어 모델로 다음 단어를 예측 어려움
1. 한국어는 어순이 중요하지 않다.
2. 한국어는 교착어이다.
3. 한국어는 띄어쓰기가 제대로 지켜지지 않는다.
5. 펄플렉서티(Perplexity, PPL)
- 외부 평가(Extrinsic evaluateion): Model성능을 평가하기 위해서 일일이 model에 실제 작업을 수행하여 정확도 측정 => 공수가 많이 듬
- 내부 평가(Intrinsic evaluateion): 외부 평가보다 조금은 부정확할 수 있지만 test data에 대해 식으로 계산하는 평가방법
- 펄플렉서티는 내부 평가 방법 중 하나, 수치값이 낮을수록 좋은 성능을 의미
1. 언어 모델의 평가 방법(Evaluation metric) : PPL.
2. 분기 계수(Branching factor)
3. 기존 언어 모델 Vs. 인공 신경망을 이용한 언어 모델.
6. 조건부 확률(Conditional Probability)
04. 카운트 기반의 단어 표현(Count based word Representation)
1. 다양한 단어 표현 방법
- 단어 표현 방법
- 국소(이산) 표현(Local Representation, Discrete Representation)
- One-hot Vector
- N-gram
- Count Based
- Bag of Words(DTM)
- 분산(연속) 표현(Distributed Representation, Continuous Represnetation)
- Prediction Based
- Word2Vec(FastText)
- Glove
- Count Based
- Full Document
- LSA
- Windows
- Clove
2. Bag of Words(BoW)
1. Bag of Words란?
- 단어들의 순서는 전혀 고려하지 않고, 단어들의 출현 빈도(frequency)에만 집중하는 텍스트 데이터의 수치화 표현 방법
- BoW는 각 단어가 등장한 횟수를 수치화하는 텍스트 표현 방법, 주로 어떤 단어가 얼마나 등장했는지를 기준으로 문서가 어떤 성격의 문서인지를 판단하는 작업에 사용, 즉, 분류 문제나 여러 문서 간의 유사도를 구하는 문제에 주로 사용
- BoW를 만드는 과정
1. 각 단어에 고유한 정수 인덱스를 부여
2. 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터 생성
3. CountVectorizer 클래스로 BoW 만들기
- sklearn.feature_extraction.text.CountVectorizer
- 기본적으로 길이가 2이상인 문자에 대해서만 토큰으로 인식
- 단지 띄어쓰기만을 기준으로 단어를 자르는 낮은 수준의 토큰화를 진행 => 한국어에 적용시 주의
4. 불용어를 제거한 BoW만들기
- BoW를 만들때 불용어를 제거하는 일은 자연어 처리의 정확도를 높이기 위해서 선택할 수 있는 전처리 기법
1. 사용자가 직접 정의한 불용어 사용
- CountVectorizer(stop_words=["the", "a", "an", "is", "not"])
2. CountVectorizer에서 제공하는 자체 불용어 사용
- CountVectorizer(stop_words="english")
3. NLTK에서 지원하는 불용어 사용
- nltk.corpus.stopwords
3. 문서 단어 행렬(Document-Term Matrix, DTM)
- 각 문서에 대한 BoW 표현 방법을 그대로 갖고와서, 서로 다른 문서들의 BoW들을 결합한 표현 방법 => 각 문서에 대한 BoW를 하나의 행렬로 만든 것
- 문서 단어 행렬은 문서들을 서로 비교할 수 있도록 수치화할 수 있다는 점에서 의의를 가짐
1. 문서 단어 행렬(Document-Term Matrix, DTM)의 표기법
2. 문서 단어 행렬(Document-Term Matrix)의 한계
- 희소 표현(Sparse representation)
- 전처리를 통해 단어 집합의 크기를 줄이는 증요
- 구두점, 빈도수가 낮은 단어, 불용어 제거, 어간이나 표제어 추출을 통한 단어 정규화
- 단순 빈도 수 기반 접근
- 중요한 단어와 불필요한 단어들이 혼재되어 있어 빈도수 기반 표기에 한계가 있음
- TF-IDF를 사용하여 중요 단어와 불필요 단어에 가중치를 부여함
4. TF-IDF(Term Frequency-Inverse Document Frequency)
- TF-IDF 가중치로 DTM 내에 있는 각 단어에 대한 중요도를 계산할 수 있음
- 기존의 DTM을 사용하는 것보다 보다 더 많은 정보를 고려하여 문서들을 비교 가능(TF-IDF가 DTM보다 항상 성능이 뛰어나진 않음)
1. TF-IDF(단어 빈도-역 문서 빈도, Term Frequency-Inverse Document Frequency)
- 문서의 유사도를 구하는 작업, 검색 시스템에서 검색 결과의 중요도를 정하는 작업, 문서 내에서 특정 단어의 중요도를 구하는 작업드에 쓰임
- tf(d,t) : 특정 문서 d에서의 특정 단어 t의 등장 횟수.
- df(t) : 특정 단어 t가 등장한 문서의 수.
- idf(d, t) : df(t)에 반비례하는 수. idf(d,t)=log(n/1+df(t))
- sklearn.feature_extraction.text.TfidfVectorizer
05. 문서 유사도(Document Similarity)
- 기계가 계산하는 문서의 유사도의 성능은 각 문서의 단어들을 어떤 방법으로 수치화하여 표현했는지(DTM, Word2Vec 등), 문서 간의 단어들의 차이를 어떤 방법(유클리드 거리, 코사인 유사도 등)으로 계산했는지에 달려있음
- 코사인 유사도(Cosine Similarity)
- 유클리드 거리(Euclidean distance)
- 자카드 유사도(Jaccard similarity)
06. 토픽 모델링(Topic Modeling)
- Topic Modeling
- 기계학습 및 자연어 처리 분야에서 topic이라는 문서 집합의 추상적인 주제를 발견하기 위한 통계적 model중 하나
- Text 본문에 숨겨진 의미 구조를 발견하기 위해 사용되는 text mining 기법
1. 잠재적 의미 분석(Latent Semantic Analysis, LAS)
- Bow에 기반한 DTM, TF-IDF는 단어의 빈도수를 이용한 수치화 방법으로 단어의 의미를 고려하지 못하는 단점 존재
- LSA는 DTM의 잠재된(Latent) 의미를 이끌어내는 방법
1. 특이값 분해(Singular Value Decomposition, SVD)
- 선형대수 이용
- 전체행렬(Transposed Matrix): 원래의 행렬과 행과 열이 바뀐 행렬과
- 단위행렬(Identity Matrix): 주대각선의 원소가 1이면 나머지는 모두 0인 정사각 행렬
- 역행렬(Inverse Matrix): 행렬 A와 어떤 행렬을 곱했을때 단위행렬이 나온다면 이 어던 행렬이 역행렬
- 직교행렬(Orthogonal Matrix): n*n 행렬 A에 대해서 A*At = I이면서 At*A=I를 만족하는 행렬
- 대각행렬(Diagonal Matrix): 주대각선을 제외한 모든 곳의 원소가 0인 행력
2. 절단된 SVD(Truncated SVD)
3. 잠재 의미 분석(Latent Semantic Analysis, LAS)
- 기본적으로 DTM이나 TF-IDF 행렬에 절단된 SVD를 사용하여 차원을 축소시키고, 단어의 잠재적인 의미를 이끌어냄
4. LSA의 장단점(Proc and Cons of LAS)
- 구현이 쉽고 빠를뿐 아니라 단어의 잠재적 의미를 이끌어낼 수 잇는 문서의 유사도 계산에 좋은 성능을 봉밈
- SVD 특성상 이미 계산된 LSA에 새로운 data를 추가하려하면 보통 처음부터 다시 계산 해야함, 즉 update가 어려움 => Word2Vec등 인공신경망 기반 방법론이 각광을 받는 이유임
2. 잠재 디리클레 할당(Latent Dirichlet Allocation, LDA)
- 문서들은 topic들의 혼합으로 구성되어져 있으며, topic들은 확률 분포에 기반하여 단어들을 생성한다 가정. Data가 주어지면, LDA는 문서가 생성되던 과정을 역추적
1. 잠재 디리클레 할당(Latent Dirichlet Allocation, LDA)개요
- LDA는 각 문서의 topic 분포와 각 topic내의 단어 분포를 추정
2. LDA 가정
- 빈도수 기반 표현방법인 BoW, DTM, TF-IDF 행렬을 입력으로 함 => LDA 단어의 순서를 신경쓰지 않음
- 일반적 문서 작성의 과정
1. 문서에 사용할 단어의 개수 N을 정함
2. 문서에 사용할 topic의 혼합을 확률 분포에 기반하여 결정
3. 문서에 사용할 각 단어를 정함
3-1. topic 분포에서 topic T를 확률적으로 선택
3-2. 선택한 topic T에서 단어의 출현 확률 분포에 기반해 문서에 사용할 단어 선택함
- LDA는 위의 과정을 통해 문서가 작성되었다는 가정하에 LDA topic을 뽑아내기 위해 reverse engineering을 수행
3. 잠재 디리클레 할당과 잠재 의미 분석의 차이
- LSA: DTM을 차원 축소하여 축소 차원에서 근접 단어들을 topic으로 묶음
- LDA: 단더가 특정 topic에 존재할 확률과 문서에 특정 topic이 존재할 확률을 결합확률로 추정하여 topic을 추출
10. 워드 임베딩(Word Embedding)
1. 워드 임베딩(Word Embedding)
- 단어를 vector로 표현하는 것, 단어을 밀집 표현으로 변환하는 것
1. 희소 표현(Saprse Representation)
- One-hot encoding의 결과물이 one-hot vector처럼 vector또는 matrix의 값이 대부분이 0으로 표현되는 방법
- 단어의 개수가 늘어나면 vector의 차원이 한없이 증가
- 단어의 의미를 담지 못함
2. 밀집 표현(Dense Representation)
- 희소표현과 반대되는 표현
- Vector의 차원을 단어 집합의 크기로 상정하지 않고, 사용자가 설정한 값으로 모든 단어의 vector 표현의 차원을 맞춤
- 0,1만 가진 값이 아니라 실수값을 가짐
3. 워드 임베딩(Word Embedding)
- 단어를 밀집 벡터(dense vector)의 형태로 표현하는 방법
- 워드 임베딩의 결과는 임베딩 벡터(embedding vector)라고도 함수
- 워드 임베딩 방법론으론 LSA, Word2Vec, FastText, Glove등이 있음
- Keras에서 제공하는 도구인 Embedding()은 위에서 언급한 방법들이 아닌 단어를 rondom한 값을 가지는 밀집 vector로 변환한뒤 인공신경망의 가중치를 학습하는 방식으로 단어 vector를 학습
2. Word2Vec
- 단어간 유사도를 반영할 수 있도록 단어의 의미를 vector화 할 수 있는 방법
1. 희소 표현(Sparse Representation)
2. 분산 표현(Distributed Representation)
- 분포 가설(distributional hyphothesis)의 가정하게 만들어짐
- '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'
- 저차원에 단어의 의미를 여러 차원에 분산하여 표현 => 단어의 유사도 계산 가능
- NNLM, RNNLM등이 있으나 최근에는 해당방법들의 속도를 대폭 개선한 Word2Vec 사용
3. CBOW(Continuous Bag of Words)
- 주변의 단어를 가지고 중간에 잇는 단어들을 예측하는 방법
- 에측에 사용하는 단어: 주변 단어(context word), 예측할 단어: 중심 단어(center word)
- 윈도우(window): 중심단어를 예측하기 위해서 앞뒤 몇단어를 사용할 것인가
- 윈도우 크기가 n이면 실제 중심단어를 예측하기 위해서 사용하는 주변단어의 개수는 2n
- 슬라이딩 윈도우(sliding window): 윈도우를 계속 움직여서 주변 단어와 중심 단어 선택을 바꿔가면 학습을 위한 data set을 만드는 방법
- 인공 신경망 도식화
- 입력층(Input layer): 윈도우 크기 범위안의 주변 단어들의 원-핫 벡터
- 출력층(Output layer): 예측하고자 하는 중심 단어의 원-핫 벡터
- Word2Vec은 사실 딥 러닝 모델(Deep Learning Model)이 아님
- Word2Vec은 입력층과 츨력층 사이 단 하나의 은닉층만 존재(Shallow Neural Network)
- Word2Vec의 은닉층은 일반적인 은닉층과 달리 활성화 함수가 존재하지 않음
- Lookup table 이라는 연산을 담당하는 층으로서 일반적인 은닉층과 구분하기 위해 투사층(projection layer)라고도 부름
4. Skip-gram
- 중간이 있는 단어로 주변의 단어를 예측하는 방법
- 중심 단어에 대해서 주변 단어를 예측하기 때문에, 투사층에서 vector의 평균을 구하는 과정은 없음
5. NNLM vs. Word2Vec
- NNLM
- 언어 모델이므로 다음단어를 예측, 예측 단어의 이전 단어들만 참조
- 활성함수를 지닌 은닉층이 있음
- Word2Vec
- 워드 임베딩 자체가 목적, 중신 단어를 예측하므로 예측 단어의 전후를 참고
- 활성함수가 있는 은닉층이 없음
- 속도개선: 은닉층 제거, 계층적 소프트맥스(hierarchical softmax), 네거티브 샘플링(negative sampling)
6. 네거티브 샘플링(Negative Sampling)
- Word2Vec은 보통 SGNS(Skip-gram with Negative Sampling)을 사용
- Word2Vec은 주변 단어들을 긍정(positive)으로 두고 랜덤으로 샘플링 된 단어들을 부정(negative)으로 둔 다음에 이진 분류 문제를 수행
3. 영어/한국어 Word 실습
4. 네거티브 샘플링을 이용한 Word2Vec 구현(Skip-Gram with Negative Sampling)
5. 글로브(Glove)
8. 사전 훈련된 워드 임베딩(Pre-trained Word Embedding)
1. 케라스 임베딩 층(Keras Embedding layer)
- Embedding()
- 케라스는 훈련 데이터들의 단어들에 대해 워드 임베딩을 수행하는 도구인 을 지원
- 인공 신경망 구조 관점에서 임베딩 층(embedding layer)을 구현
1. 임베딩 틍은 룩업 테이블이다.
- 어떤 단어 -> 단어에 부여된 고유한 정수값 -> 임베딩 층 통과 -> 밀집 벡터(임베딩 벡터)
- Word -> Integer -> Lookup Table -> Embedding Vector
- 케라스는 단어를 정수 인덱스로 바꾸고 원-핫 벡터로 한번 더 바꾸고나서 임베딩 층의 입력으로 사용하는 것이 아니라, 단어를 정수 인덱스로만 바꾼채로 임베딩 층의 입력으로 사용해도 룩업 테이블 된 결과인 임베딩 벡터를 리턴
2. 임베딩 층 사용하기
2. 사전 훈련된 워드 임베딩(Pre-Trained Word Embedding) 사용하기
6. 엘모(Embeddings from Language Model, ELMo)
7. 임베팅 벡터의 시각화(Embedding Visualization)