문서 군집화 소개와 실습(Opinion Review 데이터 세트)
- 문서 군집화
: 비슷한 텍스트 구성의 문서를 군집화 하는 것
↔ 사전에 결정 카테고리 값을 가진 학습 데이터가 필요한 텍스트 분류 기반의 문서분류와 다르게, 문서 군집화는 학습 데이터 세트가 필요없는 비지도학습 (군집화) 기반으로 동작함.
+TfidfVectorizer는 Lemmatization 같은 어근 변환을 직접 지원하지는 않지만, tokenizer 인자에 커스텀 어근 변환 함수를 적용해 어근 변환을 수행할 수 있음.
벡터화 수행해주고, k-평균 이용해서 군집화 해줌.
→ cluster_label(0, 1, 2..) 별로 filename 확인하면 어떻게 군집화 되어있는지 볼 수 있음.
→ 군집화된 결과 보면, 군집개수가 많게 설정 되어있으면 세분화되어 군집화되는 경향이 있기 때문에 중심 개수 k를 낮춰서 군집화해보면 됨.
- 군집별 핵심 단어 추출하기
각 군집에 속한 문서는 핵심 단어를 주축으로 군집화돼 있을 것.
각 군집을 구성하는 핵심 단어가 어떤 것이 있는지 확인해보자.
KMeans 객체는 각 군집을 구성하는 단어 피처가 군집의 중심을 기준으로 얼마나 가깝게 위치해 있는지 cluster_center_라는 속성으로 제공함.
→ 행은 개별 군집, 열을 개별 피처를 의미 ex) [0,1] → 0번 군집에서 두 번째 피처의 위치 값
(1에 가까울수록 중심과 가까운 값)
-이 속성값을 이용해 각 군집별 핵심 단어 찾을 수 있음
ndarray의 argsort()[:, ::-1]를 이용하면 cluster_centers 배열 내 값이 큰 순으로 정렬된 위치 인덱스 값을 반환함. ( 큰 값으로 정렬한 값을 반환하는 게 아니라, 큰 값을 가진 배열 내 위치 인덱스 값을 반환) → 핵심 단어 피처의 이름을 출력 (배열 내에서 가장 값이 큰 데이터의 위치 인덱스를 추출한 뒤, 해당 인덱스를 이용해 핵심 단어 이름과 그 때의 상대 위치 값을 추출)
# 군집별 top n 핵심단어, 그 단어의 중심 위치 상대값, 대상 파일명들을 반환함.
def get_cluster_details(cluster_model, cluster_data, feature_names, clusters_num, top_n_features=10):
cluster_details = {}
# cluster_centers array 의 값이 큰 순으로 정렬된 index 값을 반환
# 군집 중심점(centroid)별 할당된 word 피처들의 거리값이 큰 순으로 값을 구하기 위함.
centroid_feature_ordered_ind = cluster_model.cluster_centers_.argsort()[:,::-1]
#개별 군집별로 iteration하면서 핵심단어, 그 단어의 중심 위치 상대값, 대상 파일명 입력
for cluster_num in range(clusters_num):
# 개별 군집별 정보를 담을 데이터 초기화.
cluster_details[cluster_num] = {}
cluster_details[cluster_num]['cluster'] = cluster_num
# cluster_centers_.argsort()[:,::-1] 로 구한 index 를 이용하여 top n 피처 단어를 구함.
top_feature_indexes = centroid_feature_ordered_ind[cluster_num, :top_n_features]
top_features = [ feature_names[ind] for ind in top_feature_indexes ]
# top_feature_indexes를 이용해 해당 피처 단어의 중심 위치 상댓값 구함
top_feature_values = cluster_model.cluster_centers_[cluster_num, top_feature_indexes].tolist()
# cluster_details 딕셔너리 객체에 개별 군집별 핵심 단어와 중심위치 상대값, 그리고 해당 파일명 입력
cluster_details[cluster_num]['top_features'] = top_features
cluster_details[cluster_num]['top_features_value'] = top_feature_values
filenames = cluster_data[cluster_data['cluster_label'] == cluster_num]['filename']
filenames = filenames.values.tolist()
cluster_details[cluster_num]['filenames'] = filenames
return cluster_details
def print_cluster_details(cluster_details):
for cluster_num, cluster_detail in cluster_details.items():
print('####### Cluster {0}'.format(cluster_num)) #개별 군집번호
print('Top features:', cluster_detail['top_features']) # 핵심단어
print('Reviews 파일명 :',cluster_detail['filenames'][:7]) # 파일명 속성 값 정보
print('==================================================')
'Machine Learning > 텍스트 분석' 카테고리의 다른 글
[파이썬 머신러닝 가이드] 텍스트 분석 - 한글 텍스트 처리, 텍스트 분석 실습 (2) | 2023.12.26 |
---|---|
[파이썬 머신러닝 가이드] 텍스트 분석 - 문서 유사도 (2) | 2023.12.26 |
[파이썬 머신러닝 가이드] 텍스트 분석 - 토픽 모델링 (1) | 2023.12.26 |
[파이썬 머신러닝 가이드] 텍스트 분석 - 감성 분석 (2) | 2023.12.26 |
[파이썬 머신러닝 가이드] 텍스트 분석 - 텍스트 분류 실습(20 뉴스그룹 분류) (2) | 2023.12.26 |