Preprocessing Workflow
1. 코퍼스 수집 : 구입,외주,크롤링
2. 정제 : Task에 따른 노이즈 제거, 인코딩 변환
(3. 레이블링 : Task에 따른 문장 or 단어마다 labeling 수행)
4. Tokenization : 형태소 분석기 활용하여 분절 수행
(5. Subword Segmentation : 단어보다 더 작은 의미 추가 분절 수행)
6. Batchify : 사전 생성 및 word2index 맵핑 수행, 효율화를 위한 전/후처리
1. Sentence Segmentation
보통 모델에 입력하는 데이터는 1 sentence/line의 형태이다.
그러나 수집한 corpus에는 한 라인에 여러 문장이 들어있거나, 한 문장이 여러 라인에 들어있는 경우가 있다.
따라서 Sentence Segmentation을 통해 원하는 형태로 변환하면 된다.
NLTK
from nltk.tokenize import sent_tokenize
한국어 문장 분리기인 KSS
from kss import split_sentences
2. Tokenization
Tokenization을 하는 이유
: 두 개 이상의 다른 token들의 결합으로 이루어진 단어를 쪼개어 Vocabulary 숫자를 줄이고, 희소성(sparseness)를 낮추기 위해서
: 한국어는 교착어(어근에 접사가 붙어 다양한 단어가 파생되는 특징)
Part of Speech Tagging (POS)
형태소 분석: 형태소를 비롯하여, 어근, 접두사/접미사, 품사 등 다양한 언어적 속성 구조를 파악하는 것
품사 태깅: 형태소의 뜻과 문맥을 고려하여 그것에 마크업을 하는 것
Mecab 윈도우 설치 방법: https://uwgdqo.tistory.com/363
Mecab Tokenizer로 Tokenization
import csv
import MeCab
mecab = MeCab.Tagger()
with open('review.sorted.uniq.refined.tsv', encoding='utf-8') as f:
tr = csv.reader(f, delimiter='\t')
data = list(tr)
f.close()
with open('review.sorted.uniq.refined.tok.tsv', 'w', encoding='utf-8', newline='') as f:
tw = csv.writer(f, delimiter='\t')
for row in data:
row = mecab.parse(row[1])
target = row.replace("EOS", "").rstrip()
sent = ""
for i in target.split('\n'):
temp = i.split(',')[0].split('\t')
sent += (temp[0] + " ")
tw.writerow([row[0], sent])
f.close()