Machine Learning

[파이썬 머신러닝 완벽가이드(위키북스)] : 텍스트 분석 part5 토픽 모델링

Coding Dang dang 2021. 12. 29. 13:48

문서 군집화 개념

  문서 군집화는 비슷한 텍스트 구성의 문서를 군집화하는 것이다. 문서 군집화는 동일한 군집에 속하는 문서를 같은 카테고리 소속으로 분류할 수 있으므로 앞에서 소개한 텍스트 분류 기반의 문서 분류와 유사하다. 하지만 텍스트 분류 기반의 문서 분류는 사전에 결정 카테고리 값을 가진 학습 데이터 세트가 필요한 데 반해, 문서 군집화는 학습 데이터 세트가 필요 없는 비지도 학습 기반으로 동작한다.

 

Opinion Review 데이터 세트를 이용한 문서 군집화 수행

  이번 실습에서는 여러 개의 파일을 하나씩 읽어서 파일명과 파일 리뷰를 하나의 DataFrame으로 로드하여 파일명별로 어떤 리뷰를 담고 있는지 대략적으로 살펴보았다. 

  

  여러 개의 파일을 DataFrame으로 로딩하는 로직은 다음과 같다. 먼저 해당 디렉터리 내의 모든 파일에 대해 각각 for 반복문으로 반복하면서 개별 파일명을 파일명 리스트에 추가하고 개별 파일은 DataFrame으로 읽은 후 다시 문자열로 반환한 뒤 파일 내용 리스트에 추가한다. 그리고 이렇게 만들어진 파일명 리스트와 파일 내용 리스트를 이용해 새롭게 파일명과 파일 내용을 칼럼으로 가지는 DataFrame을 생성한다. 

  다음으로 문서를 TF-IDF 형태로 피처 벡터화를 진행하였다.

  문서별 텍스트가 TF-IDF 변환된 피처 벡터화 행렬 데이터에 대해서 군집화를 수행해 어떤 문서끼리 군집되는지 확인해 보았다. 군집화 기법은 K-평균을 적용하였다. 문서의 유형은 크게 보면 <전자제품, 자동차, 호텔>로 되어있다. 먼저 5개의 중심(Centroid) 기반으로 어떻게 군집화되는지 확인을 해보았다.

  cluster #0은 주로 넷북, 아이팟, 킨들 등 포터블 전자기기에 대한 리뷰로 군집화돼 있다.

cluster #1은 주로 호텔에 관련된 리뷰가 주를 이루고 있다.

  이렇게 기존에 KMeans모델에 설정한 5개의 군집이 어느정도 잘 군집화된 것을 볼 수 있다. 하지만 전반적으로 군집화된 결과를 살펴보면 군집 개수가 약간 많게 설정돼 있어서 세분화되어 군집화된 경향이 있다. 중심 개수를 5개에서 3개로 낮춰서 3개의 그룹으로 군집화한 뒤 결과를 확인해 보았다.

  5개의 군집으로 군집화를 했을 때보다 조금더 군집이 잘 이루어진 것을 알 수 있다. 

 

군집별 핵심 단어 추출하기 

  각 군집에 속한 문서는 핵심 단어를 주축으로 군집화돼 있을 것이다. 이번에는 각 군집을 구성하는 핵심 단어가 어떤 것이 있는지 확인을 해 보았다. 

  

  KMeans 객체는 각 군집을 구성하는 단어 피처가 군집의 중심(Centroid)을 기준으로 얼마나 가깝게 위치해 있는지 cluster_centers_라는 속성으로 제공한다. cluster_centers_는 배열 값으로 제공되며, 행은 개별 군집을, 열은 개별 피처를 의미한다. 각 배열 내의 값은 개별 군집 내의 상대 위치를 숫자 값으로 표현한 일종의 좌표 값이다. 예를 들어 cluster_center[0,1]은 0번 군집에서 두 번째 피처의 위치 값이다. 위에서 군집 3개로 생성한 KMenas 객체인 km_cluster에서 cluster_centers_ 속성 값을 가져온 뒤 값을 확인을 해 보자.

  cluster_centers_는 (3,4611) 배열이다. 이는 군집이 3개, word 피처가 4611개로 구성되었음을 의미한다. 각 행의 배열 값은 각 군집 내의 4611개 피처의 위치가 개별 중심과 얼마나 가까운가를 상대 값으로 나타낸 것이다. 0에서 1까지의 값을 가질 수 있으며 1에 가까울수록 중심과 가까운 값을 의미한다. 

 

  다음으로 cluster_centers_ 속성값을 이용해 각 군집 별 핵심 단어를 찾아보았다. cluster_centers_ 속성은 넘파이의 ndarray이다. ndarray의 argsort()[:,::-1]을 이용하면 cluster_centers 배열 내 값이 큰 순으로 정렬된 위치 인덱스 값을 반환한다. 아래의 코드는 cluster_centers_ 배열 내에서 가장 값이 큰 데이터의 위치 인덱스를 추출한 뒤, 해당 인덱스를 이용해 핵심 단어 이름과 그때의 상대 위치 값을 추출해 기록하고 반환하는 로직을 지닌 코드이다. 

  결과물을 보면 군집의 큰 주제와 핵심 단어들이 잘 맞아 떨어지는 것을 알 수 있다.