Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Neural Radiance Field
- NeRF paper
- 딥러닝
- 논문 리뷰
- 파이토치
- paper review
- GAN
- Python
- panoptic segmentation
- IROS
- Paper
- 2022
- pytorch
- 리눅스
- 논문
- panoptic nerf
- 경희대
- 융합연구
- 논문리뷰
- CVPR
- docker
- ICCV 2021
- Deep Learning
- linux
- CVPR2023
- Computer Vision
- NERF
- Semantic Segmentation
- ICCV
- Vae
Archives
- Today
- Total
윤제로의 제로베이스
자연어 처리 전처리 이해하기 본문
01. 자연어 처리 전처리 이해하기
자연어 처리는 일반적으로 토큰화, 단어 집합 생성, 정수 인코딩, 패딩, 벡터화의 과정을 거칩니다. 이번 챕터에서는 이러한 전반적인 과정에 대해서 이해합니다. ##**1. ...
wikidocs.net
1. 토근화(Tokenization)
주어진 텍스트를 단어 또는 문자 단위로 자르는 것을 토큰화라고 한다.
en_text = "A Dog Run back corner near spare bedrooms"
1) spyCy 사용하기
import spacy
spacy_en = spacy.load('en')
def tokenize(en_text):
return [tok.text for tok in spacy_en.tokenizer(en_text)]
print(tokenize(en_text))
['A', 'Dog', 'Run', 'back', 'corner', 'near', 'spare', 'bedrooms']
2) NLTK 사용하기
!pip install nltk
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
print(word_tokenize(en_text))
['A', 'Dog', 'Run', 'back', 'corner', 'near', 'spare', 'bedrooms']
3) 띄어쓰기로 토큰화
print(en_text.split())
['A', 'Dog', 'Run', 'back', 'corner', 'near', 'spare', 'bedrooms']
영어의 경우 띄어쓰기 단위로 토큰화를 해도 단어들 간 구분이 꽤나 명화하기 때문에 토큰화 작업이 수월하다.
하지만 한국어의 경우에는 토큰화 작업이 까다롭다.
그 이유는 한국어는 조사, 접사 등으로 인해 단순 띄어쓰기 단위로 나누면 같은 단어가 다른 단어로 인식되어서 단어 집합의 의미가 불필요하게 커지기 때문이다.
- 단어 집합이란 중복을 제거한 텍스트의 총 단어의 집합을 의미한다.
4) 한국어 띄어쓰기 토큰화
kor_text = "사과의 놀라운 효능이라는 글을 봤어. 그래서 오늘 사과를 먹으려고 했는데 사과가 썩어서 슈퍼에 가서 사과랑 오렌지 사왔어"
print(kor_text.split())
['사과의', '놀라운', '효능이라는', '글을', '봤어.', '그래서', '오늘', '사과를', '먹으려고', '했는데', '사과가', '썩어서', '슈퍼에', '가서', '사과랑', '오렌지', '사왔어']
'사과'라는 단어가 4번 등장했지만, '의', '를', '가', '랑' 등이 붙어있어 이를 제거하지 않으면 기계는 전부 다른 단어라고 인식하게 된다.
5) 형태소 토큰화
!git clone https://github.com/SOMJANG/Mecab-ko-for-Google-Colab.git
%cd Mecab-ko-for-Google-Colab
!bash install_mecab-ko_on_colab190912.sh
from konlpy.tag import Mecab
tokenizer = Mecab()
print(tokenizer.morphs(kor_text))
['사과', '의', '놀라운', '효능', '이', '라는', '글', '을', '봤', '어', '.', '그래서', '오늘', '사과', '를', '먹', '으려고', '했', '는데', '사과', '가', '썩', '어서', '슈퍼', '에', '가', '서', '사과', '랑', '오렌지', '사', '왔', '어']
6) 문자 토큰화
print(list(en_text))
['A', ' ', 'D', 'o', 'g', ' ', 'R', 'u', 'n', ' ', 'b', 'a', 'c', 'k', ' ', 'c', 'o', 'r', 'n', 'e', 'r', ' ', 'n', 'e', 'a', 'r', ' ', 's', 'p', 'a', 'r', 'e', ' ', 'b', 'e', 'd', 'r', 'o', 'o', 'm', 's']
2. 단어 집합(Vocabulary) 생성
단어 집합(Vocabulary)이란 중복을 제거한 텍스트의 총 단어의 집합을 의미한다.
import urllib.request
import pandas as pd
from konlpy.tag import Mecab
from nltk import FreqDist
import numpy as np
import matplotlib.pyplot as plt
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings.txt", filename="ratings.txt")
data = pd.read_table('ratings.txt') # 데이터프레임에 저장
# 불용어 정의
stopwords=['의','가','이','은','들','는','좀','잘','걍','과','도','를','으로','자','에','와','한','하다']
tokenizer = Mecab()
tokenized=[]
for sentence in sample_data['document']:
temp = tokenizer.morphs(sentence) # 토큰화
temp = [word for word in temp if not word in stopwords] # 불용어 제거
tokenized.append(temp)
vocab = FreqDist(np.hstack(tokenized)) # 단어 집합 크기 663
vocab_size = 500
# 상위 vocab_size개의 단어만 보존
vocab = vocab.most_common(vocab_size)
print('단어 집합의 크기 : {}'.format(len(vocab)))
3. 각 단어에 고유한 정수 부여
enumerate()는 순서가 있는 자료형(list, set, tuple, dictionary, string)을 입력으로 받아 인덱스를 순차적으로 리턴한다는 특징이 있다.
인덱스 0과 1은 다른 용도로 남겨두고 2부터 501까지 순차적으로 인덱스를 부여해보자.
word_to_index = {word[0] : index + 2 for index, word in enumerate(vocab)}
word_to_index['pad'] = 1
word_to_index['unk'] = 0
encoded = []
for line in tokenized: #입력 데이터에서 1줄씩 문장을 읽음
temp = []
for w in line: #각 줄에서 1개씩 글자를 읽음
try:
temp.append(word_to_index[w]) # 글자를 해당되는 정수로 변환
except KeyError: # 단어 집합에 없는 단어일 경우 unk로 대체된다.
temp.append(word_to_index['unk']) # unk의 인덱스로 변환
encoded.append(temp)
4. 길이가 다른 문장들을 모두 동일한 길이로 바꿔주는 패딩(padding)
패딩 작업은 정해준 길이로 무든 샘플들의 길이를 맞춰주되, 길이가 정해준 길이보다 짧은 샘플들에는 'pad' 토큰을 추가하여 길이를 맞춰주는 작업이다.
max_len = 63
# 가장 긴 샘플의 길이에 맞춰주는 것
for line in encoded:
if len(line) < max_len: # 현재 샘플이 정해준 길이보다 짧으면
line += [word_to_index['pad']] * (max_len - len(line)) # 나머지는 전부 'pad' 토큰으로 채운다.
'Background > Pytorch 기초' 카테고리의 다른 글
토치텍스트 튜토리얼(Torchtext tutorial) 한국어 (0) | 2022.01.19 |
---|---|
토치 텍스트 튜토리얼(Torchtext tutorial) 영어 (0) | 2022.01.19 |
깊은 CNN으로 MNIST분로하기 (0) | 2022.01.19 |
CNN으로 MNIST 분류하기 (0) | 2022.01.19 |
합성곱과 풀링(Convolution and Pooling) (0) | 2022.01.19 |