🚩λ”₯λŸ¬λ‹ 기초 - part22. NLP μ΄ν•΄ν•˜κΈ°

vincaΒ·2022λ…„ 12μ›” 15일
0

πŸŒ“ AI/DL - theory

λͺ©λ‘ 보기
22/24
post-thumbnail

Introduction

μžμ—°μ–΄ μ²˜λ¦¬μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ³  MLPλ₯Ό ν†΅ν•˜μ—¬ μ˜ν™”λ¦¬λ·° λ¬Έμž₯에 λŒ€ν•œ 긍정/뢀정을 μ˜ˆμΈ‘ν•΄λ³Έλ‹€.

μžμ—°μ–΄ μ²˜λ¦¬λž€ λ¬΄μ—‡μΌκΉŒ?

  • Natural Languate Processing (NLP)
  • 컴퓨터가 인간이 μ‚¬μš©ν•˜λŠ” μ–Έμ–΄(μŒμ„±μ΄λ‚˜ ν…μŠ€νŠΈ)λ₯Ό μ΄ν•΄ν•˜κ³  λΆ„μ„ν•˜λŠ” 기술
    μžμ—°μ–΄λ‘œ λ§Œλ“€μ–΄μ§„ λͺ¨λ“  데이터에 λŒ€ν•΄μ„œ μ΄ν•΄ν•˜κ³  λ‹΅ν•œλ‹€.

μ‹œν€€μŠ€ 데이터 이해

연관성이 μžˆλŠ” μ—°μ†λœ 데이터

ex.) ν…μŠ€νŠΈ, μ‹œκ³„μ—΄ 데이터 λ“±

μ‹œν€€μŠ€ 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” μ‘μš© λΆ„μ•Ό

  • λ¬Έμ„œ λΆ„λ₯˜λ‚˜ μ‹œκ³„μ—΄ λΆ„λ₯˜ : κΈ€μ˜ μ£Όμ œλ‚˜ μ €μžλ₯Ό μ‚΄νŽ΄ λ³΄λŠ” 기술
  • μ‹œκ³„μ—΄ 비ꡐ : 두 λ¬Έμ„œλ‚˜ 주식 κ°€κ²©μ˜ κ΄€λ ¨ 정도 μΆ”μ •
  • μ‹œν€€μŠ€ to μ‹œν€€μŠ€ ν•™μŠ΅ : ν•œκΈ€ λ¬Έμž₯을 μ˜μ–΄λ‘œ λ²ˆμ—­
  • 감성 뢄석 : νŠΈμœ—ν„°λ‚˜ μ˜ν™” 리뷰가 긍정인지 뢀정인지 λΆ„λ₯˜
  • μ‹œκ³„μ—΄ 예츑 : 졜근 λ‚ μ‹œ 데이털λ₯΄ 기반으둜 ν–₯ν›„ 날씨 예츑
  • μ–Έμ–΄ λͺ¨λΈ 생성

ν…μŠ€νŠΈμ˜ 벑터화 방법

λ”₯λŸ¬λ‹μ„ μ΄μš©ν•˜μ—¬ ν…μŠ€νŠΈ 뢄석을 μœ„ν•΄μ„œλŠ” ν…μŠ€νŠΈλ₯Ό λ°±ν„°(ν…μ„œ)둜의 λ³€ν™˜μ΄ ν•„μš”ν•˜λ‹€.
ν•˜λ‚˜μ˜ ν…μŠ€νŠΈ(λ¬Έμž₯)을 단어/문자둜 λ³€κ²½ν•˜κ³  이λ₯Ό λ‹€μ‹œ 벑터화 ν•˜λŠ” 과정이 μˆ˜ν–‰λœλ‹€.

Bag of Words (BOW)

같은 단어끼리 가방에 담은 λ’€ 각 가방에 λͺ‡κ°œμ˜ 단어가 λ“€μ–΄μžˆλŠ”μ§€λ₯Ό μ„ΈλŠ” γ„± ㅣ법
각 단어가 λͺ‡λ²ˆμ΄λ‚˜ μ€‘λ³΅ν•΄μ„œ μ“°μ˜€λŠ”μ§€λ₯Ό μ•Œ 수 있음
λ‹¨μ–΄μ˜ λΉˆλ„μˆ˜λ₯Ό μ•Œλ©΄ ν…μŠ€νŠΈμ—μ„œ μ€‘μš”ν•œ 역할을 ν•˜λŠ” 단어λ₯Ό νŒŒμ•… κ°€λŠ₯
κ°„λ‹¨ν•˜κ³  효과적이라 널리 μ‚¬μš©λœλ‹€.

