[AI] 토크나이저/임베딩 - 실습

 인공지능에서 챗봇(Chat bot)에 있어 데이터의 가공은 조금 특이한 것을 찾았다.

※ 해당 과정은 '한국어' 기준이다.


단순한 데이터(예를 들자면 타이타닉 생존자 혹은 날씨 데이터 등)에 있어서 결측치에 대해서는 보간 처리를 하여 값을 메우고, 편향치가 심한 데이터의 일부는 예외처리 하는 등 철저히 각 데이터에 대한 처리가 필요하다.(물론 이 과정 또한 최대한 요약하여 설명이 부족하지만 대체로 맞는 말일지도 모르겠다.)

자연어 처리에 있어 불용어(조사,  접속사) 등의 제거를 진행 하는 전처리 뿐만아니라, 토크나이저(Tokenizer)와 임베딩(Embedding) 과정을 진행한다.


토크나이저(Tokenization)  :  문장을 명사, 조사, 형용사, 동사 등으로 토큰(Token)화 하는 것을 총칭

임베딩 (Embedding) : 토큰화한 데이터에 대해 컴퓨터(인공지능)이 읽을 수 있도록 수치화 함을 말함

- 희소 표현 : 각 단어, 데이터에 대해 표현하고자 하는 단어의 인덱스 요소만 1, 이외에는 0 으로 나타내며, 100개의 단어에 대해 희소 벡터로 표현하면, 100개 만큼의 벡터의 크기가 발생한다.

ex) one-hot-encoding

실습 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from konlpy.tag import Komoran
import numpy as np
 
#Komoran 형태소 분석
= Komoran()
text = "오늘 날씨는 구름이 많아요."
= k.nouns(text) # 명사만 분석하여 출력
print(n)
 
# 단어, 위치에 대한 쌍으로 dictionary 구성
dics = {}
for word in n :
    if word not in dics.keys():
        dics[word] = len(dics)
print(dics)
 
nb_classes = len(dics) # 크기 : 3
targets = list(dics.values()) # Dictionary의 단어 값들 추출
 
# eye : 주어진 값(nb_classes)의 크기의 단위행렬 생성
one_hot_target = np.eye(nb_classes)[targets] #targets : 단어에 대응 되도록 설정
print(one_hot_target)
cs


- 분산 표현 : 각 단어, 데이터간 유사성에 정도의 값을 벡터 값으로 나타냄

요일에 대한 유사성을 띄는 월요일, 화요일 등의 단어들 간의 유사성 값이 높음

ex) Word2Vec

※ 기회가 되면 이론들은 따로 다시 정리할 예정

실습 코드 ) Komoran, Word2Vec 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from gensim.models import Word2Vec
from konlpy.tag import Komoran
 
# 파일 읽어오기
# 파일은 id, 문장, label 로 구성되어 있음
def read_review_data(filename):
    with open(filename, 'r', encoding='UTF8'as f:
        data = [line.split('\t'for line in f.read().splitlines()]
        #header 제거
        data = data[1:]
    return data
 
# 데이터 호출
review_data = read_review_data('./ratings.txt')
print(len(review_data))
 
#형태소 분석기 Komoran 사용
= Komoran()
#문장만 가져와서 tokenization 수행
docs = [k.nouns(sentence[1]) for sentence in review_data]
 
#Word2Vec 에 의한 분산 벡터 작성 수행
#sentences : 문장, vector_size : 단어 임베딩 벡터의 차원, window : 단어를 중심으로 다른 단어들과어 거리(윈도우)
#min_count : 단어 최소 빈도수 제한(빈도 수 이하의 단어들에 대해서는 작성하지 않음),
#sg : 0 or 1
#0 : CBOW 모델
#1 : skip-gram 
model = Word2Vec(sentences=docs, vector_size=200, window=4, hs=1, min_count=2, sg=1)
 
model.save('nvmc.model')
 
print('corpus_count : ',model.corpus_count)
print('corpus_total_words',model.corpus_total_words)
cs


- 내용 업데이트 24/10/8 : one-hot encoding 실습 내용 추가

댓글