본문 바로가기
데이터 청년 캠퍼스/SQL | 군집분석 | 소셜분석

[소셜분석] 자연어 분석 KoNLPy 라이브러리 설치 및 실습

by 뚱뚜루뚱 2022. 7. 13.
파이썬 자연어 분석(NLP, Natural Language Processing)
  1. 토큰화 Tokenization: 문자열에서 단어로 분리하는 단계
  2. 불용어 제거 Stop Word Elimination: 전치사, 관사 등 너무 많이 등장하는 단어 등, 문장이나 문서의 특징을 표현하는데 불필요한 단어를 삭제하는 단계 (예: 내가, 나, 너, 너가, 우리)
  3. 어간 추출 Stemming - 활용어 -> 원형 : 단어 -> 의미, 무의미: 단어의 기본 형태를 추출하는 단계 - (형태소분석기) -> 단어사전
  4. 문서표현 Representation - 소셜, 텍스트: 주어진 문서나 문장을 하나의 벡터로 표현하는 단계, 단어들을 모두 인덱싱하고 주어진 문서에 존재하는 단어의 빈도수를 사용하여 문서를 표현

 

자연어 처리를 위한 파이썬 라이브러리
  1. KoNLPy (Korean NLP in Python): 한국어 자연어처리를 위한 파이썬 라이브러리. 자연어처리, 텍스트에서 의미있는 정보를 분석, 추출하는 기술. Komora, Mecab 등 다양한 형태소 분석기 내장
  2. NLTK (Natural Language Toolkit): 영어로 된 텍스트의 자연어처리를 위한 대표적인 파이썬 라이브러리. 편한 UI 환경과 WordNet, 강력한 NLP 라이브러리 제공
  3. Gensim: 주로 Topic Modeling, Corpus 및, Word Embedding 모델 지원. 한국어 및 다양한 언어 지원

 

토큰화

예) I love you. Data-mining

I / love / you로 띄어쓰기나 개행을 기준으로 단어 떼어내기

  • 띄어쓰기와 개행을 기준으로 분리 I / love / you. / Data-mining
  • 문장 부호를 기준으로 분리 I / love / you / . / Data / - / mining
  • 문장 부호 예외 처리 I / love  / you / . / Data-mining

 

불용어 제거

모든 단어를 소문자화한다. 불용어 사전을 검색하여 불용어를 삭제한다. 전체 말뭉치에서 n번 이상 등장하지 않는 중요하지 않은 단어를 삭제한다

 

 

어간 추출

단어를 기본형으로 표현하여 같은 단어가 표현형때문에 다른 단어로 인덱싱 되는 일이 없도록 한다. 이때 다양한 알고리즘을 사용하는데, 기본형으로부터 단어들을 자동으로 파생해 리스트를 만들고 매칭하기도 한다

 

 

문서 표현

다양한 알고리즘을 사용하여서 문서(text)를 벡터(vector) 값으로 변환하는 단계. 벡터값을 통해 유클리디안 거리, 코사인 유사도 등으로 단어/문서 간의 유사성을 구할 수 있다.

 

 

단어사전 Dictionary - 불용어, 감성, 별점사전, 단어벡터(1000-3000)

단어와 단어에 대한 인덱스를 표현하는 사전이다. 단어 자체를 사용하여 문서 표현하면 비효율적이므로, 문서 집합에 문서를 읽고 토큰화 불용어 제거 등을 수행하면서 사전을 구축한다. 불용어, 어간추출 등의 비적용/부분적용을 선택해야한다. 

 

 

KoNLPy 설치하기
  1. Java 1.7 이상 설치: x64 Windows Version Installer
  2. Java_HOME 설정하기: Java >jdk1.8.0_333 > jre > bin > server > jvm_dll (경로복사) - 컴퓨터 속성 - 고급 시스템 설정 - 환경 변수 - 새로 만들기: 변수명 JAVA_HOME, 변수값: 복사한 경로
  3. JPype1 (>=0.5.7) 다운로드: 1-1.1.2(강의 내에서 사용할 버전)-cp39(python version)-win.amd64.whl
  4. JPype1 설치: Jupyter 노트북 - new - Terminal - 경로 맞추기 - pip install JPype1-1.1.2-cp39-win_amd64.whl 
  5. 테스트
# 파이썬 버전 확인
import sys  
print(sys.version)

# 테스트
from konlpy.tag import Kkma 
kkma = Kkma() 
kkma.sentences('한국어 분석을 시작합니다 재미있어요~~')

 

konlpy 실습
#Kkma
from konlpy.tag import Kkma
kkma = Kkma()
kkma.sentences('한국어 분석을 시작합니다 재미있어요~~') #문장 단위
kkma.nouns('한국어 분석을 시작합니다 재미있어요~~') #명사 단위
kkma.pos('한국어 분석을 시작합니다 재미있어요~~') #단어, 품사(세부품사)


#Hannanum
from konlpy.tag import Hannanum
hannanum=Hannanum()
hannanum.nouns('한국어 분석을 시작합니다 재미있어요~~') #명사 단위
hannanum.morphs('한국어 분석을 시작합니다 재미있어요~~') #형태소 분석기
hannanum.pos('한국어 분석을 시작합니다 재미있어요~~') #단어, 품사(세부품사)


#Okt
from konlpy.tag import Okt
t=Okt()
t.nouns('한국어 분석을 시작합니다 재미있어요~~') #명사 단위
t.morphs('한국어 분석을 시작합니다 재미있어요~~') #형태소 분석기
t.pos('한국어 분석을 시작합니다 재미있어요~~') #단어, 품사(세부품사)

 

Kobill 데이터 살펴보기
# 필요한 패키지와 데이터 불러오기
from konlpy.corpus import kobill
import nltk

# 내장데이터 kobill내 1809890.txt 파일 불러오기
files_ko=kobill.fileids()
doc_ko=kobill.open('1809890.txt').read()
doc_ko

#형태소 분석기
tokens_ko=t.morphs(doc_ko)

ko=nltk.Text(tokens_ko, name = '대한민국 국회 의안 제 1809890호')

print(len(ko.tokens)) #전체 단어 개수
print(len(set(ko.tokens))) #중복을 제거한 단어 개수
ko.vocab() #단어 목록
ko.count('초등학교') #Occurences 개수 세기
ko.concordance('육아휴직') #등장한 문자 확인
ko.similar('부모') #유사한 단어 탐색