본문 바로가기
딥러닝관련/자연어처리

자연어 처리란

by 머리올리자 2021. 12. 15.

[자연어]

한국어와 영어 등 우리가 평소에 쓰는 말을 자연어(natural language) 라고 한다.

 

 

[단어의 의미]

우리의 말은 '문자'로 구성되며, 말의 의미는 '단어'로 구성

 

'단어' : 의미의 최소 단위

 

자연어를 컴퓨터에게 이해시키는 데는 무엇보다 '단어의 의미'를 이해시키는 게 중요

 

컴퓨터에게 자연어를 파악하게 할 수 있는 방법

 

- 시소러스

- 통계 기반 기법

- 추론 기반 기법(word2vec)

 

 

[시소러스(thesaurus)]

유의어 사전으로 동의어나 유의어가 한 그룹으로 분류

 

ex) car = auto automobile machine motocar

 

또한 단어 사이의 '상위와 하위' 혹은 '전체와 부분' 등 세세한 관계까지 정의

(아래 참고)

 

 

 

이처럼 모든 단어에 대한 유의어 집합을 만든 다음, 단어들의 관계를 그래프로 표현하여 단어 사이의 연결을 정의 가능

 

'단어 네트워크'

 

시소러스의 예시 -> WordNet

 

https://ko.wikipedia.org/wiki/%EC%9B%8C%EB%93%9C%EB%84%B7

 

워드넷 - 위키백과, 우리 모두의 백과사전

워드넷(WordNet)은 영어의 의미 어휘목록이다. 워드넷은 영어 단어를 'synset'이라는 유의어 집단으로 분류하여 간략하고 일반적인 정의를 제공하고, 이러한 어휘목록 사이의 다양한 의미 관계를 기

ko.wikipedia.org

 

시소러스의 문제점

 

1. 시대 변화에 대응하기 어려움

(ex, 새로운 언어가 생기거나 단어의 의미가 확장되거나 축소될 때마다 업데이트 필요)

 

2. 사람을 쓰는 비용이 큼

(시소러스를 만드는데 엄청난 인건비 소요)

 

3. 단어의 미묘한 차이를 표현할 수 없음

(비슷한 단어들이라도 미묘한 차이가 있다)

 

 

[통계 기반 방법]

말뭉치(corpus)가 필요

 

말뭉치 : 대량의 텍스트 데이터

 

말뭉치를 전처리하는 방법

import numpy as np

def preprocess(text):
    text = text.lower()
    text = text.replace('.', ' .')
    words = text.split()

    word2id = {}
    id2word = {}
    for word in words:
        if word not in word2id:
            new_id = len(word2id)
            word2id[word] = new_id
            id2word[new_id] = word

    corpus = np.array([word2id[w] for w in words])

    return corpus, word2id, id2word


text = 'You say goodbye and I say hello.'
corpus, word2id, id2word = preprocess(text)

text 변수에 문장이 주어졌다고 가정해보자

 

위 흐름대로 가면 corpus, wor2id, id2word가 생성되는 것을 볼 수 있다.

 

word2id는 단어가 주어졌을 때 단어 ID를 찾는 딕셔너리이고

id2word는 ID가 주어졌을 때 단어를 찾는 딕셔너리이다.

 

 

[단어의 분산 표현]

 

이미지에서 RGB와 같은 벡터 표현이 색을 더 정확하게 명시할 수 있듯이

 

'단어의 의미'를 벡터 표현으로 정확하게 표현할 수 있을까?

 

-> 분산 표현(distributional representation)으로 가능

 

[분포 가설]

 

'단어의 의미는 주변 단어에 의해 형성된다' -> 분포 가설(distributional hypothesis)

 

단어 자체에는 의미가 없고, 그 단어가 사용된 '맥락(context)'의 의미를 형성한다는 것.

 

의미가 같은 단어들은 같은 맥락에서 더 많이 등장

 

ex)

I drink beer. We drink wine 처럼 "drink"라는 단어 주위에는 음료가 등장하기 쉬움

I guzzle beer. We guzzle wine이라는 문장이 있으면 "guzzle"은 "drink"와 같은 맥락이다.

"guzzle"과 "drink"는 가까운 의미에 단어라는 것도 알 수 있다.

 

"맥락"이란 특정 단어를 중심에 둔 그 주변의 단어.

 

맥락의 크기를 "윈도우 크기(window size)" 라고 함.

 

윈도우 크기가 2인 맥락의 예시 (총 4단어)

you say goodbye and i say hello

 

 

참고

https://book.naver.com/bookdb/book_detail.nhn?bid=14797086 

 

밑바닥부터 시작하는 딥러닝 2

직접 구현하면서 배우는 본격 딥러닝 입문서이번에는 순환 신경망과 자연어 처리다!이 책은 『밑바닥부터 시작하는 딥러닝』에서 다루지 못했던 순환 신경망(RNN)을 자연어 처리와 시계열 데이

book.naver.com

 

'딥러닝관련 > 자연어처리' 카테고리의 다른 글

Transformer Decoder : Linear & Softmax Layer  (0) 2021.11.16
Transformer Decoder : Encoder-Decoder Attention  (0) 2021.11.16
Word2Vec  (0) 2020.07.20
StackGAN 논문 리뷰(작성 중)  (0) 2020.07.16
Word Embedding  (0) 2020.07.13