sliver__

[NLP] Chapter 2 - 자연어 본문

CS/NLP

[NLP] Chapter 2 - 자연어

sliver__ 2022. 2. 9. 00:03
728x90

[자연어 처리란]

 

  • NLP(Natural Language Processing) : 자연어를 처리하는 분야
  • 우리의 말을 컴퓨터에게 이해시키기 위한 기술

 

[시소러스]

 

  • 뜻이 같은 단어(동의어), 뜻이 비슷한 단어(유의어)

 

[WordNet]

 

  • NTLK(Natural Language Toolkit) 라이브러리 사용
  • 품사 태깅, 구문 분석, 정보 추출, 의미 분석 등 자연어 처리에 편리한 기능 제공
  • 예제
  • import nltk from nltk.corpus 
    import wordnet 
    
    nltk.download('wordnet') 
    nltk.download('omw-1.4') 
    print(wordnet.synsets('car')) 
    car = wordnet.synset('car.n.01') #car.n.01 / 단어 이름. 속성(명사, 동사 등). 그룹의 인덱스 
    
    print(car.definition()) 
    print(car.lemma_names()) 
    print(car.hypernym_paths()[0]) 
    novel = wordnet.synset('novel.n.01') 
    dog = wordnet.synset('dog.n.01') 
    motorcycle = wordnet.synset('motorcycle.n.01') 
    
    print(car.path_similarity(novel)) 
    print(car.path_similarity(dog)) 
    print(car.path_similarity(motorcycle))​

 

[단어의 분산 표현]

 

  • 단어의 의미를 정확하게 파악할 수 있는 벡터 표현

 

[분포 가설]

 

  • "단어의 의미는 주변 단어에 의해 형성된다"에 기반
  • 맥락은 주변에 놓인 단어를 의미한다
  • 예제

You say goodbye and i say hello

=> goodbye 앞, 뒤로 두 단어씩 맥락에 해당

 

  • 맥락의 크기 : 윈도우 크기(Window size)
  • 상황에 따라 왼쪽 단어 또는 오른쪽 단어만 사용할 수도 있다.

 

[동시발생 행렬]

 

  • 통계 기반 기법 : 어떤 단어를 주목했을 때, 그 주변에 어떤 단어가 몇번이나 등장하는지 세는 방법
  • 한 단어를 기준으로 윈도우 사이즈만큼 단어가 몇번 나오는지 만든 행렬
  • 예제
  you say goodbye and i hello .
you 0 1 0 0 0 0 0
say 1 0 1 0 1 1 0
goodbye 0 1 0 1 0 0 0
and 0 0 1 0 1 0 0
i 0 1 0 1 0 0 0
hello 0 1 0 0 0 0 1
. 0 0 0 0 0 1 0
  • 모든 단어에 대해 동시발생하는 행렬 : 동시발생 행렬

 

[벡터 간 유사도]

 

  • 단어 벡터의 유사도를 나타낼 때는 코사인 유사도를 사용
  • $ x = (x_{1},x_{2},x_{3},...x_{n}), y = (y_{1},y_{2},y_{3},...y_{n}) $이 존재할 때

$$ similarity(x,y) = { {x \cdot y} \over {||x||||y||} } = { {x_{1}y_{1} + \cdots x_{n}y_{n} } \over {\sqrt{x_{1}^{2} + \cdots + x_{n}^2} \sqrt{y_{1}^2 + \cdots + y_{n}^2}} }  $$

 

  • 코사인 유사도는 두 벡터가 가리키는 방향이 얼마나 비슷한가를 표현

 

[상호 정보량]

 

  • 점별 상호정보량(Pointwise Mutual Information)(PMI) 
  • 확률변수 x, y에 대해 아래의 식으로 정의된다.

$$ PMI(x,y) = \log_{2} { P(x,y) \over P(x)P(y) } $$

  • $P(x)$는 x가 일어날 확률, $P(y)$는 y가 일어날 확률, $P(x,y)$는 x, y가 동시에 일어날 확률
  • PMI값이 높을수록 관련성이 높다는 의미
  • 두 단어의 동시발생 횟수가 0이면 $log_{2} = -\infty$ 이므로 실제 구현 시 양의 상호정보량(Positive PMI)을 사용

$$ PPMI(x,y) = max(0, PMI(x,y)) $$

  • PMI가 음수일 때 0으로 취급
  • 단어의 개수가 많아질수록 많은 양의 벡터를 처리해야하는 문제점

 

[차원 감소]

 

  • 중요한 정보는 최대한 유지하면서 벡터의 차원을 감소
  • Sparse vector, Sparse matrix에서의 중요한 축을 찾아내어 밀집벡터(Density vector)로 변환
  • SVD(Singular Value Decomposition)를 사용

$$ X = USV^T $$

  •  임의의 행렬 X를 U,S,V라는 세 행렬의 곱으로 분해
  • U와 V는 직교행렬이고, 열벡터는 서로 직교
  • S는 대각행렬(대각성분 외에는 모두 0인 행렬

======================================================================================

**SVD

https://angeloyeo.github.io/2019/08/01/SVD.html

 

특이값 분해(SVD) - 공돌이의 수학정리노트

 

angeloyeo.github.io

======================================================================================

 

 

[PTB 데이터셋]

 

  • 펜 트리뱅크(Penn Treebank(PTB))
  • train, valid, test 데이터 셋으로 존재
728x90

'CS > NLP' 카테고리의 다른 글

[Hands on Python NLP] - NLP 기본의 이해  (0) 2022.10.09
[NLP] Auto Encoder (1)  (0) 2022.08.11
[NLP] chapter04 - word2vec 속도개선  (0) 2022.02.10
[NLP] Chapter3 - word2vec  (0) 2022.02.10
[NLP] Chapter 1 - 신경망 복습  (0) 2022.02.06
Comments