본문 바로가기
HRDI_AI/[인공지능] RNN을 이용한 자연어처리 모델 구현

1. 인공지능과 자연어 처리

by Toddler_AD 2025. 12. 5.

1-1. 인공지능

  • 인공지능의 시작

  • 인공지능의 역사

1-2. 자연어처리

  • 자연어와 자연어처리 분야
    • 자연어는 인간이 상대방과 의사소통을 위해서 사용하는 언어(한국어, 영어, 중국어 등)
    • 자연어처리(NLP; Natural Language Processing)는 사람의 자연어를 컴퓨터가 이해하고 처리할 수 있도록 하는 인공지능의 한 분야

  • 자연어처리 역사와 영역

  • 자연어처리 활용 사례
    • 인공지능 번역기
      • 딥러닝을 이용해 국가 간 언어를 번역하는 서비스
      • 기존 번역 서비스보다 정확도가 한층 높아졌으며, 전후 문맥을 파악하여 자연스러운 번역이 가능해짐
      • 최근에는 딥러닝 음성인식 기술과 융합하여 통역 서비스에 활용
    • 인공지능 챗봇
      • 챗봇(Chatbot)은 채팅(Chatting)과 로봇(Robot)이 합성어로 인공지능 기반의 커뮤니케이션 소프트웨어 
      • 사람과의 문자 대화를 통해 질문에 알맞은 답변이나 각종 연관 정보를 제공하며, 다양한 비즈니스 도메인 분야에 활용
    • 인공지능 스피커
      • 음성인식 기능과 인공지능 자연어 처리 기술 등을 활용한 스피커
      • 인공지능 스피커는 사용자의 음성 명령을 스피커가 서버로 전송하고, 인공지능 플랫폼이 의미분석 및 서비스를 제공
    • 인공지능 리걸 테크(Legal Tech)
      • 인공지능 자연어처리, 빅데이터 기술 등을 활용한 법률서비스
      • 기존이 판례나 법령, 변호사들의 자문 빅데이터를 활용
      • 이용자가 기본적인 정보만 입력하면 자동으로 법률 문서가 작성되고 법률 상담 서비스를 제공
    • 인공지능 저널리즘(Journalism)
      • 인공지능 기술을 활용해 기사를 작성하는 로봇 저널리즘
      • 머신러닝, 딥러닝 등을 활용한 자연어처리 기술을 활용
      • 방대한 빅데이터에서 중요한 정보를 편집해서 기사화하는 데이터 저널리즘 등에 활용
      • 기사 및 정보의 사실 여부를 평가하여 가짜 뉴스 판별에도 활용함
    • 인공지능 컨택서비스(Contact Service)
      • 고도화된 AI 음성 로봇을 활용한 고객 상담센터를 제공
      • 고객들의 상담 대기시간을 획기적으로 줄일 수 있으며, 고객의 문의 사항에 대한 신속한 답변과 안내 사항 등 각종 정보를 제공

