NLP 기초 (1)

정원국·2022년 5월 18일
1

NLP 기초

목록 보기
1/7

1. 자연어 처리의 대표 4가지

  1. 음성 인식(Speech Recognition)
  2. 번역(Translation)
  3. 요약(Text Summary)
  4. 분류(Text Classification)

2. NLP 예시

  1. Chatbot

    • Sentiment Analysis : 감정분석
    • Tokenization : 토큰화
    • Named Entity Recognition : 주제파악하기
    • Normalization : 의도된 오타 파악하기
    • Dependency Parsing : 문장 구성 성분의 분석
  2. SIRI

    • Feature Analysis : 음성데이터로부터 특징을 추출
    • Language Model : 언어별로 갖고 있는 특성을 반영
    • Deep Learning : 학습된 데이터로부터 음성 신호 처리
    • HMM(Hidden Markov Model) : 앞으로 나올 단어 예측
    • Similarity Analysis : 음성 신호가 어떤 기준에 맞는가?
  3. Translator

    • Encoding : 유사도 기반 자연어의 특징 추출
    • Time Series Modeling : 문장을 시간에 따른 데이터로 처리
    • Attention Mechanism : 번역에 필요한 부분에만 집중
    • Self-Attention : 문장 사이의 상관관계를 분석
    • Transformer : Attention 구조를 이용한 번역 원리

3. 텍스트 전처리

<언어의 전처리 과정>

  • sentence - Tokenization - Cleaning,Stemming - Encoding - Sorting - Padding, Similarity

1. 토큰화

  1. 단어 토큰화
  • 주어진 문장에서 '의미 부여' 가 가능한 단위를 찾는다.
  • Ex) <표준 토큰화 : Treebank Tokenization>
from nltk.tokenize import TreebankWordTokenizer
tokenizer = TreebankWordTokenizer()
text = "Model-based RL don't need a value function for the policy."
print(tokenizer.tokenize(text))
['Model-based', 'RL', 'do', "n't", 'need', 'a', 'value', 'function', 'for', 'the', 'policy', '.']



  1. 문장 토큰화
  • 문장 단위로 전체 문단에서 토큰화를 해준다.


  1. 한국어 토큰화의 어려움
  • 활용형이 너무 많고, 영어와 다르게 품사역시도 많다.


  1. 토큰화 결론
  • 패키지를 쓰면 간단히 해결된다.
  • 그러나 패키지별로 어떤식으로 토큰화를 하는지는 파악을 해야한다.


2. 정제 (Cleaning)

  • 데이터 사용 목적에 맞추어 노이즈를 제거
  1. 대문자 vs 소문자
    • 대소문자 처리를 할때 예외적으로 하지 말아야하는것들이 있다. ex) us - US


  2. 출현 횟수가 적은 단어의 제거
    • 대세에 영향을 미치지 않는 단어이고, 출현 횟수가 적은경우는 없애도 된다.


  3. 길이가 짧은 단어, 지시(대)명사, 관사 제거


3. 추출 (stemming)

  • 어간 : 단어의 의미를 담은 핵심
  • 접사 : 단어에 추가 용법을 부여 - 사람이 판단후 지울수 있음
  1. 어간 추출, 표제어 추출
    Ex) <Porter Algorithm : 대표적인 Stemming 방법>
    - 표제어 추출은 품사 정보를 포함하고 있음


4. 불용어 (Stopword)

  • 문장에서 대세로 작용하지 않는, 중요도가 낮은 단어 제거
import nltk
nltk.download('stopwords') # stopwords 패키지에서 다운로드
from nltk.corpus import stopwords
print(stopwords.words('english')[:5])
# 불용어 목록에 있으면 지워준다.
['i', 'me', 'my', 'myself', 'we']



  1. 불용어 제거 방법
    1. 불용어 목록을 받아온다.
    2. 정제할 문장을 토큰화 한다.
    3. 토큰화된 각 단어마다
      • 단어가 불용어 목록에 없는 경우 - 정제 결과에 추가
      • 단어가 불용어 목록에 있는 경우 - Pass
import nltk
nltk.download('stopwords')
nltk.download('punkt')
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

