머신러닝_13_자연어 처리
- Text Mining(텍스트 마이닝)
- 데이터에서 유용한 인사이트를 발굴하는 데이터 마이닝의 한 종류
- 정형 및 비정형 데이터를 자연어 처리 방식과 문서 처리 방법을 적용하여 유용한 정보를 추출/가공하는 것을 목적으로 하는 기술
2. 자연어 처리: 자연어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 과정
- 자연언어: 정보를 전달하는 수단으로 인간이 일상생활에서 사용하는 언어 예)영어
- 인공언어: 특정 목적을 위해 인위적으로 만든 언어 예)프로그래밍 언어
- 자연어 처리 응용 분야
-정보검색, 질의응답 시스템 예)Google, Naver, Siri, 빅스비, IBM Waston
-기계번역, 자동통역 예)Google 번역기, ETRI 지니톡
-문서작성, 문서요약, 문서분류, 문법 오류 검사 및 수정
- 기업활용사례: 지식경영, 사이버 범죄예방, 고객관리서비스, 고객 클레임분석을 통한 부정행위 탐지, 콘텐츠 강화, 소셜미디어 데이터 분석(제품 의견 및 감성반응)
3. 텍스트 마이닝 영역
- 텍스트 분류(Text Classification)
- 감성분석(Sentiment Analysis)
- 텍스트 요약(Summarization)
- 텍스트 군집화 및 유사도 분석(Clustering)
4. 텍스트 데이터의 구조: 말뭉치(corpus)>문서>단락>문장>단어>형태소
5. 텍스트 마이닝 분석 프로세스
1)텍스트 데이터 수집
- Crawling을 이용한 Web 데이터 수집(SNS/블로그/카페 등)
- 빅카인즈(BIG Kinds): 뉴스 데이터 제공 사이트
- NDSL: 국내외 논문, 특허, 연구 보고서 통합 정보제공 사이트
2)텍스트 전처리
- 오탈자 제거, 띄어쓰기 교정
- 불용어 제거: 데이터 분석에서 큰 의미가 없는 단어 제거
- 정제(cleaning)/정규화(normalization): 표현방법이 다른 단어를 통합시켜 같은 단어로 만듦
- 어간추출(Stemming)/표제어 추출(Lemmatization): 단어의 핵심부분만 추출, 유사한 단어들에서 대표 단어 추출
3)토큰화
- 주어진 말뭉치(corpus)를 토큰단위로 분할(공백기준/형태소 기준/명사 기준)
- 분석방법에 따라 토큰 분할 기준이 달라짐
예)감성 분석: 형태소 분석기로 동사, 형용사 위주로 추출
4)특징 값 추출
- 중요한 단어를 선별하는 과정
- 중요한 단어: 적은 수의 문서에 분포(TF), 문서 내 출현빈도 높음(IDF)
- 특정 텍스트로 문서를 구분해야 하므로 모든 문서에 분포된 단어는 차별성 없음
5)데이터 분석
- 머신러닝: Linear Regression, Logistic Regression, Random Forest, XGBoost
- 딥러닝: CNN, RNN, LSTM, GRU
6. 토큰화의 종류
- 단어(word) 단위: 텍스트를 단어로 나누고 각 단어를 하나의 벡터로 변환
- 문자(character): 텍스트를 문자로 나누고 각 문자를 하나의 벡터로 변환
- n-gram 단위: 텍스트에서 단어나 문자의 n-gram을 추출하여 n-gram을 하나의 벡터로 변환
7. 토큰화 n-gram
- n-gram: 연속된 n개의 단어나 문자의 시퀀스→문장/텍스트의 구조, 의미 파악, 모델 학습 시 주변 맥락 고려
- 토큰화 n-gram: n개의 연속된 단어를 하나로 취급하는 방법
- bigram: 두 개의 연속된 단어로 이루어진 조합(n=2인 경우), 단어의 개수를 늘리는 효과
예)러시아 월드컵을 ‘러시아’와 ‘월드컵’을 ‘러시아 월드컵’으로 인식
8.텍스트 벡터화(Vectorizer): One-hot-Encoding, BOW, Word Vector
1)원 핫 인코딩: 토큰에 고유번호 배정, 해당 고유번호 컬럼 1, 나머지 컬럼은 0 표시
2)BOW(Bag of Word): 문서 내의 단어를 토큰화하여 단어사전에 담은 후 벡터화, 문서 내 단어의 빈도 수를 벡터로 표현
- CounterVectorize: 단어의 문맥이나 순서를 무시하고 빈도 수를 기반으로 벡터화
- TF-IDF: 특정 문서에서는 자주 등장하지만 다른 문서에서 자주 등장하지 않는 단어에 높은 중요도 부여하는 방식
9.TF-IDF
- 개별문서에서 자주 등장하는 단어에 높은 가중치를 두고 모든 문서에서 자주 등장하는 단어에는 페널티를 주는 방식(단어의 중요도 반영)
- 특정 문서에 자주 등장하지만 다른 문서에서 자주 등장하지 않는 단어가 해당 문서에서 중요성이 높아짐
- 적은 문서에서 상대적으로 많이 발견될수록 가치 있는 정보
- 단어가 특정 문서에서만 등장하는 희소성을 반영하기 위해 TF*IDF 사용
- 유사도계산, 중요한 단어 추출해 문서분류, 정보검색, 추천 시스템에서 활용됨
1)TF(Term Frequency)
-특정 단어가 문서 내에서 등장하는 횟수
-단어의 빈도가 높을수록 단어의 중요도가 높음
2)IDF(Inverse Document Frequency)
-특정 단어가 등장한 문서의 수
-전체 문서 집합에서 해당 단어가 얼마나 흔한지 반영
-흔한 단어일수록 IDF값이 작아짐
[영화리뷰 데이터 감정분석]
1. 문제 정의
- 네이버 영화리뷰 데이터를 이용하여 긍정/부정 분류 모델 만들기
- TF-IDF 방식으로 중요한 단어 추출
- Konlpy 한국어 형태로 분석기 활용하여 형태소 분석
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
2. 데이터 불러오기
df_train=pd.read_csv('/content/drive/MyDrive/실습파일/머신러닝 실습/Data/ratings_train.txt', delimiter='\t')
df_test=pd.read_csv('/content/drive/MyDrive/실습파일/머신러닝 실습/Data/ratings_test.txt', delimiter='\t')
#train 결측치 확인
df_train.info()
#test 결측치 확인
df_test.info()
- 결측치 삭제: 모든 컬럼의 데이터 개수가 동일해야 함
#train 결측치 행 삭제->.dropna()
df_train.dropna(inplace=True)
df_test.dropna(inplace=True)
3. 한국어 형태소 분석기 환경설정
- jpype1, 라이브러리, konlpy 라이브러리 설치
# 1.jpype1 라이브러리 설치
!pip install jpype1
# 2. konlpy 라이브러리 설치
! pip install konlpy
4. Kkma 형태소 분석기
#Kkma 불러오기
from konlpy.tag import Kkma
# Kkma 생성
kkma=Kkma()
- 문장분석 예시
#Kkma 예시
text='한국에서 자연어 처리는 흥미롭고 유용한 분야입니다.'
#.sentences->문장분석
sentence=kkma.sentences(text)
#.nouns->명사 추출
nouns=kkma.nouns(text)
#.morphs->형태소
morphs=kkma.morphs(text)
#.pos->품사 태깅
pos_tags=kkma.pos(text)
print('문장분석', sentence)
print('명사 추출', nouns)
print('형태소 분석', morphs)
print('품사 태깅', pos_tags)
5. 문제/정답 데이터 분할
#train 문제/정답 데이터 분할
text_train=df_train['document'] #문제
y_train=df_train['label'] #답지
#test 문제/정답 데이터 분할
text_test=df_test['document']
y_test=df_test['label']
6. Vectorizer
머신러닝, 딥러닝에서 텍스트 데이터를 수치데이터로 변환하는데 사용
BOW(Bag of Word): 문서 내 단어의 빈도 수를 벡터로 표현
TF-IDF: 단어의 중요도를 나타내는 벡터
Word2Vec: 단어의 고정된 차원의 수를 실수 벡터로 매핑
1)TF-IDF
#TF-IDF 불러오기
from sklearn.feature_extraction.text import TfidfVectorizer
#객체 생성
tf_idf=TfidfVectorizer()
#단어사전 구축->fit
tf_idf.fit(text_train[:3])
#분리된 문장으로 단어사전 확인
tf_idf.vocabulary_.keys()
2)원하는 품사만 추출하기
- 품사 종류 확인
#품사 종류 확인
kkma.tagset
- 품사태깅 데이터프레임으로 만들고 특정 품사만 추출하기
# 원하는 품사만 추출하기
# VA(형용사) VV(동사),NNG(보통명사)
#품사태깅 데이터프레임으로 만들기
df_data=pd.DataFrame(kkma.pos(data), columns=['형태소', '품사태깅'])
df_data.set_index('품사태깅', inplace=True)
# VA(형용사) VV(동사),NNG(보통명사)만 추출하는 조건 설정
df_data.loc[df_data.index.intersection(['VA', 'VV', 'NNG'])]
- 원하는 품사만 추출하는 사용자 정의 토큰화 함수
#원하는 품사만 추출하는 사용자 정의 토큰화 함수
def Tokenizer(text):
return kkma.nouns(text)
#품사태깅 데이터프레임으로 만들기
df_data=pd.DataFrame(kkma.pos(data), columns=['형태소', '품사태깅'])
df_data.set_index('품사태깅', inplace=True)
# VA(형용사) VV(동사),NNG(보통명사)만 추출하기
# VA(형용사) VV(동사),NNG(보통명사) 중 하나라도 index에 있으면 조건문 실행
if('VA' in df_data.index) |('VV' in df_data.index)| ('NNG' in df_data.index):
return df_data.loc[df_data.index.intersection(['VA', 'VV', 'NNG']), '형태소'].values
else:
return[]
3)실제 데이터에 TF-IDF 적용하기
- TF-IDF 객체 생성
#실제 데이터 TF-IDF 적용하기!
#TF-IDF 객체 생성
tf_final=TfidfVectorizer(tokenizer=Tokenizer)
- TF-IDF 단어사전 구축
#단어 사전 구축
tf_final.fit(text_train[:5000])
- 단어사전으로 벡터화
#토큰의 단어사전을 이용해 벡터화
X_train=tf_final.transform(text_train[:5000])
X_test=tf_final.transform(text_test[:5000])
4)로지스틱 회귀모델 적용하기
- 모델 학습/평가
# 로지스틱 회귀 모델 불러오기
from sklearn.linear_model import LogisticRegression
#모델 객체 생성
logi_model=LogisticRegression()
#모델 학습
logi_model.fit(X_train, y_train[: 5000])
# 모델 평가
score=logi_model.score(X_test, y_test[:5000])
print('모델 평가 점수',np.round(score,2))
- 모델 예측확률, 예측결과 긍정/부정으로 표현하기
#예측결과 인덱스 변환
target_name=['부정', '긍정']
#문제데이터 입력(리뷰 중 하나만 변환해보기)
review=['오랜만에 너무나 재미있는 영화였네요 또 보고 싶어요'] #긍정
#전처리(벡터화)
review_vec=tf_final.transform(review)
#예측(predict)
pre=logi_model.predict(review_vec)
print(pre)
#예측결과 문자 변환
pre_name=target_name[pre[0]]
#예측확률(predict_proba)
pre_proba=np.round(logi_model.predict_proba(review_vec).max()*100,2)
print(review, pre_name, pre_proba)
'머신러닝' 카테고리의 다른 글
[ML]12. 로지스틱 회귀모델 (0) | 2023.09.01 |
---|---|
[ML]11. 모델 정규화 (0) | 2023.08.31 |
[ML]10. 선형회귀모델 (0) | 2023.08.30 |
[ML]9. 분류평가지표 (0) | 2023.08.29 |
[ML]8. 타이타닉호 생존자 예측 모델 (0) | 2023.08.25 |