Data/자연어처리

텍스트를 수치화시키는 방식 4가지

빛날희- 2021. 7. 15. 23:29

텍스트를 머신러닝 알고리즘에 사용하기 위해선 수치로 변환하는 과정이 필요하다. 수치로 나타내는 방법은 여러가지가 있는데 해당 포스팅에선 4가지 표현을 소개하고자 한다. 

 

▶ 원-핫 표현

원핫 표현은 문장을 단어 단위로 나눈 토큰들을 어휘 사전으로 등록하고, 문장에 등장하는 단어는 1로 문장에 등장하지 않는 단어는 0으로 설정하는 방식이다.

 

다음과 같은 corpus가 있다고 해보자. 

해당 코퍼스에서 만들어지는 어휘사전의 개수는 time, flies, like, an, a, arrow, banana, fruite로 8개이다. 여기서 'Time flies like' 코퍼스를 원핫벡터로 표현하면 다음과 같다. 

 

time flies like an a arrow banana fruite
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0

원핫 벡터를 사용하면 위 코퍼스는 3x8 행렬이 된다.

원핫 벡터는 어휘 사전 크기의 벡터 하나로 표현하는 이진 인코딩 방법을 사용하여 [1,1,1,0,0,0,0,0] 로 나타내는 경우도 있다. 

 

 

파이썬을 통해 다음과 같이 원핫벡터를 구현할 수 있다. 

 

 

 

▶ TF표현

TF표현은 단순히 소속단어의 원핫 표현을 합해서  만드는 것으로 corpus에 저장된 두 문장의 원핫벡터 표현을 각각 더해 다음과 같이 구현할 수 있다. 

0번째 corpus의 [1,1,0,1,0,1,1]에 1번째 corpus의 [0,0,1,1,1,1,0]이 더해진 결과가 corpus에 대한 TF표현이다. 

 

 

 

▶ TF-idf 표현

여러 문서가 있을 때 문서에서 중요한 단어는 그 문서를 대표적으로 설명해 줄수 있는 단어, 즉 다른 문서에 비해 해당 문서에서 많이 등장하는 단어가 문서의 주제이자 중요단어가 될것이다. 문서에서 'a' 같은 부정관사들은 흔하게 많이 사용되지만 문서에서 전혀 중요한 단어는 되지 못한다. 그러나 TF표현의 경우엔 단어의 빈도만을 고려하기 때문에 'a'가 중요한 단어로 여겨질 수 있다는 문제점이 있다. 이를 해결할 수 있는 표현이 Tf-idf표현이다. 

 

Tf-idf표현은 다른 문서들에서 흔하게 등장하는 단어들의 수치를 Tf에 역문서 빈도idf를 곱해 낮춰 표현하는 방식이다. 

Idf는 총 문서의 개수 N을 특정 단어 w가 등장하는 문서의 수로 나눈 후 log를 취해준 값이다. 따라서 w가 많은 문서에 등장할 수 록 해당 수치는 작아진다. IDF수치를 TF 단어빈도에 곱한 값이 Tf-idf이다. 

 

sklearn에선 TfidfVectorizer를 제공하는데 해당 함수에선 IDF를 구하기 위해 분모와 분자가 0이 되는 것을 방지하기 위해 각각 1씩 더한 값을 사용한다. corpus를 tfidf 표현으로 나타낸 벡터는 다음과 같다. 

0번째 corpus에서 유일하게 나왔던 an과 arrow의 수치가 1번째 corpus에서도 나왔던 flies의 수치보다 높음을 알 수 있다. 1번째 corpus역시 flies보다는 유일하게 나왔던 fruit의 수치가 더 크게 계산된것을 알 수 있다. 

 

 

 

▶ 타깃 인코딩

단어마다 고유한 인덱스를 부여하는 인코딩 방식이다. NLP작업에서 많이 사용되는 방법이긴 하나 레이블의 규모가 한 언어의 전체 어휘가 되어 많은 메모리를 필요로 하게된다. 타깃 인코딩은 여러 방식으로 할 수 있는데 방식에 따라 성능에 큰 영향을 미칠 수 있기 때문에 주의를 기울여야한다.