無知

갈 길이 먼 공부 일기

기술 공부/AI

[NLP 기초 잡기] BoW, tf-idf with jiho-ml

moozii 2021. 12. 30. 20:08
* 이 글은 박지호 님의 jiho-ml Weekly NLP의 내용을 기반으로 하고 있습니다. 
밀려왔던 주간 뉴스레터의 내용을 훑어보면서, 인상 깊은 부분, 기록하고 싶은 부분만을 남긴 글로, 
더 깊이 알아보고 싶으시다면 아래의 원본 출처 주소로 이동해주세요.
https://jiho-ml.com/weekly-nlp-0/

 

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

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

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

일단 단어를 숫자로 표현하기 위해서는 알고 있는 모든 단어의 명단을 만들어야 합니다. 이는 보통 vocabulary라고 부릅니다. 그리고 순서대로 숫자를 하나씩 줍니다. 예를 들어, 내가 아는 단어가 총 5개 (hello, world, natural, language, processing)라 가정해보면 이러한 그림이 나옵니다.

더 나아가 우리는 이것을 vector로 표현해봅시다. Column vector는 Nx1 matrix로, 앞으로 자주 등장할 것입니다. 숫자 N개를 기둥처럼 쭉 세워놓은 것이라고 생각하면 됩니다. 그러면 앞서 말한 index를 어떻게 column vector로 표현할 수 있을까요? 간단하게 해당하는 id 번째 열을 1로 채우고, 나머지는 0으로 채우면 됩니다.

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

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

column vector로 표시된 각 단어. 이를 one-hot vector라고 합니다. (jiho-ml)

 

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

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

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

 

Week 2 - 단어를 가방에 때려 넣으면 문장이 된다

문장을 이해하는데에 단어의 순서는 중요합니다. 문장이 어떤 말을 하는지 정확하게 알고 싶다면요. 단어의 순서에 따라 의미가 달라지는 경우도 많기 때문이죠. 하지만 그저 이 문장이 어떤 주제를 가지는지만 알고 싶다면 순서가 크게 상관이 없다는 것을 위 예시를 통해 느끼셨을 겁니다. 이처럼 NLP에서는 해결하고자 하는 문제에 따라 문장을 표현하는 방법이 달라질 수 있습니다. 이 글에서는 순서가 상관 없는 문장 표현 방법을 배우려고 합니다.‌‌

https://jiho-ml.com/weekly-nlp-2/

 

단어를 가방에 넣어 섞어 버리는 Bag-of-words (BoW)

지난주에 배운 one-hot vector는 단어를 한 개의 column vector로 표현합니다. 만약에 여러 개의 단어의 vector를 단순히 합하여 문장을 표현하면 어떨까요? 그게 바로 bag-of-words (BoW) vector입니다.

https://jiho-ml.com/weekly-nlp-2/

세 개의 one-hot-vector가 합쳐 만들어진 BoW vector (jiho-ml)

BoW vector는 단어의 순서를 고려하지 않습니다. 하나의 vector로 뭉개어서 표현하기 때문이죠. 모든 단어를 큰 가방에 던져 넣으면 안에서 섞여버리기 때문이죠. 그렇기 때문에 bag라는 이름이 붙은 것입니다.

https://jiho-ml.com/weekly-nlp-2/

 

N-gram: 순서를 그래도 조금은 신경 써야 하지 않을까..?

n-gram은 연속된 n 개의 단어 뭉치를 뜻합니다.
예를 들어, "I love studying machine learning"이라는 문장에 나타나는 bi-gram (n=2)은:
[I love, love studying, studying machine, machine learning] 총 4개입니다. 이렇게 해서 조금 더 단어 사이의 순서를 신경 쓰고, "machine learning" 같은 phrase도 고려할 수 있는 방법입니다. ‌‌

예를 들어 n=2의 n-gram을 이용하여 BoW를 만든다면 학습 데이터 나오는 모든 bi-gram을 vocabulary에 넣어야 합니다. 자연스럽게 단어 수가 많아지면 vocabulary도 커지겠죠? 그렇기에 보통은 n이 너무 크지 않은 2~3 정도만 씁니다. n-gram은 추후에 language modelling에도 나오는 중요한 개념이기에, 한번 위키피디아 설명을 읽어보시기 바랍니다.‌‌

https://jiho-ml.com/weekly-nlp-2/

 

 

