brunch

자연어를 이해 못 하는 컴퓨터를 위해 수치화해 주기

텍스트 분포로 벡터화하기

by 별똥별 shooting star

들어가며

오늘은 저번 시간에 이어서 텍스트의 분포를 활용해 텍스트를 벡터화하는 개념을 살펴볼 것이다. 이를 통해서 기초개념을 다질 수 있을 것이라고 생각된다. 여기서 잠시 텍스트 벡터화를 해야 하는 이유를 살펴보겠다. 컴퓨터가 자연어를 원활하게 처리할 수 있도록 하기 위해서는 텍스트보다는 수치화된 숫자를 사용해야 한다. 그렇기 때문에 자연어 처리는 전처리 과정에서 텍스트를 숫자 벡터로 변환하는 벡터화를 하게 된다.


벡터화에는 통계 기반 벡터화와 추론 기반 벡터화로 나눌 수 있다. 통계 기반 벡터화는 조금 더 큰 범주로 머신러닝에서 활용되고, 추론 기반 벡터화는 조금 더 세부 분야로 인공 신경망을 활용하는 방법이다.


오늘 소개할 내용은 통계 기반 벡터화로 이는 크게 세 분류로 나눌 수 있다. 첫 번째로는 단어 빈도를 이용한 벡터화, 두 번째로는 LSA와 LSD, 마지막으로 텍스트 분포를 이용한 비지도 학습 토크나이저이다. 지금부터 차례대로 살펴보도록 하겠다. 첫 번째와 두 번째는 띄어쓰기 단위의 단어를 이용한 벡터화 방법이고 세 번째는 텍스트의 분포를 이용한 토큰화 방법이다.



1. 단어 빈도를 이용한 벡터화

단어 빈도를 이용한 벡터화에는 Bag of Words, DTM, TF-IDF가 있다.


(1) Bog of Words

Bog of Words는 BoW라고 표기하기도 한다. 이는 문서 내의 단어들의 분포를 보고 이 문서의 특징을 파악하는 기법이다. 예를 들면 "나는 운동을 좋아한다., 나는 공부를 좋아한다."에서 "나는": 2, "운동을" : 1, "좋아한다." : 2, "공부를" : 1 과 같이 분포하게 되는 것을 뜻한다.


(2) Document-Term Matrix(DTM)

DTM은 문서-단어 행렬이다. 쉽게 말해 여러 문서의 BoW를 하나의 행렬로 구하는 것을 뜻한다. 행은 문서 벡터, 열은 단어 벡터로 부르며 문서의 수가 많아질수록 통합 단어장의 크기도 커지게 되어 DTM은 문서 벡터와 단어 벡터 모두 대부분의 값이 0이 되는 성질이 된다. 이를 통해서 각 문서들을 비교하여 각 문서 간 유사도를 구할 수 있게 된다.


DTM은 유용한 점이 많지만 치명적인 단점을 가지고 있다. 첫 번째는 저장 공간의 낭비가 심하다는 것이다. 재화에는 한계가 있기 때문에 이 점은 매우 중요한 조건이다. 그리고 두 번째는 단어의 빈도에만 집중하여 중요하지 않은 불용어가 여러 문서에 많이 등장하는 것을 보고 유사도가 높다고 오판할 수 있다. 이를 보완하기 위해서 고안된 것이 다음에 배울 TF-IDF이다.


image.png


출처 : 딥러닝을 이용한 자연어 처리 입문 (https://wikidocs.net/24559)


(3) TF-IDF

TF-IDF는 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단하여 특정 문서에서만 자주 등장하는 단어는 중요도가 높다고 판단하는 것이다. 여기서 TF는 앞서 구한 DTM이다. 식을 통해서 조금 더 자세히 알아보겠다.


image.png


출처 : http://openuiz.blogspot.com/2018/11/tf-idf.html


위의 식에서 TF는 간단하게 구할 수 있다. 그러나 IDF는 조금 복잡하다. 문서 빈도 DF와 전체 문서의 수 N을 로그화한다. 문서 빈도는 특정 단어가 몇 개의 문서에 등장했는지를 나타내며 이를 전체 문서의 수로 나는 값을 로그화를 취하는 것이다.


잘 이해가 안 된다면 밑의 유튜브 링크를 통해서 추가적으로 공부해 보면 좋을 것 같다.


참고영상 : https://www.youtube.com/watch?time_continue=2&v=Rd3OnBPDRbM&feature=emb_logo



2. LSA와 LDA

Bog of Words를 기반으로 한 DTM과 TF-IDF 행렬 기법으로는 근본적으로 단어의 의미를 벡터로 표현하지 못한다는 한계를 가지고 있다. 풀어서 이야기하자면 단어들의 빈도가 아닌 의미와 주제를 파악하기가 어렵다는 뜻이다. 이를 해결하는 기법이 LSA와 LDA이다. 먼저 LSA부터 살펴보겠다.


1) LSA

