728x90
반응형
0. 포스팅 목록 & GitHub
(깃허브 스타 버튼 눌러주시면 글 작성에 큰 도움이 됩니다!)
https://github.com/Seokii/Chatbot4Univ
https://seokii.tistory.com/146
1. 단어 사전 구축
입력받은 텍스트를 POS 태깅과 불용어 처리 과정을 거친 후
컴퓨터가 텍스트를 처리하기 위해서 토크나이징된 텍스트에 대해 숫자로 바꿔주는 처리가 필요합니다.
이렇게 단어 임베딩을하는 과정에서 단어를 어떤 숫자로 바꿔줄지에 대한 단어 사전을 구축해야 합니다.
구축한 텍스트 데이터를 바탕으로 빈도순을 기준으로 단어 사전을 구축했습니다.
# train_tools/dict/create_dict.py
# 단어 사전 파일 생성 코드입니다.
# 챗봇에 사용하는 사전 파일
from utils.Preprocess import Preprocess
from tensorflow.keras import preprocessing
import pickle
import pandas as pd
# 말뭉치 데이터 읽어오기
movie_review = pd.read_csv('../../변형데이터/영화리뷰.csv')
purpose = pd.read_csv('../../변형데이터/용도별목적대화데이터.csv')
topic = pd.read_csv('../../변형데이터/주제별일상대화데이터.csv')
common_sense = pd.read_csv('../../변형데이터/일반상식.csv')
movie_review.dropna(inplace=True)
purpose.dropna(inplace=True)
topic.dropna(inplace=True)
common_sense.dropna(inplace=True)
text1 = list(movie_review['document'])
text2 = list(purpose['text'])
text3 = list(topic['text'])
text4 = list(common_sense['query']) + list(common_sense['answer'])
corpus_data = text1 + text2 + text3 + text4
# 말뭉치 데이터에서 키워드만 추출해서 사전 리스트 생성
p = Preprocess()
dict = []
for c in corpus_data:
pos = p.pos(c)
for k in pos:
dict.append(k[0])
# 사전에 사용될 word2index 생성
# 사전의 첫 번째 인덱스에는 OOV 사용
tokenizer = preprocessing.text.Tokenizer(oov_token='OOV', num_words=100000)
tokenizer.fit_on_texts(dict)
word_index = tokenizer.word_index
print(len(word_index))
# 사전 파일 생성
f = open("chatbot_dict.bin", "wb")
try:
pickle.dump(word_index, f)
except Exception as e:
print(e)
finally:
f.close()
- pandas로 csv 파일을 불러와 문장들을 리스트로 저장했습니다. 그 과정에서 결측값 제거도 진행했습니다.
- 앞선 글에서 구현한 전처리기를 통해 토크나이징을 수행했습니다.
- OOV 토큰을 추가해 단어 사전 외의 단어가 입력될 경우 OOV 토큰으로 처리하도록 합니다.
- 텐서플로우의 Tokenizer 라이브러리를 통해 단어 사전을 만들었습니다.
- 단어 사전에 포함되는 단어의 수를 가장 많이 등장한 10만개의 단어로 지정했습니다.
- 처리할 문장의 수가 약 200만개 정도이며, 대략 15분 정도 소요되었습니다.
2. 단어 사전 테스트
# test/chatbot_dict_test.py
import pickle
from utils.Preprocess import Preprocess
# 단어 사전 불러오기
f = open("../train_tools/dict/chatbot_dict.bin", "rb")
word_index = pickle.load(f)
f.close()
sent = "안녕하세요. 테스트 코드입니다. 단어사전 만들기 성공!"
# 전처리 객체 생성
p = Preprocess(userdic='../utils/user_dic.tsv')
# 형태소 분석기 실행
pos = p.pos(sent)
# 품사 태그 없이 키워드 출력
keywords = p.get_keywords(pos, without_tag=True)
for word in keywords:
try:
print(word, word_index[word])
except KeyError:
# 해당 단어가 사전에 없는 경우 OOV 처리
print(word, word_index['OOV'])
3. 텍스트 전처리기에 단어 사전 추가
이전 글에서 텍스트 전처리기를 만들었습니다.
텍스트 전처리 코드에 단어 사전을 불러와 정수 인코딩을 수행하는 코드를 추가했습니다.
from konlpy.tag import Komoran
import pickle
class Preprocess:
def __init__(self, word2index_dic='../train_tools/dict/chatbot_dict.bin' ,userdic='user_dic.tsv'): # userdic 인자에는 사용자 정의 사전 파일 경로 입력가능
# 단어 인덱스 사전 불러오기
if(word2index_dic != ''):
f = open(word2index_dic, "rb")
self.word_index = pickle.load(f)
f.close()
print("success load word_dic")
else:
self.word_index = None
print("fail load word_dic")
# 형태소 분석기 초기화
self.komoran = Komoran(userdic=userdic)
# 제외할 품사
# 참조 : https://docs.komoran.kr/firststep/postypes.html
# 관계언 제거, 기호 제거
# 어미 제거
# 접미사 제거
self.exclusion_tags = [
'JKS', 'JKC', 'JKG', 'JKO', 'JKB', 'JKV', 'JKQ',
# 주격조사, 보격조사, 관형격조사, 목적격조사, 부사격조사, 호격조사, 인용격조사
'JX', 'JC',
# 보조사, 접속조사
'SF', 'SP', 'SS', 'SE', 'SO',
# 마침표,물음표,느낌표(SF), 쉼표,가운뎃점,콜론,빗금(SP), 따옴표,괄호표,줄표(SS), 줄임표(SE), 붙임표(물결,숨김,빠짐)(SO)
'EP', 'EF', 'EC', 'ETN', 'ETM',
# 선어말어미, 종결어미, 연결어미, 명사형전성어미, 관형형전성어미
'XSN', 'XSV', 'XSA'
# 명사파생접미사, 동사파생접미사, 형용사파생접미사
]
# 형태소 분석기 POS 태거
def pos(self, sentence):
return self.komoran.pos(sentence)
# 불용어 제거 후 필요한 품사 정보만 가져오기
def get_keywords(self, pos, without_tag=False):
f = lambda x: x in self.exclusion_tags
word_list = []
for p in pos:
if f(p[1]) is False:
word_list.append(p if without_tag is False else p[0])
return word_list
# 키워드를 단어 인덱스 시퀀스로 변환
def get_wordidx_sequence(self, keywords):
if self.word_index is None:
return []
w2i = []
for word in keywords:
try:
w2i.append(self.word_index[word])
except KeyError:
# 해당 단어가 사전에 없는 경우 OOV 처리
w2i.append(self.word_index['OOV'])
return w2i
728x90
반응형
'머신러닝 & 딥러닝 > 자연어처리' 카테고리의 다른 글
[NLP] 한국어 자연어 추론(Korean NLI) - KLUE Dataset & ELECTRA (0) | 2022.07.27 |
---|---|
대학교 AI 질의응답 챗봇 만들기 - 3. 의도 분류 모델(CNN) (0) | 2022.07.23 |
대학교 AI 질의응답 챗봇 만들기 - 1. 사용 데이터 & 텍스트 전처리기 (1) | 2022.07.21 |
[NLP] 도서 자료 텍스트 요약(Text Summarization) - TextRank (use gensim) (0) | 2022.06.30 |
[NLP] 네이버 영화 리뷰 데이터(nsmc) 감성 분석 - CNN (0) | 2022.06.30 |
댓글