인공지능에서 챗봇(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 형태소 분석 k = Komoran() text = "오늘 날씨는 구름이 많아요." n = 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 사용 k = 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 실습 내용 추가
댓글
댓글 쓰기