+ 개발

문서 표현 기법(ft. Scikit-learn & Gensim)

AI.Logger 2024. 9. 8. 00:09
  • 수업 내용 리마인드 및 아카이빙 목적의 업로드


자연어 처리(NLP)에서 문서를 어떻게 표현하느냐는 아주 중요한 부분이에요. 오늘은 두 가지 대표적인 파이썬 라이브러리인 Scikit-learn(Sklearn)Gensim을 가지고 문서 표현 방법을 쉽게 설명해볼게요. 이 두 라이브러리는 각기 다른 장점이 있어서 상황에 맞게 잘 선택해서 사용하면 좋아요.

 

Scikit-learn과 Gensim 비교

  • Sklearn은 일반적인 머신러닝 작업에 적합해요. 텍스트 데이터를 다룰 때, 분류나 클러스터링 같은 고급 머신러닝 작업을 할 때 많이 사용해요.
  • Gensim은 대규모 텍스트 데이터에서 주로 쓰이는 라이브러리인데요, 주제 모델링(LDA)이나 단어 임베딩(Word2Vec) 같은 작업에 특히 강점이 있어요.

1. BoW (Bag of Words)

Bag of Words는 텍스트에서 단어의 빈도만을 가지고 문서를 표현하는 가장 기본적인 방법 중 하나예요. 단어의 순서나 문맥을 고려하지 않고, 단어가 얼마나 자주 등장하는지만 따지는 방법이죠.

 

1) Sklearn으로 BoW 만들기

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

docs = ['오늘 동물원에서 원숭이를 봤어',
        '오늘 동물원에서 코끼리를 봤어 봤어',
        '동물원에서 원숭이에게 바나나를 줬어 바나나를']

count_vect = CountVectorizer()
BoW = count_vect.fit_transform(docs)
print(BoW.toarray())  # 희소 행렬을 배열로 변환해 출력

Sklearn의 CountVectorizer는 자동으로 텍스트를 나눠주고 단어의 등장 빈도를 세서 벡터로 바꿔줘요. 희소 행렬로 표현된 결과는 나중에 빠르게 분석할 때 유용해요.

 

2) Gensim으로 BoW 만들기

from gensim import corpora

doc_ls = [doc.split() for doc in docs]
id2word = corpora.Dictionary(doc_ls)
BoW = [id2word.doc2bow(doc) for doc in doc_ls]
print(BoW)  # 희소 행렬 형태로 출력

Gensim의 Dictionary를 사용하면 각 단어에 고유한 ID가 부여되고, 각 문서에서 단어가 몇 번 등장했는지를 나타내는 BoW 벡터로 변환돼요.

 

 

2. DTM (Document-Term Matrix)

문서-단어 행렬(DTM)은 문서에서 각 단어의 빈도를 행렬로 만들어주는 방식이에요. BoW와 비슷하지만 여러 문서를 한꺼번에 비교할 때 유용하죠.

 

1) Sklearn으로 DTM 만들기

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

DTM = count_vect.fit_transform(docs)
df_DTM = pd.DataFrame(DTM.toarray(), columns=count_vect.get_feature_names_out())
print(df_DTM)

Sklearn의 CountVectorizer로 DTM을 만들면 문서 간의 단어 분포를 쉽게 확인할 수 있어요. 데이터프레임으로 변환해서 보기에도 좋고요.

 

2) Gensim으로 DTM 만들기

import gensim
from gensim import corpora

doc_ls = [doc.split() for doc in docs]
id2word = corpora.Dictionary(doc_ls)
DTM = [id2word.doc2bow(doc) for doc in doc_ls]
DTM_matrix = gensim.matutils.corpus2dense(DTM, num_terms=len(id2word)).T

Gensim에서는 corpus2dense 함수를 써서 희소 행렬을 밀집 행렬로 변환할 수 있어요. 이를 통해 문서에서 단어의 빈도를 쉽게 분석할 수 있답니다.

 

 

3. TF-IDF (Term Frequency-Inverse Document Frequency)

TF-IDF는 단어의 빈도(TF)와 역문서 빈도(IDF)를 함께 고려해서 중요한 단어를 찾아내는 방법이에요. 문서 내에서 자주 등장하는 단어가 다른 문서에서는 잘 안 나오는 경우, 그 단어가 중요한 단어로 판단돼요.

 

1) Sklearn을 활용한 TF-IDF

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

tfidf_vect = TfidfVectorizer()
tfidf = tfidf_vect.fit_transform(docs)
df_tfidf = pd.DataFrame(tfidf.todense(), columns=tfidf_vect.get_feature_names_out())
print(df_tfidf)

Sklearn의 TfidfVectorizer는 각 문서에서 단어의 중요도를 계산해줘요. 이를 통해 문서 간의 차이를 쉽게 분석할 수 있죠.

 

2) Gensim을 활용한 TF-IDF

from gensim.models import TfidfModel
import gensim

model = TfidfModel(DTM)
DTM_matrix = gensim.matutils.corpus2dense(model[DTM], num_terms=len(id2word)).T

Gensim에서는 TF-IDF 모델을 통해 문서 내에서 단어의 중요도를 계산하고, 이를 밀집 행렬로 변환해줘요. 이 방식은 대규모 텍스트 데이터를 처리하는 데 특히 유용해요.

 

 

문서 표현 기법은 텍스트 데이터를 다룰 때 매우 중요한 부분이에요. Scikit-learn은 머신러닝 작업에 적합하고, Gensim은 대규모 텍스트에서 의미 있는 패턴을 추출하는 데 아주 강력해요. 상황에 맞게 두 라이브러리를 적절히 활용하면, 텍스트 데이터를 훨씬 더 효과적으로 분석할 수 있을 거예요.