brunch

Python으로 자연어 분석하기 (1) 형태소 분석

by 노다해

그러니깐 이건 아주 작은 계기로 시작되었다.

그렇지만 작은 계기들이 연쇄작용을 일으켜 일이 눈덩이처럼 불어났다.

이게 바로 cascade 인가..



본론으로 들어가면,


한국어 자연어 분석을 해보고 싶어져서

ChatGPT의 도움을 받아 진행해보았다.


대학원에서 귓동냥으로 들었던 k-means clustering를 발견했고,

익숙한 마음에 쉽게 도전했다.


하지만 한국어는 '형태소'분석이 어렵다는 큰 장벽이 있었다.


다행이도 여러 훌륭하신 분들께서 한국어 형태소 분석기를 개발해두셨지만,

성능이 좋아도 유지보수가 안되거나, 다른 언어의 옛날 버전을 참조하는 바람에

설치나 사용 환경 세팅이 어려웠다.


혼자서 검색하며 진행했다면 찾아내기 어려울 문제점들을

챗GPT와 함께 하면서 쉽사리 발견하고 헤쳐나갈 수 있었고,


나름의 자연어 분석 Process를 구축하게되었다.



뭐가되었든지 형태소 분석해서,

중요한 단어 리스트를 뽑아내고 나면

그 다음 분석은 어렵지 않다.


형태소 분석기 개발자분들에게 감사드리며



-------------------------------------------------------



한 가지 잡설을 더 하자면,


자연어 분석을 공부하다보니, 많은 경우 기계학습으로 주제가 연결되었다.

그래서 데이터 분석 단계에서와 기계학습 단계에서의 자연어 분석을 고민해보았는데,

나에게는 데이터 분석 단계가 더 알맞으리라는 결론을 내렸다.



-------------------------------------------------------



[개괄]


0. 텍스트 수집(Corpus, 말뭉치), 정제(Cleaning)


1. 형태소 분석(Tokenization) & 불용어(Stopwords) 제거

(1) Khaiii: 정확하기는 하지만, 설치가 까다롭고 20년도 이후로 유지보수 안되고 있음

(2) Okt: 감정 기반 분석에 좋다는데, Java 구 버전을 사용하기 때문에 환경 세팅이 까다롭다.

(3) Mecab: 결과도 Okt보다 잘 나오고, 설치 및 구동에도 어려움 없음


2. 단어 단위 벡터화

(1) Counts Matrix

- row: 문서(개별 답변, document) // column: 단어(term) // element: d에 t가 등장하는 횟수

- 단순한 빈도로, 전체 문서 경향을 보기에 좋음


(2) TF-IDF Matrix

- row: 문서(개별 답변, document) // column: 단어(term) // element: TF-IDF(t,d)

- TF-IDF(t,d) = TF(t,d) x IDF(t) = (해당 d에서 t의 빈도/d의 총 단어 수) x log(총 d의 개수/(t가 등장한 d의 갯수 + 1))

- 문서를 구별하고, 단어의 중요도를 판단하는데에 유용하며, 상대적 희귀성을 반영

- 단순한 Counts 보다는 문서를 분류(클러스터링)하는데에 더 적합

- 0: d에 t가 없음 // 작음: 모든 문서에 등장하는 너무 흔한 단어 // 큼: 해당 문서에서만 잘 나타나고 다른 문서에서는 드묾


3. 분석 알고리즘 적용

(1) WordCloud: Counts 기반 시각화

(2) k-means clustering

- 클러스터링 품질 평가 방법: 1) 실루엣 점수, 2) Elbow Method

(3) LDA(Latent Dirichlet Allocation)

- 결과물

1) 주제별 주요 단어 -> 의미 도출은 사람이

2) row: document // column: topic // element: 해당 문서가 특정 주제를 얼마나 포함하는지

- Perplexity, Coherence, pyLOVIS 등 품질 평가 방법

: Coherence가 무난한데, TF-IDF 기반 계산이 안되는 한계



-------------------------------------------------------




[분석 흐름]

1. 형태소 분석(Mecab 활용) 및 불용어(StopWords, customer_tokenizor 활용) 제거

2. Counts Matrix 계산

1) WordsCloud 그려서 불용어 목록 업데잇 (불필요한 단어 없을 때 까지 반복)

2) LDA의 Coherence 점수 계산

3. TF-IDF Matrix 계산

1) k-means clustering

: 클러스터링 품질 평가 방법 활용, 적절한 클러스터링 수 추출

2) LDA 시행

: 앞선 Counts Matrix에서의 Coherence와 클러스터링 품질 평가 방법 등을 참고하여 적절한 주제 갯수 결정



-------------------------------------------------------




** 코드는 네이버 블로그를 참고해주세요

https://blog.naver.com/ekgo48sun/223909029269

keyword
매거진의 이전글[잡설] 설문조사 주관식 답변 분석을 해보려..