n-gram - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Contiguous sequence of n items from a given sample of text or speech In the fields of computational linguistics and probability, an n-gram (sometimes also called Q-gram) is a contiguou

en.wikipedia.org

In the fields of computational linguistics and probability, an n-gram (sometimes also called Q-gram) is a contiguous(next or together in sequence) sequence of n items from a given sample of text or speech. The items can be phonemes, syllables, letters, words or base pairs according to the application. The n-grams typically are collected from a text or speech corpus. When the items are words, n-grams may also be called shingles.[1]

Using Latin numerical prefixes, an n-gram of size 1 is referred to as a "unigram"; size 2 is a "bigram" (or, less commonly, a "digram"); size 3 is a "trigram". English cardinal numbers are sometimes used, e.g., "four-gram", "five-gram", and so on. In computational biology, a polymer or oligomer of a known size is called a k-mer instead of an n-gram, with specific names using Greek numerical prefixes such as "monomer", "dimer", "trimer", "tetramer", "pentamer", etc., or English cardinal numbers, "one-mer", "two-mer", "three-mer", etc.

https://en.wikipedia.org/wiki/N-gram

 

Tf-idf vector‌‌: 좀 더 중요한 단어가 있지 않을까..?

term frequency - inverse document frequency(tf-idf)는
단어 간 빈도 수에 따라 중요도를 계산해 고려하는 방법입니다.

term frequency (tf): 현재 문서(문장에)서의 단어의 빈도수
document frequency (df): 이 단어가 나오는 문서(문장) 총 개수

앞서 말한 "the, he, she, it, a" 같은 단어들은 tf와 df가 둘 다 아주 높을 것입니다.
반대로 "AI, NLP" 같은 단어는 tf가 높을 수 있지만, df가 상대적으로 낮겠지요. ‌‌

https://jiho-ml.com/weekly-nlp-2/

N은 전체 document 개수 (jiho-ml)

이 수식에서 알 수 있듯이, 기존 BoW에서 문서 내 단어 빈도수를 고려하되, 다른 문서에도 너무 자주 나오는 건 중요도를 낮추어 점수를 계산합니다. df는 분모에 등장하기 때문에 inverse document frequency (idf)라고 합니다!

tf-idf vector는 Nx1 vector 모양의 BoW vector에서 tf 점수를 idf로 normalize 한 것으로 이해하시면 됩니다.

https://jiho-ml.com/weekly-nlp-2/

 

https://www.quora.com/What-is-a-tf-idf-vector

TF-IDF is a way to judge the topic of an article. This is done by the kind of words it contains. Here words are given weight so it measures relevance, not frequency.

TF-IDF is supposed to tell you what is unique about each document. TF-IDF yields a finite number of unique possibilities. If you get unique possibilities then you can just club them under the same heading - but that is not classification in the classic machine learning sense.

https://www.quora.com/What-is-a-tf-idf-vector

 

BoW, Tf-idf vector의 단점은 무엇일까?‌‌

1) 순서가 중요한 문제에는 쓰기 힘들다 : BoW와 tf-idf는 간단하지만 topic classification이나 document retrieval 같은 task에는 좋은 성능을 보여줍니다. 순서가 중요한 문제에서는 이러한 정보를 생략하기 때문에 당연히 성능이 좋지 않습니다. 예를 들어, machine translation (기계 번역) 같이 다른 언어로 문장을 생산해야 하는 문제는 어림도 없습니다. ‌‌

2) vocabulary가 커지면 커질수록 쓰기 힘들다.

3) 단어 간의 관계를 표현하지 못한다.

https://jiho-ml.com/weekly-nlp-2/

 

Week 2 요약댓글

Bag-of-Words : 해당 단어가 있음을 나타내는 one-hot vector를 합하여 단어의 빈도수에 따라 만든 column vector(N1 matrix)
N-gram : 연속된 단어N개 뭉치, machine learning처럼 phrase도 고려할 수 있음. ex) 번역 모델링 성능 평가때도 사용..
Tf-idf : Tf: : 문서(문장)에서 나오는 특정 단어 횟수 / idf : 특정 단어가 들어가는 문서(문장)가 등장하는 총 개수
# 불용어(stopwords)를 처리하기 위해서 documnet frequency(df)에 inverse를 시켜주어서 상대적으로 중요도를 낮추어 계산해줌!