HyeM

6부_1장 한국어 분석(형태소 분석) 본문

Study/AI&DeepLearning

6부_1장 한국어 분석(형태소 분석)

Hailey_HyeM207 2020. 7. 17. 18:00

형태소 분석 

: 자연 언어의 문장을 "형태소"라는 의미를 갖는 최소 단위로 분할하고, 

품사를 판별하는 작업


형태소 분석은 기계번역, 텍스트 마이닝 등에 활용됨.

 

01. 형태소 분석

  • 영어 형태소 분석 
    영어는 it's와 don't등을 제외하고는, 띄어쓰기로 형태소를 구분 가능하기 때문에 크게 어렵지 않다.

  • 아시아 계열의 언어 형태소 분석
    문법 규칙에 의한 방법
    확률적 언어 모델 사용하는 방법 <- 최근에 이 방법으로 정밀도 높아짐.

 

 

 

02. KoNLPy의 트위터 형태소 분석기

한국어 형태소 분석 라이브러리인 KoNLPy를 이용하면 한나눔, 꼬꼬마, komoran, MeCab, 트위터 등의 형태소 분석기 쉽게 사용 가능

KoNLPy에는 Hannanum, Kkma,  Komoran, Mecab, Okt(Twitter) 분석기가 있다. 우리는 이 중  Okt(트위터 형태소 분석기)를 사용할 것이다.

단계1. 설치

 

 

단계2. 소스코드

from konlpy.tag import Okt
okt=Okt()  #Okt 객체를 생성
malist=okt.pos("아버지 가방에 들어가신다.",norm=True, stem=True)
print(malist)

* Okt()  : Okt 객체 생성   ; Okt 분석기는 품사를 쉽게 읽을 수 있음. 

* pos("형태소분석할 문장", norm옵션, stem 옵션) : 형태소 분석 함수, 

각 품사를 형태소 단위로 나누고, 나눠진 각 형태소를  이의 품사와 함께 리스트로 저장한다. ('형태소/품사')

      norm옵션 : "그래욬ㅋㅋ?" => "그래요" 로 변환

      stem옵션  : "그렇다" 라는 원형을 찾아줌

 

단계3. 출력화면

 

 

 

 

03. 출현 빈도 분석

해당 글에서 중복되는 형태소의 개수를 출력해는 파이썬 코드 짜기

 

단계1.  분석할 파일 다운로드 하기

https://ithub.korean.go.kr/user/total/database/corpusManager.do 

토지 1 을 다운로드 함. 파일이름은 BEXX0003.txt임.

 

단계2.  소스코드

import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt

#utf -16 인코딩으로 파일을 열고 글자를 출력(#1)
fp= codecs.open("BEXX0003.txt","r",encoding="utf-16")
soup=BeautifulSoup(fp,"html.parser")
body=soup.select_one("body > text")
text=body.getText()  #text에는 내용들이 들어감


#텍스트를 한 줄씩 처리하기(#2)
okt=Okt()
word_dic= {}   # 형태소가 몇 개 있는지 카운트하는데 사용되는 딕셔너리
lines = text.split("\n") #라인단위로 구분하여 리스트로 저장됨

for line in lines: #한 줄씩 처리
    malist = okt.pos(line) # 형태소 분석한 것이 malist에 저장됨 ('형태소/품사'형태로 저장됨)
    
    for word in malist: #단어 하나씩 처리
        if word[1] =="Noun":   #명사확인하기(#3)  # [1]에는 품사가 있음,[0]에는 형태소가 들어있음
            if not (word[0] in word_dic):   #처음 등장하는 명사인 경우
                word_dic[word[0]] =0    
            word_dic[word[0]] +=1  #카운트하기


#많이 사용된 명사 출력하기(#4)
keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True) 
for word, count in keys[:50]:   
    print("{0}({1})".format(word,count),end="")
print()



okt=Okt()
word_dic= {}
lines = text.split("\n")
for line in lines:
    malist = okt.pos(line)
    for word in malist:
        if word[1] =="Noun":   #명사확인하기
            if not (word[0] in word_dic):
                word_dic[word[0]] =0
            word_dic[word[0]] +=1  #카운트하기

#많이 사용된 명사 출력하기
keys = sorted(word_dic.items(), key=lamda x:x[1], reverse=True) # word_dic의 value값(x[1])으로 정렬하는데 reverse하게 정렬한다.
for word, count in keys[:50]:
    print("{0}({1})".format(word,count),end="")
print()


 

파일을 읽어오기  ->  줄단위로 나누고, 워드단위로 나누어서 형태소 분석파일을 읽어오기  ->  줄단위로 나누고, 워드단위로 나누어서 형태소 분석->명사인 형태소들을 위주로 카운팅 해줌  -> (최종) 많이 사용된 명사 출력해주기

 

* codecs.open('파일경로','동작','인코딩설정') : 파이썬 기본라이브러리에 있는 모듈로, 파일을 조금씩 읽어온다.

* okt.pos() : pos 함수는 형태소 분석해주는 함수로, ('형태소/품사') 리스트 형식으로 저장한다. 

* select_one('검색') : '검색'에 해당하는 데이터 중 첫번째 데이터 하나만 저장하는 함수

* split('\n')  : 엔터를 구분자로 하여 문자열을 나누어 리스트로 저장함

* sort(정렬할데이터, key=비교함수, reverse=true) :  lambda를 비교함수로 하여  데이터를 정렬한다.   reverse가 true이므로 역으로 정렬

* word_dic.items() : 딕셔너리에서 key와 value 쌍을 튜플로 묶은 값을 돌려준다. 

 

 

lambda(람다)

lambda 인자 :  표현식

 

>>> (lambda x, y: x+y) (10,50)

60

>>> lambda x: x[1]

(인덱스 1인것을 출력)

 

 

단계3.  출력화면

이 글에서 '것'은 644개로, 가장 많이 포함된 명사이다.

 

 

 

 

 

 

 

위 글은 [(파이썬을 이용한)머신러닝, 딥러닝 실전 개발 입문] 을 읽고 정리한 글입니다.

Comments