본문 바로가기

개발/NLP Trends

Weekly NLP #01 Review : 컴퓨터에게 언어는 어떤 의미일까?

※ 본 블로그 포스트는 박지호님의 "Weekly NLP" 내용을 채용하여 개인공부를 기록한 포스트입니다.
원작자의 허가를 맡았으며 불법적인 공유가 아님을 미리 알립니다.

 

인간은 언어를 어떻게 인식하고 있을까요? 컴퓨터에게 언어는 어떤 의미일까요?
국어사전에 의하면 언어라는 것은 다음과 같이 정의되어 있습니다.

언어(言語) - 생각, 느낌 따위를 나타내거나 전달하는 데에 쓰는 음성, 문자 따위의 수단. 또는 그 음성이나 문자 따위의 사회 관습적인 체계 (표준 국어대사전 발췌)

 

체계. 즉, 하나의 시스템이라는 것이 먼저 눈에 띕니다. 보고계시는 이 글을 눈을 통해 시각정보로 받아들이지만 머릿속에는 일종의 정보 시스템이 있기 때문에 필자의 생각이나 느낌을 글로 여러분께 전달할 수 있는 것입니다.

처음, 언어를 체계적으로 배울 때를 생각해봅시다.

우리는 알파벳(abcd), 한국어는 자음(ㄱㄴㄷㄹ)과 모음(ㅏ ㅑ ㅓ ㅕ)을 먼저 배웁니다. 이러한 문자열(character)이 모여, 음절(syllable)이 되고, 더 나아가 단어(word)를 배웁니다.

문자열(Character) → 음절(Syllable) → 단어(Word)

이중 뜻을 가지는 가장 작은 단위는 ‘단어’입니다. 많은 문자열이 모여도 단어로 이루어지지 않으면 어떠한 의미를 담지 못합니다.

모든 것을 숫자로 보는 컴퓨터

컴퓨터는 모든 것을 숫자로 봅니다. 처음 태어났을 때도 0101로 이루어진 이진법 숫자로 모든 계산이 이루어졌고, 지금도 그 시스템을 기반으로 발전해왔습니다. 이것을 우리는 디지털이라고 합니다.

우리가 눈으로 보는 것들은 이미지, 즉 픽셀로 표현되고, 귀로 듣는 것들은 음파로 표현이 됩니다. 픽셀과 음파는 모두 숫자로 표현이 된다는 공통점을 가지고 있습니다. 이 숫자들은 컴퓨터에게 입력 데이터(Input Data)가 됩니다.

예를 들어, 고양이 이미지 수천 장과 고양이 이미지가 아닌 것 수천 장을 주면 컴퓨터는 처음 보는 픽셀들을 보고 고양이인지 아닌지 예측할 수 있게 학습이 되는 것이죠.

그렇다면 언어의 가장 작은 단위, 단어는 어떻게 숫자로 표현이 될 수 있을까요?

일단 아는 단어를 다 써봐! Vocabularay 만들기

지금까지 제가 배운 단어는 대략 몇 개나 될까요? 표준 대국어사전에는 총 501,000여 개의 어휘가 수록되어있다고 하는데, 일상생활에서 사용하는 건 많아봐야 천 개(?)정도 밖에 되지 않을까 싶습니다. 책을 많이 읽으신 분들은 훨씬 더 많은 어휘 개수를 알고 계시겠지요.

일단, 단어를 숫자로 표현하기 위해서는 알고있는 모든 단어의 명단을 만들어야 합니다.

이는 보통 vocabulary라고 부릅니다. 그리고 순서대로 숫자를 하나씩 줍니다.

출처 : https://jiho-ml.com/weekly-nlp-1/

예를 들어, 내가 아는 단어가 총 5개(hello, world, natural, language, processing)라 가정해보면 이러한 그림이 나옵니다.
이 숫자를 우리는 index 또는 id라고 부릅니다. 마치 반 아이들에게 번호를 주는 것 처럼요.

선생님께서, “오늘 4월 3일이네, 칠판 지울 사람 3번 누구니?”, “네~ natural입니다” 이런거죠!
더 나아가 우리는 이것을 vector로 표현해봅시다.
Column vectorNx1 matrix로, 앞으로 자주 등장할 것 입니다.
숫자 N개를 기둥처럼 쭉 세워놓은 것이라고 생각하면 됩니다.
앞서 말한 index를 어떻게 column vector로 표현할 수 있을까요?
간단하게 해당하는 id번째 열을 1로 채우고, 나머지는 0으로 채우면 됩니다.

출처 : https://jiho-ml.com/weekly-nlp-1/

여기서 index 0에 등장하는 unk모르는 단어(unknown)를 뜻합니다.
나중에 새로운 단어를 보았을 때 모른다는 표시를 하기 위함이죠. 아, 컴퓨터는 숫자를 0부터 센다는 거 알고계셨죠?

이처럼 모든 단어를 vector로 표현하는 것을 one-hot vector라고 합니다.
모든 열 중 단 1개의 숫자만 1이고, 나머지는 0으로 표현되기에 이러한 이름으로 불립니다.