Latent Semantic Analysis, 즉 잠재 의미 분석으로 전체 코퍼스에서 문서 속 단어들 사이의 관계를 찾아내는 자연어 처리 정보 검색 기술이다. 이를 통해서 단어와 단어 사이, 문서와 문서 사이, 단어와 문서 사이의 의미적 유사성을 점수로 찾아낼 수 있다. 그렇다면 LSA는 어떻게 구할 수 있을까? 가장 먼저 이해해야 되는 개념은 특잇값 분해이다.


(1) 특잇값 분해

특잇값 분해란 Singular Value Decomposition 즉 SVD로 m x n 크기의 임의의 사각 행렬 A를 Full SVD와 같이 특이 벡터(singular vector)의 행렬과 특잇값(singular value)의 대각행렬로 분해하는 것을 말한다. 쉽게 소실되지 않는 범위에서 특징을 추출해서 사이즈를 축소한다고 보면 된다. 더 자세한 설명은 아래 참고 자료의 링크를 추가로 보면 좋을 것 같다.


image.png


출처 : https://wikidocs.net/24949

참고자료 https://datascienceschool.net/02%20mathematics/03.04%20%ED%8A%B9%EC%9E%87%EA%B0%92%20%EB%B6%84%ED%95%B4.html

https://www.youtube.com/watch?v=vxJ1MzfvL5w


(2) LSA와 Truncated SVD

LSA는 DTM이나 TF-IDF 행렬 등에 Truncated SVD를 수행한다. 이렇게 분해해서 얻은 행렬은 '문서들과 관련된 의미들을 표현한 행렬', '단어들과 관련된 의미를 표현한 행렬', '각 의미의 중요도를 표현한 행렬'로 해석할 수 있다. 정리하자면 DTM을 차원 축소하여 축소 차원에서 근접 단어들을 토픽으로 묶는 것이다. 수식적으로 자세한 설명은 아래의 링크를 통해서 확인할 수 있다.


참고자료 : https://www.analyticsvidhya.com/blog/2018/10/stepwise-guide-topic-modeling-latent-semantic-analysis/



2) LDA

Latent Dirichlet Allocation은 잠재 디리클레 할당으로 각 토픽의 단어 분포와 각 문서의 토픽 분포를 추정해 낸다. 쉽게 얘기해 특정 토픽에 특정 단어가 나타날 확률, 특정 문서에 특정 토픽이 나타날 확률을 결합 확률로 추정하여 토픽을 추정한다.


참고자료 시뮬레이션 : https://lettier.com/projects/lda-topic-modeling/

위키독스 : https://wikidocs.net/30708

영상강의 : https://serviceapi.nmv.naver.com/ugc/flash/convertIframeTag?vid=A008B9E1EAFC02C99F92928155487839090E&outKey=V1210ad4156cf64ce0c6a3e18cecaae499f6528784c999ca6541c3e18cecaae499f65&width=544&height=306



3. 텍스트 분포를 이용한 비지도 학습 토크나이저

텍스트 분포를 이용한 비지도 학습 토크나이저는 대표적으로 solnp를 통해서 형태소 분석을 할 수 있다. soynlp는 응집 확률(cohesion probability)과 브랜칭 엔트로피(branching entropy)를 활용하여 단어 점수를 매긴다. 간단하게 응집 확률과 브랜칭 엔트로피를 소개하고 마치도록 하겠다.


(1) 응집 확률(cohesion probability)

응집 확률은 내부 문자열이 얼마나 응집하여 자주 등장하는지를 판단하는 척도이다. 예를 들여 '인', '인공', '인공지' 라는 세 단어가 있다. 이 중에서 인공지능을 가장 잘 추정할 수 있는 단어는 '인공지'이다. 이를 바탕으로 다음 개념을 이해해 보겠다.


문자열을 문자 단위로 분리하여 내부 문자열을 만드는 과정은 왼쪽부터 순서대로 문자를 추가하는 것이다. 이때 각 문자열이 주어지면 그다음 문자가 나올 확률을 계산하여 누적 곱을 한 값을 뜻한다.


(2) 브랜칭 엔트로피(branching entropy)

확률 분포의 엔트로피 값으로 정확히 예측할수록 엔트로피의 값을 줄어든다. 응집 확률에서 본 것과 마찬가지로 '인공지'라는 단어가 가장 엔트로피 값이 낮게(정확하게) 측정이 될 것이다.

keyword