원-ν•« 인코딩

  • N개의 단어λ₯Ό ν¬ν•¨ν•˜λŠ” μ–΄νœ˜ 사전을 λ§Œλ“œλŠ” 것.
  • λͺ¨λ“  단어에 κ³ μœ ν•œ μ •μˆ˜ 인덱슀λ₯Ό λΆ€μ—¬ν•˜μ—¬ λ§Œλ“ λ‹€.
  • 각 λ‹¨μ–΄λ§ˆλ‹€ 길이가 N인 벑터λ₯Ό μƒμ„±ν•˜λŠ”λ°, k번째 μ›μ†Œλ§Œ 1이고 λ‚˜λ¨Έμ§€λŠ” λͺ¨λ‘ 0인 ν¬μ†Œ 벑터 ν˜•νƒœλ₯Ό λˆλ‹€.

원-ν•« μΈμ½”λ”©μ˜ 단점

  • μ›ν•«μΈμ½”λ”©μ˜ 단점은 λͺ¨λ‘κ°€ 인덱싱 처리된 λ‹¨μˆœν•œ 벑터 ν˜•νƒœμ΄λ―€λ‘œ λ‹¨μ–΄μ‚¬μ΄μ˜ 연관성을 νŒŒμ•…ν•  수 μ—†λ‹€. 의미/κ°œλ…/μœ μ˜μ–΄/λ°˜μ˜μ–΄ λ“± 연관관계가 μžˆμ–΄λ„ 이λ₯Ό ν‘œν˜„ν•  수 μ—†λ‹€.

  • μ‚¬μš©λœ μ–΄νœ˜κ°€ λ§Žμ„μˆ˜λ‘ μ–΄νœ˜μ‚¬μ „μ˜ 크기가 μ»€μ§€λŠ”λ°, n개의 μ–΄νœ˜λ₯Ό μ‚¬μš©ν•œλ‹€κ³  ν•˜λ©΄ nμ°¨μ›μ˜ μ–΄νœ˜μ‚¬μ „μ΄ ν•„μš”ν•˜κ²Œ λœλ‹€. 즉 λ„ˆλ¬΄ λ§Žμ€ μžμ›μ΄ μ†Œλͺ¨λ˜λŠ” 것이닀.

원-ν•« μΈμ½”λ”©μ˜ ν•΄κ²° λ°©μ•ˆ

1. 원-ν•« ν•΄μ‹±

  • 토큰(단어)의 μˆ˜κ°€ λ„ˆλ¬΄ λ§Žμ•„ 닀루기 μ–΄λ €μšΈ λ•Œ, ν•΄λ‹Ή 단어λ₯Ό ν•΄μ‹±ν•˜μ—¬ κ³ μ •λœ 크기의 λ²‘ν„°λ‘œ μ €μž₯ν•œλ‹€.
    μž₯점 : μ΄λŸ¬ν•œ 방법을 μ‚¬μš©ν•˜λ©΄ λ‹¨μ–΄μ˜ 인덱싱이 ν•„μš”μ—†μ–΄ 차원이 μ€„μ–΄λ“œλ―€λ‘œ 효율적인 λ©”λͺ¨λ¦¬μ˜ μ‚¬μš©μ΄λΌκ³  ν•  수 μžˆλ‹€.
    단점 : ν•˜μ§€λ§Œ 해싱기법에 따라 ν•΄μ‹œμ˜ 좩돌이 λ°œμƒν•  수 μžˆλ‹€. λ”°λΌμ„œ ν•΄μ‹± κ³΅κ°„μ˜ 차원이 μ¦κ°€ν•˜κ²Œ λœλ‹€.

