최근 다양한 분야에서 각광받는 NLP(자연어처리)는 많은 언어를 대상으로 수행될 수 있다.
하지만 본 처리 이전에 필히 거쳐야 할 과정이 있는데 바로 '전처리' 과정이다.
전처리를 진행하지 않고 NLP task를 수행하면 그 결과가 전처리를 한 결과와 비교했을 때 대부분 전저리를 한 데이터가 훨씬 좋은 성능과 insight를 준다.
데이터의 특성에 따라 전처리 과정이 다를 수 있기에 어떤 데이터인 지 파악하는 게 우선 요소다.
가령 예를 들면 영화 리뷰 데이인터인 IMDB datasets에는 데이터 중에 아무래도 표준 단어보단 gooood이라 던지, bb라던 지 통상적으로 표현하는 단어들도 포함되기 때문에 전처리 과정 이전, 어떤 데이터인 지 확인하는 게 우선으로 수행되어야 한다.
보통 일반적인 전처리 과정은 아래와 같다.
- tag 제거
- 띄어쓰기 문자 제거
- 문장 분리
- 토큰화
- 구두점, stopwords 제거
오늘은 위 방법 중 토큰화를 수행하는 토크나이저를 직접 생성하는 방법에 대해서 간단하게 알아보려고 한다.
(우선 imdb 데이터셋을 가져오면 정수 형태로 인코딩 되어 있는데 이 정수를 단어로 만드는 과정이 필요! -> 쉽게 찾아볼 수 있으니 다른 포스팅 참고)
def txt_preprocess(text):
my_text = copy.copy(text.translate(translator))
my_text = my_text.replace('br', '') # HTML 태그 제거
my_text = my_text.replace('\t', '') # 띄어 쓰기 제거
p = re.compile(r'<br\s*/?>|[^A-Za-z]') # 알파벳 제외한 추가 문자 제거
my_text = p.sub(' ', my_text)
result = [word for word in my_text.split() if word not in stopwords]
last = ' '.join(result)
return last
전처리 결과
(기존 corpus 결과와 다름을 확인할 수 있음)
from tokenizers import BertWordPieceTokenizer
tokenizer = BertWordPieceTokenizer(strip_accents=True, lowercase=True)
lowercase는 대소문에 대한 파라미터
strip_accencents는 발음 기호 제거에 대한 파리미터
with open('use.txt','w') as f:
f.write(use_txt) # 텍스트 파일 저장 ('use.txt'가 저장할 파일 이름)
data_file = 'use.txt'
vocab_size = 30000 # vocabulary 크기 지정
limit_alphabet = 1000 # 최대 글자 수 제한
min_frequency = 5 # 단어 등장 최소 빈도
tokenizer.train(
files = data_file,
vocab_size = vocab_size,
limit_alphabet = limit_alphabet,
min_frequency = min_frequency
)
생성된 토크나이저 정보
tokenizer.save_model('./') # 현재 경로에 vocab.txt 생성
df = pd.read_fwf('vocab.txt', header = None)
# 현재 경로에 생성된 파일 Dataframe으로 생성
토크나이저 Dataframe