input_sentence = 'We should all study hard for the exam.'
stop_words = set(stopwords.words('english'))
word_tokens = word_tokenize(input_sentence)
result = []
for w in word_tokens:
    if w not in stop_words:
        result.append(w)

print(word_tokens)
print(result)
['We', 'should', 'all', 'study', 'hard', 'for', 'the', 'exam', '.']
['We', 'study', 'hard', 'exam', '.']



5. 정수 인코딩(Integer-Encoding)

  • 처음 보는 모든 단어에 정수를 부여한다.
  • 등장횟수가 많은 단어를 앞에 번호를 부여한다.
  1. Dictionary
    1. 문장의 토큰화 - 불용어 및 대문자 제거 과정을 거친다.
    2. 빈 단어 dictionary vocab = {}를 만든다.
    3. 토큰화된 각 단어에 대해서:
      • 단어가 vocab에 속해 있지 않은경우 - vocab[단어] = 0
      • 단어가 vocab에 속한 경우 - vocab[단어] += 1


  2. 빈도순 정렬
    • Python의 enumerate 연산의 역할
mylist = ['English', 'Math', 'Science']
for n, name in enumerate(mylist):
	print("Course : {}, Number : {}".format(name,n))
Course : English, Number : 0
Course : Math, Number : 1
Course : Science, Number : 2



# 빈도수 순서로 정렬한 다음에 번호를 매겨준다.
vocab = [('apple',8), ('July',6), ('piano', 4), ('cup', 2), ('orange', 1)]
word2inx = {word[0] : index + 1 for index, word in enumerate(vocab)}



6. Padding(Zerp-padding)

  • 가장 문장의 길이가 긴 값을 key로 정한다.
  • key의 길이에 맞춰서 각 문장에 0을 넣어 문장의 길이를 맞춰준다.
  1. 문장들에 정수 인코딩을 거친다.
  2. 각 문장에 대해서:
    - 해당 문장이 가장 긴 문장의 길이보다 작을경우: 문장 길이를 맞출 때 까지 0을 뒤에 추가


  • One-hot Encoding
    • 저장공간이 많이 든다. - 평소에는 정수형으로 나뒀다가 필요할때만 원핫 인코딩으로 바꿔준다.


  • Word2vec Encoding
    • 단어의 유사성을 인코딩에 반영
    • 인코딩 벡터가 비슷하다 = 단어가 유사하다.


  • TF-IDF
    • Term Frequency - Inverse Document Frequency
    • 단어들의 중요한 정도를 가중치로 매기는 방법


      TFIDF=tf(d,t)xidf(d,t)TF - IDF = tf(d,t) x idf(d,t)


    • d: 특정 문서 번호
    • t: 특정 단어 번호
    • tf(d,t)tf(d,t) : 특정 문서 d에서 특정 단어 t의 등장 횟수


      idf(d,t)=log(N/df(t))idf(d,t) = log(N/df(t))


    • df(t)df(t) : 특정 단어 t가 등장한 문서의 수
    • N: 총 문서의 수

4. 유사도 분석

  1. 벡터 유사도:
  • Cosine Metirc = abab\dfrac{\vec{a}\cdot\vec{b}}{\parallel\vec{a}\parallel\parallel\vec{b}\parallel} = cosθ\cos\theta


  • Euclidean Metric = 거리의 개념
    d=(x1x2)2+(y1y2)2d = \sqrt{(x_1 -x_2)^2 + (y_1 - y_2)^2}


  • Levenshtein Distance
    단어 사이의 거리를 나타내는 대표적인 척도
    - 단어 A를 단어 B로 수정하기 위한 최소 횟수

    < 규칙 >
    동일 = 대각선 수
    변경 = 대간선 수 + 1
    삽입 = 상단수 + 1
    삭제 = 좌측 수 + 1
    이중 가장 낮은 수를 책정

  • Jaccard Distance
    J(A,B)=ABABJ(A,B) = \dfrac{\left\vert A\cap B \right\vert}{\left\vert A\cup B \right\vert}
profile
Data scientist 지망생

0개의 댓글