머신러닝

[ML]13. 자연어 처리

CodeJaram 2023. 9. 6. 09:14

머신러닝_13_자연어 처리

 

  1. 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