-
[파이썬] 한국어 텍스트 데이터 전처리 예제 (1) 토큰화, 클렌징, 빈도수 탐색파이썬 배우기 2023. 12. 10. 13:42
가장 기초적이며 기본적인 데이터 분석은 정형데이터로 부터 시작했습니다. 현재의 분석 기술이나 인프라가 없었을 때, 분석과 연산이 가능한 데이터와 프로그램을 가지고 진행이 되었으며, 판매량, 판매 갯수, 수익 등의 수치 데이터로 시작되었습니다. 하지만 다양한 기술이 발달하고 반정형, 비정형 데이터를 분석할 수 있게 되었습니다. 오늘은 텍스트 분석 예제를 다뤄보며 실습을 해보려고 합니다.
텍스트 데이터 분석은 수치 데이터 분석과는 다르다고 생각하지만, 분석 과정은 크게 다르지 않습니다. 오늘은 한국어 버전 텍스트 데이터 전처리 과정을 공부해보겠습니다.
수치 데이터 텍스트 데이터 문제 정의 회귀, 분류, 이상치 탐지, 시계열 예측 등 감성 분석, 텍스트 분류, 텍스트 생성, 토픽 모델링, 개체명 인식 등 데이터 수집 수치 데이터를 int, float, datetime 등으로 준비 텍스트 데이터를 str 자료형으로 준비 데이터 전처리 데이터 표준화 / 정규화
outlier 처리
결측치 처리Tokenizing (토큰화)
Pos tagging (품사 표시)
Stopwords 불용어 제거
Stemming (단어 어근 찾기)
Lemmatization (표제어 찾기)
TF-IDF 변환 (단어 중요도 계산)
워드 임베딩 (의미적 유사성 계산)데이터 탐색 기술 통계량 확인 (평균, 중앙값, 표준편차 등의 기술통계를 계산하여 데이터의 중심 경향과 분산을 파악)
히스토그램 및 분포 시각화
Correlation Matrix (상관 계수로 변수간 선형 관계 확인)문서 길이, 단어 갯수 카운팅 (빈도수 확인)
단어 사전 기반 데이터 시각화 (토큰별 등장횟수, 워드클라우드 등)
N-gram 분석 (연속된 단어의 패턴을 파악)데이터 모델링 선형 회귀(Linear Regression)
의사결정 트리(Decision Tree)
랜덤 포레스트(Random Forest)
딥러닝 (케라스, 텐서플로우 등)분류모델 (로지스틱 회귀, 나이브 베이즈 등)
Bag of Words
유사도 분석 (TF-IDF, 코사인 유사도 등)
Word Embeddings
Doc2Vec
N-gram 모델
Attention Mechanism
Transfer Learning for NLP 등1. 텍스트 분석 전처리에 필요한 라이브러리 불러오기
from konlpy.tag import Kkma, Komoran, Okt, Hannanum # 한국어 토큰화 대표 주자들 from collections import Counter from matplotlib import font_manager, rc import matplotlib.pyplot as plt import nltk import re
2. 한국어 형태소 분석기 불러오기
okt = Okt() kkma = Kkma() komoran = Komoran() hannanum = Hannanum()
3. 텍스트 데이터 준비 (블로그 포스팅 글 중 하나를 가지고 왔습니다.)
# 전처리하고자 하는 문장을 String 변수로 저장한다 sentence1 = ''' 대학생 때, 모르는 개념이나 코드들이 있으면, 구글 검색이 짱이었다. 거기에는 모든 것이 있었다. 이 블로그 저블로그 다니면서 내가 원하는 것을 찾아야했지만 상위에 있는 2~3개 글만 봐도 답이 나와서 구글이 최고인줄 알았다. 머신러닝을 처음 공부했을 때, 덕분에 개념을 쉽게 이해할 수 있었으며, 에러 메세지를 해결하는 등 같은 경험을 겪은 블로거들의 도움을 많이 받았었다. 그래서 이제 나도 내가 아는 만큼 잘 정리해서 누군가에게 도움이 되고 싶었고, 그러면서 나도 흩어있던 지식들을 체계화할 수 있는 시간이 되면서 나에게도 도움이 되었다. 하지만 정보 전달이 목적인 글쓰기를 하다보니 요즘의 나도 글을 쓰기 전에 ChatGPT에게 물어보고 개념 및 특징을 가져와서 글을 쓴다. 블로그를 쓰는 것 이외에도 모르는 것이 있거나 원하는 방향대로 코드를 짜고 싶은데 그렇게 되지 않을 때 바로 ChatGPT에게 물어본다. 그러다가 문득 그런 생각이 들었다. 나도 ChatGPT로 바로 가는데, 누가 블로그를 보지? 특히 정답이 있는 정보 전달에 있어서는 굳이 블로그를 찾아다니면서 원하는 것이 있는지 읽어보는 것보다 ChatGPT에게 물어보는 것이 더 빠르고 간결하다. 그나마 맛집 추천, 공연 관람 후기, 축제 후기, 내돈내산 화장품 후기 등 사람의 경험을 바탕으로 한 블로그는 아직 ChatGPT 영역이 아니다. 그럼 진짜 내 누가 블로그를 보지? 결론은 "내가 보자!" 이다. 1. 내 블로그는 사실 내 입맛대로 쓴 것이기 때문에 내가 이해하기 제일 쉽다. 내가 아무리 다른 사람이 읽을 때 쉽게 이해하라고 풀어서 쓰려고 노력하지만 분명한건 내가 가장 잘 이해했을 것이다. 2. 블로그를 쓰면서 남들에게 지식을 공유하는 것이다보니 신뢰성이 있어야하기 때문에 책이나 다른 문서에서 확인하는 절차를 꼭 거친다. 그리고 가끔 ChatGPT도 틀리기도 하고 최신 버전에 맞지 않는 정보를 가져오기도 한다. 나는 내 블로그를 신뢰하기 때문에 내가 보면 된다. 3. 글을 쓰면서 쓰고 싶은 내용이 더 많아지지만 가시성과 주제를 생각하며 다음으로 빼기도 한다. 이렇게 지식을 확장하고 추가할 수 있다. 실제로 블로그로 정리하면서 기존보다는 오래 기억되는 것 같구, 비슷한 내용이 나왔을 때, 아! 나 이거 공부했었는데? 라는 생각이 든다. 그리고 내가 아는 것과 모르는 것이 구분이 되면서 메타인지가 강화된다. 4. 많은 자기계발서에서 책과 글쓰는 것의 중요성을 강조한다. 포스팅 전에 여러 번 글을 읽어보면서 문장과 문맥을 보게 되고, 맞춤법도 확인하게 된다. (물론 틀린 맞춤법이 많을 것 같다...) 또한 주제와 벗어나면 과감하게 지운다. 글의 주제를 명확히 하고, 논리적으로 쓰기 위해 노력한다. 이것 또한 분명 나에게 도움이 된다. 내가 쓰고 보자!! 하지만 글 하나 쓰는데 평균 3시간의 꽤 많은 시간을 투자하는데 그러다보면 ChatGPT 가 있는데 왜 이렇게 많은 시간을 할애하고 있지? 라는 생각이 든다. 나만의 규칙을 정해서 블로그를 쓰고 때로는 ChatGPT 를 잘 활용할 수 있는 그 사이 경계를 정해야겠다는 생각이 들었다. 그래서 블로그를 쓰기 위한 나만의 규칙을 생각했고 이렇게 행동하려고 노력해야겠다. 1. 내가 잘 아는 것은 쓰지 않기. 시간을 많이 투자해도 새로 얻고 정리하는 것에 가치가 큰 것을 쓰자. 어느 정도 알고 있는 것으로 시간을 많이 할애하지 말자. 모르는 것을 정리하는 느낌으로! 2. 템플릿을 만들어서 구성에 대한 시간을 줄이자. 개념 정의, 구동 방식, 구동 순서, 모델 장단점 등 내용에 따라 일반적인 나만의 템플릿을 만들어서 끼워넣자. 3. 내가 몰랐던 정도와 개념의 중요성에 따라 할애할 시간을 Time limit을 설정하자. 시간을 충분하게 잡으면 끝이 없다. Time limit을 걸자! '''
4. 문장을 토큰화한다. (형태소별로 하나하나 나누어서, 명사/동사/형용사/조사 등등을 구별해준다)
tagged_token1 = okt.pos(sentence1) tagged_token1
5. 첫 클렌징된 결과를 확인하여 리스트에 담는다. (정규표현식을 이용하여, 영어(대소문자 전부), 숫자, 한글만 가져옴)
result = [] # 첫 클렌징된 결과를 담기 위한 리스트를 생성한다 for token, pos in tagged_token1: if re.match('^[a-zA-Z0-9가-힣]+', token): result.append(token) print(result)
6. 불용어 사전에 추가하고 제거하는 방법 반복하기
► 품사 태깅한 tagged_token1 결과 확인하는 두가지 방법.
① token, pos 로 각각 따로 받기
② word를 한 번에 받아서 word[0], word[1] 로 나누기
stopwords = [] # 불필요한 단어 리스트 stopwords 생성 # 일차 클렌징된 결과를 보고 제거하고 싶은 문자 불용어 사전에 추가 stopwords.append('굳이') stopwords.append('정도') cleaned_token1 = [] for word in tagged_token1: if (len(word[0]) != 1) and (word[0] not in stopwords) and word[1] not in ["Josa", "Eomi", "Punctuation"]: cleaned_token1.append(word[0]) # token을 리스트에 더해준다 print(cleaned_token1) # 결과를 출력한다
7. 클렌징된 단어들의 빈도수 세기
counts = Counter(cleaned_token1) counts
8. 단어 갯수 확인하기
print(counts.most_common(5)) # 최빈값 단어와 개수 확인 print(len(cleaned_token1)) # 전체 token 개수 확인 print(len(set(cleaned_token1))) # unique한 token의 개수 확인
9. 텍스트 데이터를 쉽고 간단하게 분석하고 시각화를 해주는 nltk.Text()로 텍스트 타입으로 변환
corpus = nltk.Text(cleaned_token1) corpus
10. 빈도수 높은 단어 시각화
# 맥OS 한국어 인코딩 rc('font', family='AppleGothic') plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(10, 3)) plt.title('Top 10 Words',fontsize=30) corpus.plot(10) # 25개까지만 확인, "plot" the data
'파이썬 배우기' 카테고리의 다른 글
[파이썬] 데이터프레임에서 특정 조건의 값만 바꾸기 (1) 2024.01.29 [파이썬] 간단하게 라이브러리 버전 확인하는 두 가지 방법 (1) 2023.12.10 [파이썬] 파이썬에서 SQL 실행하기 (sqlite3) (0) 2023.11.24 [파이썬] 결측값 처리하는 6가지 방법 (fillna, SimpleImputer) (0) 2023.11.22 [파이썬] pandas 데이터프레임 속성값 바꾸기 (apply, replace) (1) 2023.11.22