단어가 모여 문장을 이루고, 문장이 모여 문서를 이룹니다.

이해하는데 순서가 단어의 중요할까요? 문장을
일반적으로 입력되는 따라서 다양하게 전자기기 이진법을 저장하고 일반적으로 명령어에 이용하여 데이터를 처리하는
걸그룹이다 JYP엔터테인먼트에서 TWICE는 2015년에 걸그룹이다 선보인 9인조.

1) 문장을 이해하는데 단어의 순서가 중요할까요?

2) 다양하게 입력되는 명령어에 따라서 일반적으로 이진법을 이용하여 데이터를 저장하고 처리하는 전자 기기.

3) TWICE는 JYP엔터테인먼트에서 2015년에 선보인 9인조 걸그룹이다.‌‌

첫 번째 문장을 얼핏 봤을 때는, "도대체 이게 뭐지.." 하셨을 것입니다. 두 번째 문장을 봤을 때는 "뭔가 컴퓨터에 대한 얘기를 하는 거구나" 싶었을 것이고, 세 번째 문장을 봤을 때는 "컴퓨터 얘기는 아니고 연예인 얘기를 하는 거구나" 했을 것 같습니다. ‌‌

문장을 이해하는데에 단어의 순서는 중요합니다. 문장이 어떤 말을 하는지 정확하게 알고 싶다면요. 단어의 순서에 따라 의미가 달라지는 경우도 많기 때문이죠.

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

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

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

지난 주에 살펴본 one-hot vectors
세 개의 one-hot-vector가 합쳐 만들어진 BoW vector

이처럼 단어 3 개의 one-hot vector을 합쳐 한 문장을 한 개의 column vector로 표현하었습니다. BoW vector는 Nx1 매트릭스에 문장 안에 포함되어 있는 단어가 몇 번 들어가있는지 빈도수 (frequency)를 표시하는 것입니다.

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

아래 예시처럼 더 많은 단어가 있어도 BoW로 표현이 가능합니다.

문장 뿐만 아니라, 문서 역시 BoW로 표현될 수 있습니다. (이미지 출처)

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도 고려할 수 있는 방법입니다. ‌‌

bi-gram까지 같이 보면 vocabulary가 이렇게 늘어납니다

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

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

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

잘 생각해보면 학습 데이터가 크면 클수록 자주 쓰이는 단어의 숫자가 커질 것입니다. 영어에서 "the, he, she, it, a" 등 article (관사)나 pronoun(대명사)는 꽤나 자주 나오지만 문장의 주제를 파악하는 데 있어서는 중요하지 않을 수도 있습니다 (이를 stopword라고 합니다). ‌‌

반대로 "인공지능 (AI)", "자연어 처리 (NLP)"같은 단어들은 자주 등장하는 단어가 아니지만 문서의 주제를 유추하는데 아주 중요한 역할을 할 것입니다. 스포츠 기사에 저런 단어가 등장하지는 않겠죠.

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

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

tf-idf score는 다음과 같이 정의됩니다.‌‌

N은 전체 document 개수

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

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

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가 커지면 커질수록 쓰기 힘들다.

두 번째는 vocabulary size가 늘어날수록 커지는 vector의 사이즈입니다. 이는 단어 표현 방식인 one-hot vector로부터 시작된 고질적인 문제인데요. Nx1 column vector로 단어 또는 문장을 표현하기 때문에  vocabulary 크기인 N이 커지면 전체 vector가 엄청나게 커집니다. 실상은 대부분의 vector 안의 숫자가 0으로 채워져 있음에도 불구하고 말이죠 (이런 matrix를 sparse matrix라고 합니다).

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

"책상"과 "테이블", "의자"와 "좌석", "아침식사"와 "조찬"은 쓰임새는 조금 다르지만 분명 동의어입니다. "걷다"는 "볼펜"보다는 "뛰다"와 좀 더 관련이 있습니다. 동사이기도 하고 사람의 동작을 표현하기 때문이죠. 하지만 one-hot vector은 각 단어를 각각의 index로 구별하기에 서로의 연관성을 표현할 수 없습니다 (one-hot vector는 서로 orthogonal 합니다).

spoiler alert: 이 단점들을 잘 이해하는게 중요합니다! 앞으로 나올 주제들은 이 단점들을 극복하기 위해 소개되는 것들이 많습니다~!


‌가벼운 NLP 문제에서는 BoW, tf-idf라는 간단한 모델을 먼저 써보시는 것을 추천합니다. ‌경우에 따라 simplicity가 complexity를 이기는 법입니다. 가장 적은 노력으로 승리를 쟁취하는 자가 진정한 능력자가 아닐까요?