2. 단어 μž„λ² λ”©

  • μ €μ°¨μ›μ˜ λ°€μ§‘λœ 벑터 ν˜•νƒœλ‘œ μ‚¬μš©λœλ‹€.
  • λ°μ΄ν„°λ‘œλΆ€ν„° ν•™μŠ΅μ„ 톡해 μƒμ„±ν•œλ‹€.
  • ν•™μŠ΅μ„ 톡해 단어가 κ°€μ§€λŠ” 의미 자체λ₯Ό 닀차원 곡간에 '벑터화 'μ‹œν‚¨λ‹€.
  • 쀑심 λ‹¨μ–΄μ˜ μ£Όλ³€ 단어듀을 μ΄μš©ν•˜μ—¬ 쀑심단어λ₯Ό μΆ”λ‘ ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•™μŠ΅ν•œλ‹€.
  • λŒ€ν‘œμ μΈ 예둜 Word2Vecκ°€ μžˆλ‹€.


μž₯점 :

  • 단어간 μœ μ‚¬λ„ 츑정이 μš©μ˜ν•˜λ‹€.
  • λ‹¨μ–΄κ°„μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
  • 벑터 연산을 톡해 좔둠이 κ°€λŠ₯ν•˜λ‹€.

단점 :

  • λ™ν˜•μ–΄ λ‹€μ˜μ–΄ 등에 λŒ€ν•΄μ„œ μ„±λŠ₯이 쒋지 μ•Šλ‹€.
  • μ£Όλ³€ 단어λ₯Ό 톡해 ν•™μŠ΅μ΄ μ΄λ£¨μ–΄μ§€λ―€λ‘œ 'λ¬Έλ§₯'을 κ³ λ €ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

μ˜ν™”λ¦¬λ·° 긍정/λΆ€μ • 예제

μ†ŒμŠ€μ½”λ“œ

import numpy
import tensorflow as tf
from numpy import array
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten,Embedding
# ν…μŠ€νŠΈ 리뷰자료λ₯Ό 지정
docs = ["λ„ˆλ¬΄ μž¬λ°Œλ„€μš”","μ΅œκ³ μ•Ό","μ°Έ 잘 λ§Œλ“ μ˜ν™”λ‹€","μΆ”μ²œν•˜κ³  μ‹Άλ‹€","ν•œλ²ˆ 더 보고싢닀","κΈ€μŽ„μš”","λ³„λ‘œμ˜€μ–΄","생각보닀 지루해","μ—°κΈ°κ°€ 어색해","μž¬λ―Έμ—†μ–΄"]
# 긍정 λ¦¬λ·°λŠ” 1, λΆ€μ • λ¦¬λ·°λŠ” 0으둜 클래슀λ₯Ό 지정.
classes = array([1,1,1,1,1,0,0,0,0,0])
# 토큰화
token = Tokenizer()
token.fit_on_texts(docs)
print(token.word_index)
x = token.texts_to_sequences(docs)
print("\n리뷰 ν…μŠ€νŠΈ, 토큰화 κ²°κ³Ό:\n", x)
# νŒ¨λ”©, μ„œλ‘œ λ‹€λ₯Έ 길이의 데이터λ₯Ό 4둜 맞좰 μ€€λ‹€.
padded_x = pad_sequences(x, 4) 
print("\n :\n", padded_x)
# λ”₯λŸ¬λ‹ λͺ¨λΈ
print("\nλ”₯λŸ¬λ‹ λͺ¨λΈ μ‹œμž‘:")
# μž„λ² λ”©μ— μž…λ ₯될 λ‹¨μ–΄μ˜ 수λ₯Ό 지정
word_size = len(token.word_index) +1
# 단어 μž„λ² λ”©μ„ ν¬ν•¨ν•˜μ—¬ λ”₯λŸ¬λ‹ λͺ¨λΈμ„ λ§Œλ“€κ³  κ²°κ³Ό 좜λ ₯
model = Sequential()
model.add(Embedding(word_size, 8, input_length=4))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', 
metrics=['accuracy'])
model.fit(padded_x, classes, epochs=20)
print("\n Accuracy: %.4f" % (model.evaluate(padded_x, classes)[1]))

κ²°κ³Ό

profile
뢉은 λ°° μ˜€μƒ‰ 딱닀ꡬ리 개발자 πŸ¦ƒCloud & DevOps

0개의 λŒ“κΈ€