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()
https://velog.io/@dnr6054/NLP-korean-nlp-and-sentence-similarity
728x90
'😒 저 저 저 개념없는 나 > ⛓️ DL & ML' 카테고리의 다른 글
[문서 제목 자동 분류 작업 | Classification] 1. 데이터 생성 및 최적 모델 탐지 | 인턴 (2) | 2024.01.29 |
---|---|
[문서 제목 자동 분류 작업 | Clustering] 5. 한국어 Text Clustering Word2Vec K-means | 인턴 (0) | 2024.01.17 |
[문서 제목 자동 분류 작업 | Clustering] 3. K-Means 알고리즘 학습 적용 군집화 | 인턴 (0) | 2024.01.15 |
[문서 제목 자동 분류 작업 | Clustering] 2. NLTK를 사용한 문서 제목 토큰화 및 어근 추출 | 인턴 (0) | 2024.01.15 |
[문서 제목 자동 분류 작업 | Clustering] 1. CSV 파일 읽어오기 | 인턴 (0) | 2024.01.15 |