SentencePiece는 많은 단어들을 처리하면서도 단어의 빈도수를 계산해서 subword 단위로 쪼개어 , Unknown이 발생할 확률을 줄이는 방법이라합니다.

참고

1. 센텐스피스(Sentencepiece)


Subword 패키지 중 유용한 패키지로 구글의 센텐스피스(Sentencepiece)가 있습니다. 내부 단어 분리 알고리즘을 사용하기 위해서, 데이터에 단어 토큰화를 먼저 진행한 상태여야 한다면 이 단어 분리 알고리즘을 모든 언어에 사용하는 것은 쉽지 않습니다. 영어와 달리 한국어와 같은 언어는 단어 토큰화부터가 쉽지 않기 때문입니다. 그런데, 이런 사전 토큰화 작업(pretokenization)없이 전처리를 하지 않은 데이터(raw data)에 바로 단어 분리 토크나이저를 사용할 수 있다면, 이 토크나이저는 그 어떤 언어에도 적용할 수 있는 토크나이저가 될 것입니다. 센텐스피스는 이 이점을 살려서 구현되었습니다. 센텐스피스는 사전 토큰화 작업없이 단어 분리 토큰화를 수행하므로 언어에 종속되지 않습니다.

!pip install sentencepiece

2. chat-bot 학습

파일

ChatBotData.csv

import pandas as pd
import sentencepiece as spm  # pip install sentencepiece
import re
import pickle

chat-bot 데이터를 corpus에 저장합니다.

corpus = pd.read_csv('ChatBotData.csv', header=0, encoding='utf-8')

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/54f90020-6a13-45b9-a82d-1b0d0cdc255c/142241.png

질문과 답변을 합쳐서 subword vocabulary 를 만들어 줍니다.

corpusQA = list(corpus['Q']) + list(corpus['A'])
결과:

['12시 땡!',
 '1지망 학교 떨어졌어',
 '3박4일 놀러가고 싶다',
 '3박4일 정도 놀러가고 싶다',
 'PPL 심하네',
 'SD카드 망가졌어',
 'SD카드 안돼',
 'SNS 맞팔 왜 안하지ㅠㅠ',
 'SNS 시간낭비인 거 아는데 매일 하는 중',
 'SNS 시간낭비인데 자꾸 보게됨',
 ...]

정규표현식을 통해 특수 문자를 제거하고, corpusQA 10개를 출력해봅니다.

corpusQA = [re.sub("([~.,!?\\"':;)(])", "", s) for s in corpusQA]
corpusQA[:10]
결과:

['12시 땡',
 '1지망 학교 떨어졌어',
 '3박4일 놀러가고 싶다',
 '3박4일 정도 놀러가고 싶다',
 'PPL 심하네',
 'SD카드 망가졌어',
 'SD카드 안돼',
 'SNS 맞팔 왜 안하지ㅠㅠ',
 'SNS 시간낭비인 거 아는데 매일 하는 중',
 'SNS 시간낭비인데 자꾸 보게됨']

Sentencepiece가 쓸 사전을 만들기 위해 corpusQA를 저장해 둡니다.