본문 바로가기
IT 도서/Pytorch로 시작하는 딥 러닝 입문

07. 자연어 처리의 전처리

by 이민우 2021. 3. 2.
728x90
반응형

wikidocs.net/64517

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

*해당 글은 학습을 목적으로 위의 포스팅 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인은 위의 링크에서 확인하실 수 있습니다.

 

자연어 처리의 전처리

  • 자연어 처리는 일반적으로 토큰화, 단어 집합 생성, 정수 인코딩, 패딩, 벡터화의 과정을 거친다.

 

 

토큰화 (Tokenization)

  • 텍스트를 단어 또는 문자 단위로 자르는 것
  • 파이썬의 기본 함수인 split을 사용할 수도 있고, 영어의 경우 spaCy와 NLTK를 사용할 수도 있다.
  • 영어의 경우 띄어쓰기 단위로 토큰화를 해도 단어들 간 구분이 명확하다.
  • 하지만 한국어는 조사, 접사 등으로 단순 띄어쓰기로 나누면 같은 단어가 다른 단어로 인식되어 단어 집합의 크기가 불필요하게 커지게 될 수 있다.
  • 예를 들어 '사과'라는 같은 단어를 가리키고 있음에도 사과가, 사과를이 다르게 인식될 수 있다.
  • 이러한 상황을 방지하기 위해 한국어는 토큰화를 시킬 때 형태소 분석기를 사용해야 한다.

*단어 집합 : 중복을 제거한 텍스트의 총 단어의 집합

 

 

단어 집합 (Vocabulary)

  • 중복을 제거한 텍스트의 총 단어의 집합
  • 각 단어에 대해 고유한 정수 (id)를 붙여준다.
  • 예를 들자면, [나는, 사과를, 먹었다] =(토큰화)=> [나, 는, 사과, 를, 먹, 는, 다] =(단어 집합 추출) => [나 : 1, 는 : 2, 사과 : 3, ... ]

 

 

패딩 (Padding)

  • 길이가 다른 문장들을 동일한 길이로 바꿔주는 작업

 

 

 

영어 전처리

import urllib.request
import pandas as pd
import torchtext

#IMDB 리뷰 데이터
urllib.request.urlretrieve("https://raw.githubusercontent.com/LawrenceDuan/IMDb-Review-Analysis/master/IMDb_Reviews.csv", filename="IMDb_Reviews.csv")
df = pd.read_csv('IMDb_Reviews.csv', encoding='latin1') #총 갯수 : 5만개

#학습용과 테스트 용으로 분리
train_df = df[:25000]
test_df = df[25000:]

#별도로 저장
train_df.to_csv("train_data.csv", index=False)
test_df.to_csv("test_data.csv", index=False)


#필드 정의
#torch.text.data에는 필드라는 도구가 있다.
#이 필드를 통해 앞으로 어떤 전처리를 할 것인지 정의가 가능하다.
from torchtext import data # torchtext.data 임포트

# 필드 정의
TEXT = data.Field(sequential=True,        #시퀀스의 데이터 여부
                  use_vocab=True,         #단어 집합을 만들 것인지
                  tokenize=str.split,     #어떤 토큰화 함수를 사용할 것인지
                  lower=True,             #영어 데이터를 전부 소문자화 할 것인지 (False가 기본값)
                  batch_first=True,       #미니 배치 차원을 맨 앞으로 하여 데이터를 불러올 것인자 (False가 기본값)
                                          #batch_first가 True이면 [B, 문장의 최대 길이] False이면 [문장의 최대 길이, B]
                  fix_length=20)          #최대 허용 길이. 이 길이에 맞춰 패딩 작업 진행

LABEL = data.Field(sequential=False,
                   use_vocab=False,
                   batch_first=False,
                   is_target=True)

#데이터 셋 만들기
from torchtext.data import TabularDataset

train_data, test_data = TabularDataset.splits(
        path='.', train='train_data.csv', test='test_data.csv', format='csv',
        fields=[('text', TEXT), ('label', LABEL)], skip_header=True)

print(vars(train_data[0]))


#단어 집합 만들기
TEXT.build_vocab(train_data, min_freq=10, max_size=10000) #min_freq : 단어 집합에 추가 시 단어의 최소 등장 빈도 조건 추가 (10개 이상만 추가)
print(TEXT.vocab.stoi)


#토치 텍스트의 데이터로더 만들기
#데이터셋에서 미니 배치만큼 데이터를 로드하기 위함
from torchtext.data import Iterator

train_loader = Iterator(dataset=train_data, batch_size = 128)
test_loader = Iterator(dataset=test_data, batch_size = 128)

*torchtext : 텍스트에 대한 여러 추상화 기능을 제공하는 자연어 처리 라이브러리

*파일 로드, 토큰화, 단어 집합 생성, 정수 인코딩, 단어 벡터 생성, 배치화 등의 작업을 지원한다.

 

 

 

한국어 전처리

import urllib.request
import pandas as pd

#네이버 영화 리뷰 데이터
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings_train.txt", filename="ratings_train.txt")
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt", filename="ratings_test.txt")


train_df = pd.read_table('ratings_train.txt') #150000개
test_df = pd.read_table('ratings_test.txt')   # 50000개

#필드 정의
from torchtext import data # torchtext.data 임포트
from konlpy.tag import Mecab

# Mecab을 토크나이저로 사용
tokenizer = Mecab()

# 필드 정의
ID = data.Field(sequential = False,
                use_vocab = False) # 실제 사용은 하지 않을 예정
TEXT = data.Field(sequential=True,
                  use_vocab=True,
                  tokenize=tokenizer.morphs, # 토크나이저로는 Mecab 사용.
                  lower=True,
                  batch_first=True,
                  fix_length=20)
LABEL = data.Field(sequential=False,
                   use_vocab=False,
                   is_target=True)


#데이터셋 만들기
from torchtext.data import TabularDataset

train_data, test_data = TabularDataset.splits(
        path='.', train='ratings_train.txt', test='ratings_test.txt', format='tsv',
        fields=[('id', ID), ('text', TEXT), ('label', LABEL)], skip_header=True)

#단어 집합 만들기
TEXT.build_vocab(train_data, min_freq=10, max_size=10000)

#데이터 로더 만들기
from torchtext.data import Iterator

train_loader = Iterator(dataset=train_data, batch_size = 128)
test_loader = Iterator(dataset=test_data, batch_size = 128)
728x90
반응형