1-3. 자연어처리를 위한 텍스트 전처리

  • 자연어처리를 위한 텍스트 전처리
    • Corpus : 여러 문장으로 구성된 문서의 집합, 자연어처리에 사용되는 데이터
    • 정제, 불용어 제거, 어간 추출, 토큰화 및 문서 표현 등의 작업을 수행
      • 정제(Cleaning) : 특수문자 등과 같은 불필요한 노이즈 텍스트를 제거, 대소문자 통일 시킴
      • 불용어 제거(Stop word Elimination) : 전치사, 관사 등 문장이나 문서의 특징을 표현하는 데 불필요한 단어를 제거
      • 토큰화(Tokenizer) : 코퍼스(Corpus)에서 분리자(Separator)를 포함하지 않는 연속적인 문자열 단위로 분리(nltk, konlpy 사용)
      • 워드 임베딩(Word Embedding)
        • 주어진 문서나 문장의 하나의 벡터로 표현
        • 단어들을 인덱싱하고 주어진 문서에 존재하는 단어의 빈도수를 사용하여 문서를 표현
        • 문서 표현 방법은 One-hot 인코딩, TF-IDF, Word2Vec 등이 있음
  • 형태소 분석
    • NLTK(Natural Language Toolkit, https://www.nltk.org/)
      • 인간의 언어 데이터를 파이썬 언어로 분석할 수 있도록 만들어진 패키지
      • 분류, 토큰화, 형태소 분석, 품사 태깅, 구문 분석 및 의미론적 추론을 위한 텍스트 처리 라이브러리와 WordNet과 같은 50개가 넘는 말뭉치를 제공
    • KoNLPy(http://konlpy.org/)
      • Hannanum, Kkma, Komoran, Mecab, Okt 형태소 분석기 지원
      • 내부 품사 태깅 클래스들의 성능 비교 : https://konlpy.org/ko/latest/morph/
  • 임베딩
    • 문자열을 숫자로 변환하여 벡터(Vector) 공간에 표현하는 방법
    • 빈도 기반 : 문서에 등장하는 단어의 빈도를 계산해서 행렬로 표현하거나 가중치를 부여
      • TF(Term Frequency), DTM(Document Term Matrix), TF-IDF(Term Frequency-Inverse Document Frequency)
    • 토픽 기반 : 문서에 잠재된 주제(Latent Topic)를 추론(Inference)하기 위한 임베딩
      • LSA(Latent Semantic Analysis, 잠재 의미분석)
    • 예측(Prediction) 기반 : 다음 단어, 주변 단어, 마스킹 된 단어의 예측 등을 위한 임베딩
      • Word2Vec, FastText, BERT, ELMo, GPT

1-4. 워드 임베딩

  • 워드 임베딩(Word Embedding)
    • 단어를 컴퓨터가 이해할 수 있도록 벡터(숫자들의 배열)로 변환하는 기법
    • 자연어(텍스트)를 수치화하여 기계 학습 모델이 처리할 수 있도록 만드는 자연어 처리(NLP)의 핵심 기술 중 하나
  • 워드 임베딩 방법
    • 이진 인코딩(Binary Encoding) 또는 원-핫 인코딩
    • TF 인코딩(TF Encoding)
    • TDM(Term Document Matrix)
    • TF-IDF 인코딩(TF_IDF Encoding)
    • 잠재 의미분석 인코딩(Latent Semantic Analysis Encoding)
    • Word2Vec 임베딩(Word2Vec Embedding) : 구글에서 개발. CBOW, Skip-gram이라는 두 가지 학습 방식 존재
    • Glove(Global Vectors) : 전체 말뭉치의 동시 등장 통계를 기반으로 학습
    • FastText : 단어를 문자 단위 n-그램으로 나누어 처리. 신조어나 오탈자에도 강함
    • ELMo, BERT : 문맥을 고려하는 워드 임베딩 (동일 단어라도 문맥에 따라 벡터가 다름)
  • Term Frequency : 문서에서 용어가 나타나는 총 회수로 정의

text = "John likes to watch movies. Mary likes movies too.\
 Mary also likes to watch football games."
 
words = text.replace('.', '').split()
print(words)
['John', 'likes', 'to', 'watch', 'movies', 'Mary', 'likes', 
'movies', 'too', 'Mary', 'also', 'likes', 'to', 'watch', 'football', 'games']

import numpy as np
word_count = np.unique(words, return_counts=True)
print(word_count)
(array(['John', 'Mary', 'also', 'football', 'games', 'likes', 'movies',
       'to', 'too', 'watch'], dtype='<U8'), array([1, 2, 1, 1, 1, 3, 2, 2, 1, 2]))
word_to_cnt = {}
for word, cnt in zip(*word_count):
    word_to_cnt[word] = cnt
print(word_to_cnt)
{np.str_('John'): np.int64(1), np.str_('Mary'): np.int64(2), np.str_('also'): np.int64(1),
np.str_('football'): np.int64(1), np.str_('games'): np.int64(1), np.str_('likes'): np.int64(3),
np.str_('movies'): np.int64(2), np.str_('to'): np.int64(2), np.str_('too'): np.int64(1), 
np.str_('watch'): np.int64(2)}
  • Term Document Matrix
    • 문서별로 단어의 빈도수를 계산해서 행렬로 만들어 놓은 것
    • 예제 텍스트가 두 개의 문장이라면 문장마다 단어의 빈도를 계산해서 표현할 수 있음

corpus = [
    "John likes to watch movies. Mary likes movies too.",
    "Mary also likes to watch football games."
]

from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
dtm_array = vector.fit_transform(corpus).toarray()
tf_dic = vector.vocabulary_
print(dtm_array)
print(tf_dic)
[[0 0 0 1 2 1 2 1 1 1]
 [1 1 1 0 1 1 0 1 0 1]]
{'john': 3, 'likes': 4, 'to': 7, 'watch': 9, 'movies': 6, 'mary': 5, 'too': 8, 
'also': 0, 'football': 1, 'games': 2}
import pandas as pd
tf_dic_sorted = dict(sorted(tf_dic.items(),
                            key=lambda item: item[1]))
df = pd.DataFrame(dtm_array, columns=tf_dic_sorted.keys())
print(df)
   also  football  games  john  likes  mary  movies  to  too  watch
0     0         0      0     1      2     1       2   1    1      1
1     1         1      1     0      1     1       0   1    0      1
  • TF-IDF
    • Term Frequency-Inverse Document Frequency
    • 문서별로 단어의 빈도수를 계산해서 행렬로 만들어 놓은 것
    • IDF는 전체 문서에서 용어가 얼마나 자주 발생하는지 정의
    • 전체 문서 세트에서 발생하는 용어의 가중치 균형을 맞추는 데 사용
    • TF-IDF 점수가 클수록 해당 용어가 문서에서 더 관련성이 높음
    • 단어가 기사에서 등장한 횔수에 비례 / 이 단어가 전체 영역에서 등장한 횟수에 반비례

pd.set_option("display.max_columns", 100)

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_vec = TfidfVectorizer()
tfidf_array = tfidf_vec.fit_transform(corpus).toarray()
tfidf_dic = tfidf_vec.vocabulary_
tfidf_dic_sorted = dict(sorted(tfidf_dic.items(),
                               key=lambda item: item[1]))
tfidf_dtm = pd.DataFrame(tfidf_array,
                         columns=tfidf_dic_sorted.keys())
print(tfidf_dtm)
       also  football     games      john     likes      mary    movies  \
0  0.000000  0.000000  0.000000  0.323699  0.460629  0.230315  0.647398   
1  0.446101  0.446101  0.446101  0.000000  0.317404  0.317404  0.000000   

         to       too     watch  
0  0.230315  0.323699  0.230315  
1  0.317404  0.000000  0.317404
  • Word2Vec
    • 워드 임베딩 모델을 생성하는 데 사용되는 얕은 2계층 신경망
    • 많은 어위 기반 데이터 세트를 입력으로 수집하고 사전의 각 단어가 고유한 벡터에 대응되도록 벡터 공간을 출력하는 방식으로 작동
    • CBOW(Continuous Bag of Words)와 Skip-Gram의 두 가지 모델이 있음
      • CBOW는 주변 단어를 임베딩하여 중심 단어를 예측
      • Skip-Gram은 중심 단어를 임베딩하여 주변 단어를 예측

  • 윈도우와 슬라이딩 윈도우
    • 윈도우 : 중심 단어(Target Word)를 기준으로 해서 참조하고자 하는 주변 단어(Context Word)의 범위
      • 만일 윈도우 크기가 2인 경우 "quality is more important than quantity"에서
      • 중심 단어가 'quality'인 경우 주변 단어는 'is'와 'more'이며, 중심 단어가 'more'인 경우 앞의 두 단어 'quality'와 'is', 뒤의 두 단어 'important'와 'than' 이렇게 4개 단어가 주변 단어가 됨
    • 슬라이딩 윈도우(Sliding Window)는 전체 학습 문장에 대해 윈도우를 이동하며 학습하기 위해 중심 단어와 주변 단어 데이터셋을 추출하는 과정

  • CBOW(Continuous Bag-of-Words)
    • 주변 단어(Context Word)를 임베딩하여 중심 단어(Target Word)를 예측
      • CBOW는 소규모 데이터베이스 작업에 적합한 모델
      • RAM 메모리 요구사항도 필요하지 않음

  • Skip-gram
    • 중심 단어(Target Word)를 임베딩 하여 주변 단어(Context Word)를 예측

  • CBOW vs. Skip-gram
    • 두 모델은 대칭을 보여주지만, 아키텍처와 성능 면에서 다름
      • CBOW 모델은 주변 단어를 사용하여 중심 단어를 예측
      • CBOW 모델은 더 빠름
      • 더 적은 RAM이 필요하며 더 작은 데이터 베이스에 적합
      • 자주 사용되지 않는 단어의 처리를 보장하지 않음
      • Skip-gram 모델은 단어의 맥락적 유사성에 의존하여 특정 단어를 둘러싼 단어를 예측
      • Skip-gram 모델은 빈도가 낮은 단어에 대해 더 정확
      • 더 큰 데이터베이스에 적합하며 작동하려면 더 많은 RAM이 필요
  • genism
    • CBOW, Skip-gram 등의 Word2Vec 적용을 위한 파이썬 라이브러리
    • genism.models.Word2Vec(data, sg, size, window, min_count)
      • data : 리스트 형태의 데이터입니다.
      • 0이면 CBOW, 1이면 Skip-gram 방식을 사용합니다.
      • size : 벡터의 크기를 지정합니다.
      • window : 윈도우의 크기입니다. 3이면 앞/뒤 3단어를 포함합니다.
      • min_count : 사용할 단어의 최소 빈도입니다. 3이면 3회 이하 단어는 무시합니다.

corpus = ["John likes to watch movies. Mary likes movies too",
          "Mary also likes to watch football games."]

word_list = []
for word in corpus:
    word_list.append(word.replace('.', '').split())

from gensim.models import Word2Vec
model = Word2Vec(word_list, sg=0, vector_size=100,
                 window=3, min_count=1)

print(model.wv.most_similar('likes'))
print(model.wv.similarity('movies', 'games'))
[('John', 0.21617142856121063), ('also', 0.09291722625494003), ('too', 0.027057476341724396), 
('football', 0.016134677454829216), ('Mary', -0.010840574279427528), ('to', -0.02775036357343197),
('movies', -0.05234673246741295), ('games', -0.059876296669244766), ('watch', -0.111670583486557)]
0.0640898
  • ChatGPT의 임베딩
    • 1. 토크나이저(tokenizer) 사용
      • ChatGPT는 문장을 단어 단위가 아니라 "토큰" 단위로 쪼갭니다.
        • 예를 들어:
        • "ChatGPT is amazing!" → ['Chat', 'GPT', ' is', ' amazing', '!']
      • 이때 쓰는 것이 GPT 전용 Byte-Pair Encoding (BPE) 기반 토크나이저.
    • 2. 토큰 임베딩(Token Embedding)
      • 모델이 사용하는 어휘집(vocabulary) 크기만큼의 임베딩 행렬 (embedding matrix)이 있음
        • 크기: [vocab_size, embedding_dim]
        • 예: [50,000, 768] 또는 [100,000, 1280] (모델 크기에 따라 다름)
      • 이 행렬은 처음에는 무작위 값으로 시작하지만, 사전학습 과정에서 계속 학습되어 최적화됨.
    • 3. 문맥 반영은 어떻게?
      • 임베딩된 토큰 벡터들은 Transformer 구조(즉, Attention 레이어들)를 통과하면서 문맥을 반영한 벡터로 변형됨.
      • 이걸 "컨텍스트 임베딩(contextual embedding)" 이라고 함.
      • "bank"가 "물가"로 쓰였는지 "은행"으로 쓰였는지 문맥을 보고 판단