자주 쓰이는 단어만 알고싶다~ word frequency를 이용한 vocabulary 구성

대부분의 NLP task는 아는 단어를 모다 vocabulary를 구성하는 것부터 시작합니다.
가지고 있는 데이터를 전부 끌어모으는 작업이 먼저일 텐데요. NLP에서 이 데이터를 corpus라고 부릅니다.

먼저 corpus 안에 있는 전부 모아 단어를 셉니다. corpus가 크면 클수록 구별되는 단어의 개수가 늘어나겠죠? 크면 개별 단어의 개수가 몇 천개, 몇 만개가 될 때도 있습니다. 그렇다면 이 모든 단어를 모두 vocabulary에 포함하여 사용하는 것이 맞을까요?

때에 따라 다르지만, 주로 vocabulary를 구성할 때에는 각 단어의 빈도수(word frequency)를 살펴봅니다.
주로 통계학적 분석을 하거나 모델을 학습시킬 것이기 때문에 한두 번 나오는 단어는 무의미할 것이라는 가정을 하는 것이지요. 그렇게 corpus에 사이즈에 따라 최소 빈도수(minimum frequency)를 정해 몇 번이상 나오는 단어만 사용하거나, 총 vocabulary size를 정하고 빈도 수가 큰 단어부터 포함시키는 식으로 vocabulary를 구성합니다.


저만의 NLP 여정의 가장 위대한 시작이 될 첫 Step입니다.
단순히 정해진 기술부터 익히는 것이 아닌 기본적인 원리와 그 안의 깊숙한 근본부터 생각해보는 것이 참 인상적입니다.
표준국어대사전의 정의에 의하면 언어란 결국 하나의 시스템이라는 요약이 되게 와닿습니다. 아직 개척되지 않은 미지의 영역인 사람의 뇌과학과 언어체계의 연관성을 고려한다면 먼 미래에는 일체화된 체계로 언어와 소통을 정의할 수 있지 않을까 싶습니다. 그 안의 정해진 규칙과  패턴을 알게된다면 소통의 문제로 일어나는 많은 사회문제를 해결할 수 있다고 믿습니다. 그러기위해선 기초도 소홀히하면 안되겠죠 🫠 

개발적인 이야기를 좀 해봅시다.
NLP를 공부하거나 현업에 종사하시는 대부분의 개발자분들이 Python을 사용할 것 입니다. 물론 데이터를 끌어모으고 전처리하는데에는 다를 수 있겠지만요. 1주차 포스트에서는 초보자도 알 수 있는 데이터 처리법의 일부분이 나오는것 같습니다. 흔히 사용하는 String을 List에 담은것 뿐인데 그 순서와 결합되고 조금만 다르게 바라보니 이것을 Row, Column Vector로, 더 복잡하게는 Matrix로 표현이 가능합니다. 또한 관용적표현의 일부로 NLP에서 unk는 모르는 단어(unknown)을 뜻하는 표기이며 그 외 여러가지 의미를 가지는 토큰과 그 표기법이 있는것으로 알고있습니다. <BOS>, <EOS>같은것들이 그 예시죠. 이에 대해서는 추후에 나오는 내용과 맞물려 더 자세히 알아보도록 하겠습니다. 조금만 위로 돌아가보죠.

One-hot vector는 굉장히 심플하면서 동시에 획기적이라고 생각합니다. 물론 추후에 나올 내용에 비하면 정말 자그마한 내용이지만 말이죠. 정확히는 One-Hot Encoding이라고 합니다. 문자를 숫자로 변환시켜주는 일종의 표현방법입니다. 상세한 특징은 아래와 같습니다.

  • 단어 집합의 크기를 Vector의 차원으로 지정
  • 표현하고 싶은 단어의 Index에 1의 값을 부여하고, 다른 Index에는 0을 부여함
  • 위 과정을 거쳐서 표현된 Vector를 One-Hot Vector라고 함

One-Hot Encoding은 단어의 개수가 늘어날 수로, Vector를 저장하기 위해 필요한 공간이 계속 늘어난다는 단점이 있습니다. 다른 표현으로는 Vector의 차원이 늘어난다고 합니다. 또한 이것은 단어의 유사도(Word Frequency)를 표현하지 못합니다. 이와같은 문제점을 해결하기 위한 방식으로 크게 2가지가 연구되어있습니다.
첫째, 카운트 기반의 벡터화 방법LSA(잠재 의미 분석), HAL등이 있고,
둘째는 예측 기반NNLM, RNNLM, Word2Vec, FastText등이 있습니다.
또한 번외로 2가지 방식을 모두 사용하는 GloVe라는 방법도 존재합니다.
이후 워드 임베딩(Word Embedding, 단어를 벡터로 표현하는 방법)에 관한 내용에서 다뤄보겠습니다.

출처 : https://jiho-ml.com/weekly-nlp-1/

 

Week 1 - 컴퓨터에게 언어는 어떤 의미일까?

우리는 언어라는 것을 어떻게 인식하고 있을까요? 여러분에게 언어는 무엇인가요?

jiho-ml.com