NLP/NLP 기초

[NLP] Data Preprocessing

데이터 세상 2021. 3. 15. 19:02
728x90
반응형

Data Preprocessing

  • 문장 부호 제거
  • 불용어 제거
  • 단어 최대 길이 설정
  • 단어 패딩
  • 벡터 표상화

불용어 제거

  • 문장에서 자주 출현하나 전체적인 의미에 큰 영향을 주지 않는 단어
  • 영어에서는 조사, 관사 등과 같은 어휘
  • 불용어가 포함된 데이터 모델링 시 노이즈를 줄일 수 있는 경우 불용어 제거가 좋음
  • 데이터가 많고 문장 구문에 대한 전체적인 패턴을 모델링하고자 하는 경우에는 역효과 날 수 있음
  • 불용어 제거 전에는 영문의 경우 모든 단어를 소문자로 변경 후 처리 필요
import re
from nltk.corpus import stopwords

# 영어 불용어 set을 만든다
stop_words = set(stopwords.words('english'))

# 영어가 아닌 특수문자를 공백으로 치환
doc_text = re.sub("[^a-zA-Z]", " ", doc_text)

# 소문자로 변환한 후 단어마다 나눠서 단어 리스트로 만든다
words = doc_text.lower().split()

# 불용어를 제거한 리스트를 만든다.
words = [w for w in words if not w in stop_words]

# 단어 리스트를 공백을 넣어서 하나의 글로 합친다
clean_text = ' '.join(words)

한국어 전처리

  • 한국어의 경우 별도 불용어 사전이 없으며 상황에 따라 지정 후 사용
  • 형태소 단위 구분을 위한 별도의 형태소 분석기를 사용
import re
from konlpy.tag import Okt

# 별도의 한글 불용어 지정
stop_words = set(["은","는","이","가"])

# 한글 및 공백을 제외한 문자를 모두 제거
review_text = re.sub("[^가-힣ㄱ-ㅎㅏ-ㅣ\\s]", "", review)

# Okt 객체를 활용해 형태소 단위로 나눔
okt = Okt()
word_review = okt.morphs(review_text, stem=True)

# 불용어 제거
word_review = [token for token in word_review if not token in stop_words]

 

단어 벡터화

단어를 인덱스로 벡터화하기 전에 입력값의 길이가 동일해야 하기 때문에 일정 길이로 자르고 부족한 부분은 특정값으로 채우는 패딩 과정을 진행해야 한다

Tokenizer()

from tensorflow.python.keras.preprocessing.text import Tekenizer

tokenizer = Tokenizer()
tokenizer.fit_on_texts(clean_text)
text_sequences = tokenizer.texts_to_sequences(clean_text)

# 단어 사전 확인
word_vocab = tokenizer.word_index
word_vocab["<PAD>"] = 0
# 전체 단어 개수 확인
print("전체 단어 개수: ", len(word_vocab))

pad_sequences()

from tensorflow.python.keras.preprocessing.sequence import pad_sequences

# 문장 최대 길이 지정
# padding: 0 값을 데이터 앞에 넣을지 뒤에 넣을지를 설정
# 단어 개수의 통계를 계산했을 때 나왔던 중간값을 활용
MAX_SEQUENCE_LENGTH = 174
train_inputs = pad_sequences(text_sequences, maxlen=MAX_SEQUENCE_LENGTH, padding='post')

print('Shape of train data:', train_inputs.shape)
  • 문장 최대 길이 지정
  • padding: 0 값을 데이터 앞에 넣을지 뒤에 넣을지를 설정
  • 문장 최대 길이는 단어 개수의 통계를 계산했을 때 나왔던 중간값을 활용
  • 이상치 데이터가 길이가 지나치게 길면 평균이 급격히 올라갈 수 있기 때문에 중간값 활용 경우 많음

Train Label

  • 학습 라벨, 즉 정답을 나타내는 값을 Numpy 배열로 저장
train_labels = np.array(train_data["sentiment'])
print('Shape of label tensor:', train_labels.shape)

References

728x90
반응형

'NLP > NLP 기초' 카테고리의 다른 글

[NLP] Corpus  (0) 2021.04.05
[NLP] 자연어 처리 난제  (0) 2021.04.05
[NLP] 텍스트 전처리  (0) 2021.03.15
[NLP] Kaggle  (0) 2021.03.15
EDA(Exploratory Data Analysis)  (0) 2021.03.15