기초통계

[텍스트 분석] 자연어 : 문서 단어 행렬

2022. 10. 4. 21:00

텍스트 분석 : 자연어


  KEYWORD  

자연어
문서단어행렬


자연어 Natural Language

자연어 natural language

: 한국어, 영어 등 자연스럽게 생겨난 언어

 

인공어 constructed language

- 에스페란토(1887): 자멘호프가 국제적 의사소통을 위해 개발

- 나비 : 영화 아바타의 외계인 언어로 사용하기 위해 개발

 

통제 자연어 controlled natural language

형식어 formal language

: 수식, 프로그래밍 언어 등

 


자연어 특징

규칙이 복잡하고, 예외가 많음

음운론, 통사론, 의미론 등 다양한 수준으로 이뤄져 있음

종 류 설 명
음소 phoneme - 언어에서 소리의 가장 작은 단위, 그 자체로는 의미없음  
형태소 morpheme - 의미가 가장 작은 단위 multi-
단어 word - 독립적으로 쓰일 수 있는 형태소 media
구문 구조 syntax - 단어들이 모여서 문장을 이루는 구조
해석을 위해서는 여러 수준에 대한 복합적인 고려가 필요함
Time flies like an arrow;
fruit flies like a banana.

자연어 처리 접근 방식

규칙 기반 rule-based 머신러닝 Machine learning
언어의 규칙을 프로그래밍
단순한 처리는 쉽게 가능
다양한 예외, 모호성 등으로 복잡한 처리는 어려움
방대한 데이터를 바탕으로 패턴을 추출
복잡한 처리도 가능
데이터를 손으로 분류하는 비용이 높음

 

 


문서 단어 행렬  Documetn Term Maxtirx

> 문서별로 단어 빈도를 정리한 표

 

 

문서 단어 행렬의 장단점

장점 단점
• 비정형 데이터인 텍스트를 표 형태로 정형화
• 정형 데이터의 다양한 통계 기법을 적용 가능
• 처리가 단순 ↔ 어순과 맥락을 무시

  CountVectorizer 실습  

① 데이터 임포트하기

import pandas as pd
df = pd.read_excel('yelp.xlsx')
df.head()

> 데이터 확인

df.head()
df.tail()
df.shape  # 데이터 형태

 

from sklearn.feature_extraction.text import CountVectorizer

cv = CountVectorizer(max_features = , stop_words = 'english')

  • max_features : 문서단어행렬에 포함시킬 최대(max)의 단어(feature) 수
  • stop_words : 분석에서 제외할 불용어를 설정 
    - english로 설정하면 영어의 경우 관사, 전치사 등을 제외
    - 다른 언어는 리스트 등의 형태로 불용어 목록을 넘겨주어야 함.
# 문서 단어 행렬 설정
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features=500, stop_words='english')

 

> 영어 불용어 목록 보기 와 추가하기

 

from sklearn.feature_extraction.text import ENGLISH_STOP_WORDSENLISH_STOP_WORDS                                                                                                    # 불용어 목록stop_words = ENGLISH_STOP_WORDS | {'추가하고싶은단어'}                           # 단어 추가

 


실습

< review 컬럼으로 문서 단어 행렬 만들기 >

# df의 review 컬럼을 바탕으로 문서 단어 행렬을 만든다.
import pandas as pd
df = pd.read_excel('yelp.xlsx')
df.columns # Index(['review', 'sentiment'], dtype='object')

# 문서 단어 행렬 설정
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features=500, stop_words='english')

# df의 review 컬럼으로 문서 단어 행렬을 만든다.
dtm = cv.fit_transform(df['review'])

# 형태 확인
dtm.shape     # (1000, 500)

# 단어 목록을 확인
# 단어 목록은 dtm이 아닌 cv에 저장된다.
cv.get_feature_names()

 

> dtm

 <1000x500 sparse matrix of type '<class 'numpy.int64'>'
 with 3393 stored elements in Compressed Sparse Row format>

 

> 압축을 풀어서 보려면 .A

dtm.A

 

> 단어별 총 빈도 .sum(axis=0)

dtm.sum(axis=0)
더보기

> 단어별 빈도수가 출력됨.

 

>  문서별 총 단어수 .sum(axis=1)

 

> 단어 빈도 데이터 프레임 만들기

word_count = pd.DataFrame({'단어':cv.get_feature_names(),
                          '빈도': dtm.sum(axis=0).flat
                          })
word_count

> 필요 항목에 따라 정렬 가능
   .sort_values('빈도', ascending=False)