1. 자연어 처리 개요
(1) 자연어 처리의 의미
자연어(Natural Language)란 우리가 일상에서 사용하고 있는 언어를 이야기합니다. 이런 자연어를 컴퓨터가 특정 업무를 처리하기 위해 인지하여 가공하는 작업을 자연어 처리(NLP, Natural Language Processing)라고 합니다.
자연어라는 단어를 처음 들었을 때는 제가 기존에 알고 지냈던 언어의 개념과 동떨어져 있다고 생각했습니다. 하지만 현재 제가 자연어 처리를 소개하는 글을 쓰는 자체도 자연어를 사용하고 있고, 언제 어디서나 누군가와 ‘자연’스럽게 소통할 수 있는 매개체가 자연어이기 때문에 그 의미를 빠르게 이해할 수 있었습니다.
(2) 자연어 처리 사례
자연어 처리가 적용된 프로그램은 생각보다 널리 알려져있습니다. 우선 ChatGPT가 자연어 처리 프로그램 중 가장 화두가 되고 있는 녀석이죠. 그리고 우리가 다른 언어를 번역해서 이해하고자 할 때 번역기(‘구글 번역’, ‘Papago’)를 사용합니다. 또한 일부 사물 인터넷이나 스마트폰에 탑재된 스마트 어시스턴트(’Siri’, ‘삼성 빅스비’, ‘아마존 알렉사’)가 있습니다. 자연어 처리 분야는 프로그램으로 출시되는 것 말고도 사람들의 데이터들을 다양한 방식으로 수집해서 더 나은 의사결정을 위한 정보 제공에 활용됩니다. 유튜브에서 여러분이 즐겨 보는 영상과 연관성이 높은 영상들을 추천 해주거나 네이버, 구글과 같은 포털 사이트에서 여러분이 찾고자 하는 정보, 찾아야 하는 정보들의 키워드를 핵심으로 검색 추천이나 관련 광고들을 띄워줍니다. 그밖에도 여러가지 사례가 수두룩합니다. 이 중에서 3가지 자연어 처리 사례들을 가지고 각 사례의 적용 기능을 나열해봤습니다. 참고로 유튜브의 ‘메타코드M’ 채널에 게시된 ‘딥러닝을 이용한 자연어처리 입문 7시간 완성’ 강의를 통해 정리한 것입니다.
자연어 처리 예제 1-Chatbot
자연어 처리 예제 2-Siri
자연어 처리 예제 3-Papago
2. 자연어 처리 전체 과정
자연어 처리 분야는 초기에는 통계 기반의 언어 모델을 활용해서 특정 업무에 맞게 처리하곤 했습니다. 그러나 일부 업무를 처리하는 프로그램에선 실제값과 다른 결과값이 도출되는 문제가 있었습니다. 그러자 하드웨어의 발전과 함께 딥러닝이 화두가 되면서 딥러닝 기반의 언어 모델이 등장했고 이는 더 높은 정확도로 결과를 출력할 수 있게 됐습니다. 저는 이 글을 시작으로 딥러닝 기반의 언어 모델을 중심으로 자연어 처리의 순차적인 과정을 설명하겠습니다.
데이터셋 준비 ⇒ 데이터 전처리 ⇒ 모델 학습 ⇒ 모델 평가 ⇒ 예측(테스트)
참고로 해당 과정은 머신러닝 전체의 공통 학습 과정입니다. 딥러닝 기법은 머신러닝의 부분집합이므로 머신러닝 과정을 따를 수밖에 없습니다.
3. 데이터셋 준비
모델을 학습시키기 위한 재료들이 필요합니다. 그 재료들은 바로 데이터입니다. 머신러닝 학습에선 방대한 데이터들이 있어야 더 높은 정확도를 가진 모델이 완성됩니다. 이 방대한 데이터를 데이터셋(Data Set), 혹은 말뭉치(Corpus)라고 부르죠. 한국어 자연어 처리를 위한 데이터셋 오픈소스들이 다양하게 개방되어 있습니다. 대표적으로 국립국어원에서 지원하는 ‘모두의 말뭉치’가 있습니다.
모두의 말뭉치를 접속하시면 위와 같은 사진처럼 페이지가 나옵니다. 많은 데이터도 중요하지만 특정 태스크를 잘 수행하기 위해선 전처리 과정이 중요하고 전처리 과정 이전엔 특정 태스크와 관련된 데이터들을 선별해야 합니다. 예를 들어서 맞춤법 교정을 위한 데이터셋은 ‘맞춤법 교정 말뭉치 2022’를 선택하고, 챗봇을 개발한다고 하면 ‘일상 대화 음성 말뭉치’를 선택하는 것입니다. 해당 데이터셋을 이용하시려면 국립국어원 회원가입을 하셔야 합니다. 회원가입을 하셨으면 그냥 데이터셋을 다운로드 받을 수 없고 사유를 자세하게 작성한 후 신청하면, 승인 메일 첨부 파일로 다운로드 받을 수 있습니다.
한국어 데이터셋은 국가에서 개방한 것만 있지 않습니다. songys 님께서 정리해주신 데이터셋 목록에서 여러분이 선택해서 쓰실 수 있습니다. songys 님뿐만 아니라 많은 분들이 데이터셋 공유에 기여를 해주셨기 때문에 총 44개의 데이터셋 페이지들을 확인 가능한데 이 중에서 서비스를 종료한 데이터셋들도 있으니 잘 선별해서 쓰시면 됩니다.
4. 데이터 전처리
(1) 텍스트 전처리란
컴퓨터 및 컴퓨터 언어에서 자연어를 효과적으로 처리할 수 있도록 하는 과정을 말합니다. 날 것의 데이터를 가지고 모델을 학습 시킨다면 생각보다 덜떨어진 성능을 가진 모델이 나올 수밖에 없습니다. 텍스트 전처리를 하는 과정은 다음과 같이 이루어집니다.
(2) 텍스트 전처리 과정
토큰화 → 정제/추출 → 인코딩 → 정렬 → 패딩/유사도
➀ 토큰화(Tokenization)
토큰화(Tokenization)
주어진 문장에서 “의미 부여”가 가능한 단위를 찾는 과정입니다. 한국어에선 형태소가 토큰으로 간주됩니다.
토큰화 방식
1.
표준 토큰화(Treebank Tokenization): 단어 단위로 의미를 나누기
2.
문장 토큰화: 문장 단위로 의미를 나누기
언어 예시1-English
언어 예시2-한글
➁ 정제(Cleaning)
정제(Cleaning)
데이터 사용 목적에 맞추어 노이즈(Noise)를 제거하는 작업입니다. 노이즈란 자연어가 아니면서 아무 의미도 갖지 않는 글자들(특수 문자 등)을 의미하기도 하지만, 분석하고자 하는 목적에 맞지 않는 불필요 단어들을 노이즈 데이터라고 하기도 합니다.
정제 방식
1.
대문자, 소문자 확인
2.
출현 횟수가 적은 단어 제거
3.
길이가 짧은 단어, 지시(대)명사, 관사 제거
언어 예시1-English
➂ 추출(Stemming)
추출(Stemming)
어간 및 접사를 뽑아내는 작업입니다. 어간(Stem)은 단어의 의미를 담은 핵심 역할을 담당합니다. 접사(Affix)는 단어에 추가 용법을 부여해주는 역할을 담당합니다.
추출 방식
1.
어간 추출(Stemming): 의미를 가진 부분만 추출하는데, 품사 정보를 갖고 있지 않습니다.
ex) [ 파란색(어간), 빨간색(어미) ] formalize, tolerance, electrical, organization
2.
표제어 추출(Lemmatization): 의미를 가진 부분만 추출. 어간 추출 방식과 다르게 단어의 품사 정보를 포함시킵니다.
ex) is, are → be, having → have
3.
불용어(Stopword) 추출: 문장에서 중요도가 낮은 단어를 추출합니다.
+ 불용어 제거방법
a.
불용어 목록을 받아옵니다.
b.
정제할 문장을 토큰화합니다.
c.
토큰화된 각 단어마다 단어가 불용어 목록에 없는 경우 정제 결과에 추가하고, 단어가 불용어 목록에 있는 경우에는 통과합니다.
➃ 인코딩(Encoding)
인코딩(Encoding)
자연어를 숫자(컴퓨터가 0과 1로 변환될 수 있는 형태)로 변환하는 과정입니다.
인코딩 방식
1.
정수 인코딩(Integer-Encoding): 토큰화와 정제 및 추출이 완료된 단어들에 번호를 부여하는 방식입니다.
효율적인 정수 인코딩 작업 과정
a.
문장 토큰화 - 불용어 및 대문자 제거 과정을 진행합니다.
b.
단어 사전을 가리키는 vocab = {}를 만듭니다.
c.
토큰화된 각 단어에 대해서 단어가 vocab에 속해 있지 않는 경우에는 vocab[단어] = 0 연산을 거칩니다. 단어가 vocab에 속한 경우에는 vocab[단어] += 1 연산을 수행합니다.
2.
원-핫 인코딩(One-hot Encoding): 정수 인코딩을 거친 데이터를 컴퓨터가 이해하기 위해서 0과 1로 이루어진 데이터로 변환하는 방식입니다. 정수 인코딩을 통해 나온 숫자가 5인 경우, 일정한 크기의 배열에서 인덱스 5번 공간에 1을 저장하고 나머지 위치는 0으로 채우는 것입니다.
3.
Word2vec Encoding: “단어의 유사성”을 인코딩에 반영합니다. (인코딩 벡터가 비슷하다) = (단어가 유사하다)
TF-IDF(Term Frequency-Inverse Document Frequency)
단어들의 중요한 정도를 가중치로 매기는 방법입니다.
TF-IDF = tf(d, t) X idf(d, t)
[d: 특정 문서 번호, t: 특정 단어 번호]
tf(d, t)
특정 문서 d에서 특정 단어 t의 등장 횟수
idf(d, t) = log(N / df(t))
[df(t): 특정 단어 t가 등장한 문서의 수, N: 총 문서의 수]
➄ 정렬
보통 빈도 순으로 정렬을 합니다. 정렬에 관한 지식은 해당 글을 수정할 수 있는 기회가 온다면 설명하겠습니다.
➅ 패딩
Zero-padding
인코딩이 완료된 데이터들의 길이를 맞추기 위한 과정입니다. 0으로 길이를 채워주는 것을 Zero-padding이라고 부릅니다.
➆ 유사도
유사도 분석 정의
단어와 단어 사이, 문장과 문장 사이에 얼마나 유사한 지를 판단하는 척도를 분석하는 것을 말합니다.
유사도 분석 방식
1.
벡터 유사도(Cosine Metric): 두 벡터의 내적을 활용한 cosθ 값을 유사도로 결정합니다. 0 ≤ θ ≤ 180는 -1 ≤ cosθ ≤ 1 이고, cosθ = 1이면 두 벡터의 방향은 동일하다는 의미입니다. 쉽게 말해서 cosθ 값이 클수록 유사도가 높다고 보시면 됩니다.
cosθ = x*y / |x|*|y|
Bash
복사
벡터의 내적(Inner Product)
⇒ x*y, 같은 크기를 가지는 두 개의 벡터의 각 성분을 곱해서 덧셈하는 작업입니다.
벡터의 노름(Norm)
⇒ |x|, |y|, 벡터의 크기로 간주하시면 됩니다.
예시)
1번: I love apple.
2번: Apple is delicious which I love too.
3번: I want a delicious food, but not an apple.
4번: Deep learning is difficult.
출현 단어: [love, apple, delicious, want, food, not, ‘DL’, difficult]
1번 문장: [ 1 1 0 0 0 0 0 0 ]
2번 문장: [ 1 1 1 0 0 0 0 0 ]
3번 문장: [ 0 1 1 1 1 1 0 0 ]
4번 문장: [ 0 0 0 0 0 0 1 1 ]
1번, 2번 문장 유사도: cos(2 / root(6)) 크기 순위: 1st
2번, 4번 문장 유사도: cos(0 / root(6)) 크기 순위: 3rd
1번, 3번 문장 유사도: cos(1 / root(10)) 크기 순위: 2nd
2.
벡터 유사도(Euclidean Metric): 두 벡터의 사이의 각도와 대응하는 대변의 길이를 유사도로 결정합니다.
d = root((x1-x2)² + (y1-y2)²))
[root()는 제곱근을 대신해서 사용함]
Bash
복사
3.
Levenshtein Distance: 단어 사이의 거리를 나타내는 대표적인 척도를 가리킵니다. 단어 A를 단어 B로 수정(단어의 삽입, 삭제, 변경)하기 위한 최소 횟수를 유사도로 결정합니다.
4.
Jaccard Distance: 두 벡터의 성분 간의 교집합과 차집합의 각 개수를 나눈 결과를 유사도로 결정합니다.
5. 모델 학습
(1) 모델 학습
언어 모델이란 자연어 데이터셋을 입력으로 받아서 목적에 따라 최적의 확률값을 출력하는 함수입니다. 현재 자연어 처리 모델로 가장 사랑받고 있는 것이 딥러닝 기반 자연어 처리 모델이라고 했습니다. 여러 층의 신경망들이 입력 신호에 대한 반응을 가지고 특정 입력에 대해서 적절한 확률값을 출력합니다. 확률을 반환하기 위해선 전처리한 데이터들을 분석해서 패턴을 스스로 익히도록 해야 합니다. 이런 행동을 ‘학습’한다고 부릅니다. 위에서 자연어 처리 언어 모델의 종류가 두 가지가 있었다고 했습니다. 이 글에선 통계 기반 언어 모델의 특징을 간단히 명시만 하고 딥러닝 기반 언어 모델에 관해서는 추후에 자세하게 다루도록 하겠습니다.
(2) 통계(확률) 기반 언어 모델
예시1) “나는 밥을 먹힌다” < “나는 밥을 먹는다”
예시2) “비가 오늘 날에는 우산을 써야 옷이 _______.”
빈칸에 들어갈 단어(초록색-정답, 빨간색-오답): (a) 젖지 않는다 (b) 닫지 않는다
n개의 단어로 이루어진 sequence가 등장할 확률
p(W) = p(w1, w2, w3, … , w𝒏)
[ 단어 sequence = W = {w1, w2, w3, … , w𝒏} ]
[ 개별 단어 = w ]
Markov Chain
이미 n-1개의 단어가 주어진 경우, 다음에 등장할 단어 예측하는 언어 모델입니다.
p(w𝒏 | w1, w2, … , w𝒏-1)
Count-based Approximation
현재 단어가 나타났을 때 경우에서 이전 단어까지 나타난 문장에 대한 확률을 비교하는 방식입니다. 즉, 이전 단어까지 나타난 문장에서 현재 단어가 나오는 조건부를 확인하는 겁니다. 이 확률 계산 결과가 작게 나오기 때문에 희소성 문제가 발생합니다.
N-gram Language Model
현재 단어 앞에 N개의 단어만 참조하면서 확률을 계산하는 모델입니다. 정확성은 떨어지지만 희소성 문제를 해소할 수 있습니다.
(3) 인공 신경망 기반 언어 모델
순환 신경망 모델(RNN, LSTM, GRU), Transformer, BERT, 그리고 최근 화두가 된 GPT가 있습니다.
6. 모델 평가와 예측
(1) 평가
모델에 실제로 훈련 데이터셋과 테스트 데이터셋을 각각 넣어봤을 때, 모델이 훈련 데이터셋을 넣을 때 출력하는 확률값이 테스트 데이터셋을 넣을 때 출력하는 확률값보다 근소우위하게 높고, 둘 다 가장 높은 수치를 나타낸다면 학습을 성공했다고 합니다. 그러나 실제로 학습한 모델을 평가할 때, 훈련 데이터셋과 테스트 데이터셋에 대한 결과 차이가 크게 발생하는 경우가 빈번하게 일어난다고 합니다. 이런 현상을 ‘과적합’이라고 부릅니다. 학습할 때 입력하지 않았던 새로운 데이터들을 예측하는데 실제값과 가장 유사한 결과를 도출할 수 있도록 하기 위해 평가 과정을 거쳐야합니다.
(2) 예측
평가 과정까지 성공했으면 새로운 데이터를 입력하고 이에 대한 출력 결과를 확인하는 과정입니다. 출력 결과는 확률값이 아니라 특정 태스크에 맞는 결과를 말합니다. 예를 들어 ‘감정 분석’ 태스크를 수행하는 모델을 학습시켰다면 이 모델에 새로운 문장을 던져서 이 문장의 감정을 예측한 다음, 이에 대한 적절한 결과를 내는 것입니다.
7. 요약
해당 글은 자연어와 자연어 처리가 무엇인지 정의를 알리고, 자연어 처리 과정이 전반적으로 어떻게 이루어 지는 지 알아보았습니다. 계속해서 딥러닝 기반 자연어 처리 모델 소개와 자연어 처리 사례들을 한 번씩 다뤄볼 예정입니다. 지금 초심자 단계를 밟고 있는 시점에서 정리를 해봤습니다. 계속해서 쉽고 정확한 정보 전달을 위해 수정이 이뤄질 겁니다. 저는 다양한 피드백을 환영합니다. 감사합니다.