😒 저 저 저 개념없는 나/⛓️ DL & ML

[문서 제목 자동 분류 작업 | Clustering] 4. 한국어 Text Clustering TF-IDF K-means | 인턴

우주수첩 2024. 1. 15. 10:06
728x90

한국어 자연어 처리 시 유의할 점

  • 한국어 자연어 처리에서 가장 중요한 것은 단어 추출이고, 단어 추출 안에서는 의미적인 기능을 하는 부분과 문법적인 기능을 하는 부분을 구분해서 처리하는 것이 중요하다.
    => 즉 한국어 자연어 처리에서는 형태소 분석이 매우 중요하다.
  • 주어진 한국어 텍스트를 단어 원형의 형태로 분리해주는 작업 == 의미적인 부분 + 문법적인 부분으로 나누는 것.

 

KoNLPy

  • 자바 기반의 형태소 분석기를 파이썬에서 사용할 수 있게 해주는 라이브러리.
  • 여러 한국어 형태소 사전을 기반으로 한국어 단어를 추출해준다.
  • Mecab, 한나눔, 꼬꼬마, Komoran, Open Korean Text 다섯 종류의 형태소 사전을 사용한다.

 

Kkma a.k.a 꼬꼬마

  • 서울대에서 자연어 처리를 위해서 만든 형태소 파서
  • 처리속도는 느린 편이지만 성능이 아주 굿이에요 굿굿굿

 

본 연구에서는 KoNLPy 라이브러리에서 제공하는 한국어 자연어 처리 도구인 kkma 사용

 

코드

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from nltk.stem import WordNetLemmatizer
from konlpy.tag import Kkma
import nltk
import string


csv_file_path = '../sql_result.csv'

try:
    df = pd.read_csv(csv_file_path, encoding='utf-8')
except UnicodeDecodeError:
    print('utf-8으로 디코딩하는 중 오류 발생. 다른 인코딩 시도 필요.')


remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
kkma_kor = Kkma()

def KkmaLemNormalize_kor(text):
    tokens = kkma_kor.morphs(text)
    return ' '.join(tokens)

tfidf_vect_kor = TfidfVectorizer(tokenizer=KkmaLemNormalize_kor, ngram_range=(1,2))

ftr_vector_kor = tfidf_vect_kor.fit_transform(df['CONTENT_TITLE'])

kmeans_kor = KMeans(n_clusters=3,max_iter=10000,random_state=42)

cluster_label_kor = kmeans_kor.fit_predict(ftr_vector_kor)

df['cluster_kor'] = cluster_label_kor


new_file_path = '../data/clustering_kor.csv'
df.sort_values(by=['cluster_kor'])
df.to_csv(new_file_path, index=False)

 

 

 

설명 有

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from nltk.stem import WordNetLemmatizer
from konlpy.tag import Kkma
import nltk
import string


csv_file_path = '../sql_result.csv'

# 'utf-8'로 읽어보기
try:
    df = pd.read_csv(csv_file_path, encoding='utf-8')
except UnicodeDecodeError:
    print('utf-8으로 디코딩하는 중 오류 발생. 다른 인코딩 시도 필요.')

# print(df['CONTENT_TITLE'])

remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
# string.punctuation : 모든 구두점문자(쉼표, 마침표, 물음표, 느낌표, 따옴표 등)를 담고있는 문자열
# ord : 입력받은 문자열의 아스키 코드(유사:유니코드)를 반환.

kkma_kor = Kkma()
# KoNLPy 라이브러리에서 제공하는 한국어 자연어 처리 도구.


# 한국어 : 구두점 제거 및 표제어 추출e 함수
def KkmaLemNormalize_kor(text):
    tokens = kkma_kor.morphs(text)
    return ' '.join(tokens)


tfidf_vect_kor = TfidfVectorizer(tokenizer=KkmaLemNormalize_kor, ngram_range=(1,2))
# TfidfVectorizer를 초기화한 후 앞서 정의한 LemNormalize 함수를 사용하여 텍스트 전처리를 수행한다.
# ngram_range : 단어의 단일 및 이중(n-gram) 토큰을 모두 포함하도록 벡터화 한다.


ftr_vector_kor = tfidf_vect_kor.fit_transform(df['CONTENT_TITLE'])
# 원하는 컬럼을 가져와 fir_transform() 메소드를 통해 TF-IDF 모델을 학습하고 변환하며 그에 해당하는 행렬을 생성한다.


kmeans_kor = KMeans(n_clusters=3,max_iter=10000,random_state=42)

cluster_label_kor = kmeans_kor.fit_predict(ftr_vector_kor)

df['cluster_kor'] = cluster_label_kor


new_file_path = '../data/clustering_kor.csv'
df.sort_values(by=['cluster_kor'])
df.to_csv(new_file_path, index=False)

 

 

 

 

결과

Class 0 : 6879 / 15614
Class 1 : 4746 / 15614
Class 2 : 3989 / 15614

 

 

시각화

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
reduced_features = pca.fit_transform(ftr_vector_kor.toarray())
df[['pca_feature1', 'pca_feature2']] = reduced_features

# Visualize the clustering results using a scatter plot
plt.figure(figsize=(10, 8))

colors = sns.color_palette('husl', n_colors=len(df['cluster_kor'].unique()))
markers = ['o', 's', '^']

for cluster, color, marker in zip(df['cluster_kor'].unique(), colors, markers):
    cluster_data = df[df['cluster_kor'] == cluster]
    plt.scatter(cluster_data['pca_feature1'], cluster_data['pca_feature2'], color=color, marker=marker, label=f'Cluster {cluster}')

plt.title('K-Means Clustering Results')
plt.xlabel('PCA Feature 1')
plt.ylabel('PCA Feature 2')
plt.legend()
plt.show()

 

 

 

 

참고 url : https://velog.io/@7ryean/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-%ED%95%9C%EA%B5%AD%EC%96%B4-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EB%B0%8F-%EB%AC%B8%EC%9E%A5-%EC%9C%A0%EC%82%AC%EB%8F%84

 

[자연어처리] 한국어 자연어 처리 및 문장 유사도

자연의 처리의 기본 요소는 단어 추출에서 시작. 텍스트의 단어를 통해 문장의 의미, 구성 요소 및 특징을 파악 가능. 문장을 단어 기준으로 나누면 인물, 시간 등을 의미하는 단어를 알 수 있음.

velog.io

https://velog.io/@dnr6054/NLP-korean-nlp-and-sentence-similarity

 

[NLP] 한국어 자연어 처리 및 문장 유사도

NLP with /*elice*/

velog.io

 

 

728x90