자연어 처리 용어
- Corpus(말뭉치): 특정한 목적을 가지고 수집한 텍스트 데이터
- Document(문서): Sentence(문장)의 집합
- Sentence: 여러개의 토큰(단어, 형태소)로 구성된 문자열. 마침표, 느낌표 등의 기호로 구분
- Vocabulary(어휘집합): 코퍼스에 있는 모든 문서, 문장을 토크화한 후 중복을 제거한 토큰의 집합
- 전처리(Preprocessing)
- 토큰화(Tokenization)
- 차원의 저주(Curse of Dimensionality)
- 불용어(Stop words)
- 어간 추출(Stemming)
- 표제어 추출(Lemmatization)
등장 횟수 기반의 단어 표현(Count-based Representation)
민트 초코 논란! 자연어 처리(NLP)로 종결해드림
- 민트초코 및 하와이안피자 호불호 비율 7:3으로 ‘호’ 압승
Bag of Words
- 횟수 기반의 단어
- Bag of Words: 문장을 숫자로 표현하는 방법 중 하나
- Sentence 혹은 Document를 벡터로 나타내는 가장 단순한 방법
- 활용
- 문장의 유사도 확인
- 머신러닝 모델 입력값으로 사용
- 단점
- Sparsity: 실제 사전에는 백 만개가 넘는 단어가 있다.
- 계산량이 높아지고 메모리가 많이 사용된다.
- 많이 출현한 단어는 힘이 세진다.
- 단어의 순서를 철저히 무시한다.
- 처음 보는 단어는 처리하지 못한다(오타, 줄임말).
- Sparsity: 실제 사전에는 백 만개가 넘는 단어가 있다.
TF-IDF
- Term Frequency-Inverse Document Frequency
- 각 단어별로 연관성을 알고싶을 때 사용되며, 수치로 표현된다.
- TF: 문서가 주어졌을 때 단어가 얼마나 출현했는지의 값
- IDF: 자주 출현하는 단어에 대해 패널티를 준다.
자연어 처리
자연어
- Netural Language: 사람이 일상적으로 쓰는 언어를 인공적으로 만들어진 언어인 인공어와 구분하여 부르는 개념
- 자연어가 아닌 것: 에스페란토어, 코딩 언어 등
- NLP(Natural Language Processing, 자연어 처리): 자연어를 컴퓨터로 처리하는 기술
- Text Mining을 잘하는 방법
자연어 처리로 할 수 있는 일
자연어 이해(NLU, Natural Language Understanding)
- 분류: 뉴스 기사 분류, 감정 분석
- 자연어 추론(NLI, Natural Langauge Inference)
- ex) A는 B에게 암살당했다 -> A는 죽었다 -> T or F
- 기계 독해(MRC, Machine Reading Comprehension), 질의 응답(QA, Question&Answering)
- 품사 태깅(POS tagging), 개체명 인식(Named Entity Recognition) 등
자연어 생성(NLG, Natural Language Generation)
- 텍스트 생성 ex) 뉴스 기사 생성, 가사 생성
NLU & NLG
- 기계 번역(Machine Translation)
- 요약(Summerization)
- 추출 요약(Extractive summerization): 문서 내에서 해당 문서를 가장 잘 요약하는 부분을 찾아내는 Task -> NLU에 가깝다.
- 생성 요약(Absractive summerization): 해당 문서를 요약하는 요약문 생성 -> NLG에 가깝다.
- 챗봇(Chatbot)
- 특정 테스크를 처리하기 위한 챗봇(Task Oriented Dialog, TOD)
- ex) 식당 예약을 위한 챗봇, 상담 응대를 위한 챗봇
- 정해지지 않은 주제를 다루는 일반 대화 챗봇(Open Domain Dialog, ODD)
- 특정 테스크를 처리하기 위한 챗봇(Task Oriented Dialog, TOD)
기타
- TTS(Text to Speech): 텍스트를 음성으로 읽기(ex) 슈퍼챗)
- STT(Speech to Text): 음성을 텍스트로 쓰기(ex) 컨퍼런스, 강연 등에서 청각 장애인을 위한 실시간 자막 서비스)
- Image Captioning: 이미지를 설명하는 문장 생성
사례
- 챗봇: 심리상담 챗봇(트로스트, 아토머스), 일반대화 챗봇(스캐터랩 - 이루다, 마인드로직)
- 번역: 파파고, 구글 번역기
- TTS, STT: 인공지능 스피커, 회의록 작성(네이버 - 클로바노트, 카카오 - Kakao i), 자막 생성(보이저엑스 - Vrew, 보이스루)
Vectorize(벡터화)
- 벡터화: 컴퓨터는 자연어 자체를 받아들일 수 없기 때문에 컴퓨터가 이해할 수 있도록 벡터로 만들어주어야 한다.
- 자연어를 어떻게 벡터로 표현하는지는 자연어 처리 모델의 성능을 결정하는 중요한 역할이다.
벡터화의 2가지 방법
등장 횟수 기반의 단어 표현(Count based Representation)
- 단어가 문서 혹은 문장에 등장하는 횟수를 기반으로 벡터화하는 방법
- Bag of Words(CounterVectorizer)
- TF-IDF(TfidfVectorizer)
분포 기반의 단어 표현(Distributed Representation)
- 타겟 단어 주변에 있는 단어를 기반으로 벡터화하는 방법
- Word2Vec
- GloVe
- fstText
Text Preprocessing(텍스트 전처리)
- 자연어 처리의 시작이자 절반 이상을 차지하는 중요한 과정이다.
- 실제 텍스트 데이터를 다룰 때 데이터를 읽어보면서 어떤 특이사항이 있는지 파악해야 한다.
- 전처리 방법
- 내장 메서드를 사용한 전처리(
lower
,replace
) - 정규 표현식(Regular expression, Regex)
- 불용어(Stop words) 처리
- 통계적 트리밍(Trimming)
- 어간 추출(Stemming), 표제어 추출(Lemmatization)
- 내장 메서드를 사용한 전처리(
차원의 저주(Curse of Dimensionality)
- 차원의 저주: 특성의 개수가 선형적으로 늘어날 때 동일한 설명력을 가지기 위해 필요한 인스턴스의 수는 지수적으로 증가한다.
즉, 동일한 개수의 인스턴스를 가지는 데이터셋의 차원이 늘어날수록 설명력이 떨어진다. - 횟수 기반의 벡터 표현에서는 전체 말뭉치에 존재하는 단어의 종류가 데이터셋의 Feature, 즉 차원이 된다.
- 따라서, 단어의 종류를 줄여야 차원의 저주를 어느정도 해결할 수 있다.
대소문자 통일
- 모든 문자를 소문자로 통일하여 같은 범주로 엮는다.
1 |
|
Regex(정규표현식)
- 정규표현식: 구두점이나 특수문자 등 필요없는 문자가 말뭉치 내에 있을 경우 토큰화가 제대로 이루어지지 않기 때문에 이를 제거하기 위해 사용한다.
- 문자열을 다루기 위한 중요하고도 강력하지만, 복잡하기 때문에 반복적인 실습으로 익혀야 한다.
a-z
(소문자),A-Z
(대문자),0-9
(숫자)를^
제외한 나머지 문자를regex
에 할당한 후.sub
메서드를 통해서 공백 문자열""
로 치환한다.
1 |
|
1 |
|
SqpCy
SpaCy
: 문서 구성요소를 다양한 구조에 나누어 저장하지 않고 요소를 색인화하여 검색 정보를 간단히 저장하는 라이브러리
1 |
|
불용어(Stop words) 처리
- 위에서 시각화 한 I, and, of 같은 단어는 리뷰 관점에서 아무런 의미가 없는데, 이런 단어들을 불용어라고 한다.
- 대부분의 NLP 라이브러리는 접속사, 관사, 부사, 대명사, 일반동사 등을 포함한 일반적인 불용어를 내장하고 있다.
1 |
|
불용어 커스터마이징
1 |
|
1 |
|
통계적 Trimming
- 불용어를 직접적으로 제거하는 대신 통계적인 방법을 통해 말뭉치 내에서 많거나, 적은 토큰을 제거하는 방법도 있다.
1 |
|
- 몇몇 소수의 단어들이 전체 코퍼스의 80%를 차지한다는 점을 알 수 있다.
- 그래프 결과에서 나타는 단어의 중요도의 두 가지 해석
- 자주 나타나는 단어들(그래프의 왼쪽): 여러 문서에서 두루 나타나기 때문에 문세 분류 단계에서 통찰력을 제공하지 않는다.
- 자주 나타나지 않는 단어들(그래프의 오른쪽): 너무 드물게 나타나기 때문에 큰 의미가 없을 확률이 높다.
1 |
|
1 |
|
1 |
|
1 |
|
어간 추출(Stemming)과 표제어 추출(Lemmatization)
어간 추출(Stemming)
- 어간(Stem): 단어의 의미가 포함된 부분으로 접사등이 제거된 형태
- 어근이나 단어의 원형과 같지 않을 수 있다.
- ex) argue, argued, arguing, argus의 어간은 단어의 뒷 부분이 제거된 argu가 어간이다.
- 어간 추출은 ing, ed, s 등과 같은 부분을 제거하게 된다.
nltk 사용 Stemming
1 |
|
- 단지 단어의 끝 부분을 자르는 역할을 하기 때문에 사전에도 없는 단어가 많이 나오는데, 이상하긴 해도 현실적으로 사용하기에 성능이 나쁘지 않다.
- 알고리즘이 간단하여 속도가 빠르기 때문에 속도가 중요한 검색 분야에서 많이 사용한다.
표제어 추출(Lemmatization)
- 어간 추출보다 체계적이다.
- 단어의 기본 사전형 단어 형태인 Lemma(표제어)로 변환된다.
- 명사의 복수형은 단수형으로, 동사는 모두 타동사로 변환된다.
- 단어로부터 표제어를 찾아가는 과정은 Stemming 보다 많은 연산이 필요하다.
SpaCy 사용 Lemmatization
1 |
|
등장 횟수 기반의 단어 표현(Count based Representation)
텍스트 문서 벡터화
- 머신러닝 모델에서 텍스트를 분석하기 위해서는 벡터화(Vectorization)하는 과정이 필요하다.
- 벡터화: 텍스트를 컴퓨터가 계산할 수 있도록 수치정보로 변환하는 과정이다.
- 등상 횟수 기반의 단어 표현(Count based Representation)은 단어가 특정 문서혹은 문장에 들어있는 횟수를 바탕으로 해당 문서를 벡터화한다.
- 대표적인 방법으로 Bag of Words(TF, TF-IDF) 방식이 있다.
문서-단어 행렬(Document Term Matrix, DTM)
- 벡터화 된 문서는 문서-단어 행렬의 형태로 나타내어진다.
- 문서-단어 행렬이란 각 행에는 문서(Document)가, 각 열에는 단어(Term)가 있는 행렬이다.
Word_1 | Word_2 | Word_3 | Word_4 | Word_5 | Word_6 | |
Docu_1 | 1 | 2 | 0 | 1 | 0 | 0 |
Docu_2 | 0 | 0 | 0 | 1 | 1 | 1 |
Docu_3 | 1 | 0 | 0 | 1 | 0 | 1 |
Bag of Words(BoW): TF(Term Frequency)
- BoW는 가장 단순환 벡터화 방법 중 하나이다.
- 문서 혹은 문장에서 문법이나 단어의 순서 등을 무시하고 단순히 단어의 빈도만 고려하여 벡터화한다.
CountVectorizer 적용
1 |
|
1 |
|
Bag of Words(BoW): TF-IDF(Term Frequency - Inverse Document Frequency)
- 각 문서마다 중요한 단어와 그렇지 못한 단어가 있다.
- 다른 문서에 잘 등장하지 않는 단어라면 해당 문서를 대표할 수 있는 단어가 될 수 있다.
- 다른 문서에 등장하지 않는 단어, 즉 특정 문서에만 등장하는 단어에 가중치를 두는 방법: TF-IDF(Term Frequency-Inverse Document Frequency)
수식
\[\text{TF-IDF(w)} = \text{TF(w)} \times \text{IDF(w)}\]- TF(Term-Frequency)는 특정 문서에만 단어 w가 쓰인 빈도이다.
- 분석할 문서에서 단어 $w$가 등장하는 횟수를 구하게 된다.
- IDF(Inverse Document Frequency)는 분류 대상이 되는 모든 문서의 수를 단어 $w$가 들어있는 문서의 수로 나누어 준 뒤 로그를 취해준 값이다.
- 실제 계산에서는 0으로 나누어 주는 것을 방지하기 위해 분모에 1을 더해준 값을 사용한다.
- 즉,
- 위 식에 따르면 자주 사용하는 단어라도, 많은 문서에 나오는 단어는 IDF가 낮아지기 때문에 TF-IDF가 낮아지기 때문에 TF-IDF로 벡터화 했을 때 작은 값을 가지게 된다.(지프의 법칙 찾아보기. log 이유 찾아보기)
- 사이킷런의 TfidfVectorizer를 사용하면 TF-IDF 벡터화도 사용할 수 있다.
TfidVectorizer 적용
1 |
|
1 |
|
(n-gram 찾아보기)
1 |
|
(CountVectorizer, TfidfVectorizer 차이와 장단점 찾아보기)
유사도 이용 문서 검색
- 검색엔진의 원리: 검색어와 문서에 있는 단어를 매칭하여 결과를 보여준다.
- 매칭의 방법 중 가장 클래식한 방법인 유사인 측정 방법을 시도해보자.
- 코사인 유사도는 두 벡터가 이루는 각의 코사인 값을 이용하여 구할 수 있는 유사도이다.
- 두 벡터가
- 완전히 같을 경우 1
- 90도의 각을 이루면 0
- 완전히 반대방향을 이루면 -1
NearestNeighbor(K-NN, K-최근접 이웃)
- K-최근접 이웃법은 쿼리와 가장 가가운 상위 K개의 근접한 데이터를 찾아서 K개 데이터의 유사성을 기반으로 점을 추정하거나 분류하는 예측 분석에 사용된다.
1 |
|
Review
불용어(Stopwords)
- 자주 등장하지만 분석을 함에 있어서 크게 도움되지 않는 단어이다.
- NLTK에서 100여개 이상의 영어 단어를 불용어로 패키지 내에서 미리 정의하고 있다.
어간 추출(Stemming)과 표제어 추출(Lemmatization)
어간 추출
- 단어의 의미가 포함된 부분으로 접사 등이 제거된 형태로써, 사전에 존재하지 않는 단어일 수 있다.
표제어 추출
- 단어의 기본 사전형 단어 형태인 Lemma(표제어)로 변환된다.
- Stemming보다 많은 연산이 필요하다.
TF-IDF
\[idf(d, t) = log(\frac{n}{1+df(t)})\]- 단어의 빈도와 역 문서 빈도를 사용하여 DTM 내의 각 단어마다 중요한 정도를 가중치로 주는 방법이다.
- 유사도를 구하는 작업, 검색 결과의 중요도를 정하는 작업, 특정 단어의 중요도를 구하는 작업 등에 쓰인다.
n-gram
- 모든 단어를 고려하는 것이 아닌 일부 단어만 고려하는 접근 방법인데, 이 때 일부 단어 몇 개보느냐를 결정하는 것이 n이 가지는 의미이다.
- 단어 몇 개만 보다 보니 의도하고 싶은 대로 문장을 끝맺음 하지 못하는 경우가 생긴다.