KoNLPy

3 minute read

KoNLPy

NLP (Natural Language Processing, 자연어처리)텍스트에서 의미있는 정보를 분석, 추출하고 이해하는 일련의 기술집합입니다.
KoNLPy는 여러분이 한국어 텍스트를 이용하여 기초적인 NLP 작업을 수행하는데 도움을 드릴 것입니다.

형태소 분석 및 품사 태깅

형태소 분석 이란 형태소를 비롯하여, 어근, 접두사/접미사, 품사(POS, part-of-speech) 등 다양한 언어적 속성의 구조를 파악하는 것입니다.
품사 태깅 은 형태소의 뜻과 문맥을 고려하여 그것에 마크업을 하는 일입니다.
다음은 형태소 분석 중에서 Kkma를 사용했을 경우이다.

1
2
3
4
kkma = Kkma()
pprint(kkma.sentences("여러분, 안녕! 반갑습니다.")) 
print(kkma.nouns("여러분, 안녕! 반갑습니다."))
print(kkma.pos("여러분, 안녕! 반갑습니다."))


['여러분, 안녕! 반갑습니다.']
['여러분', '안녕']
[('여러분', 'NP'), (',', 'SP'), ('안녕', 'NNG'), ('!', 'SF'), ('반갑', 'VV'), ('습니다', 'EFN'), ('.', 'SF')]


KoNLPy에는 Kkma외에 Okt, Komoran, Hannanum등이 존재 한다.
아래는 Okt를 사용했을 경우의 예시이다.

1
2
3
4
from konlpy.tag import Okt
okt = Okt()
print(okt.nouns("여러분, 안녕! 반갑습니다."))
print(okt.pos("여러분, 안녕! 반갑습니다."))


['여러분', '안녕']
[('여러분', 'Noun'), (',', 'Punctuation'), ('안녕', 'Noun'), ('!', 'Punctuation'), ('반갑습니다', 'Adjective'), ('.', 'Punctuation')]


형태소 분석에서 형태소만을 추출하는 함수가 있다.

  1. nouns(): 명사만을 추출하는 함수
  2. morphs(): 모든 품사를 추출하는 함수
  3. pos(): 단어 하나하나 품사를 명시해주는 함수


1
2
3
4
5
6
7
twitter = Okt()
wordlist = twitter.nouns("멋진 봄은 엄청 무더운 여름과 한들한들 시원한 바람이 부는 가을의 중간 계절이다")
print(wordlist)
wordlist2 = twitter.morphs("멋진 봄은 엄청 무더운 여름과 한들한들 시원한 바람이 부는 가을의 중간 계절이다")
print(wordlist2)
wordlist3 = twitter.pos("멋진 봄은 엄청 무더운 여름과 한들한들 시원한 바람이 부는 가을의 중간 계절이다")
print(wordlist3)


['봄', '여름', '바람', '가을', '중간', '계절']
['멋진', '봄', '은', '엄청', '무더운', '여름', '과', '한들한들', '시원한', '바람', '이', '부는', '가을', '의', '중간', '계절', '이다']
[('멋진', 'Adjective'), ('봄', 'Noun'), ('은', 'Josa'), ('엄청', 'Adverb'), ('무더운', 'Adjective'), ('여름', 'Noun'), ('과', 'Josa'), ('한들한들', 'Adverb'), ('시원한', 'Adjective'), ('바람', 'Noun'), ('이', 'Josa'), ('부는', 'Verb'), ('가을', 'Noun'), ('의', 'Josa'), ('중간', 'Noun'), ('계절', 'Noun'), ('이다', 'Josa')]


다음 예제는 웹스크래핑 후 형태소를 분석하는 예제이다.
웹스크래핑을한 URL:위키백과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import urllib.request
from bs4 import BeautifulSoup
from konlpy.tag import *
from urllib import parse

kkma = Kkma()
twitter = Okt()
hana = Hannanum()

sdata = parse.quote("이순신")
url = "https://ko.wikipedia.org/wiki/" + sdata
page = urllib.request.urlopen(url)
soup = BeautifulSoup(page.read(), "html.parser")
#print(soup)

wordlist = []

for item in soup.select("#mw-content-text > div > p"):
    if item.string != None:
        print(item.string)
        ss = item.string
        wordlist +=twitter.nouns(ss)
        
print(wordlist)        
print("단어 수: "+str(len(wordlist)))


당시 조산만호 이순신은 북방 여진족의 약탈 및 침략을 예상하고 수비를 강화하기 위하여 여러차례 북병사

....

'이순신', '대한', '평가', '이순신', '일기', '시조', '한시', '등', '여러', '편의', '작품']
단어 수: 253


위의 결과의 단어 발생 횟수를 확인하는 예제이다.

1
2
3
4
5
6
7
8
word_dict = {}
for i in wordlist:
    if i in word_dict:
        word_dict[i] += 1
    else: 
        word_dict[i] = 1
        
print(word_dict)


{'당시': 3, '조산': 1, '만호': 1, '이순신': 16, '북방': 1, '여진족': 1, '약탈': 1, '및': 2, '침략': 1, '예상': 1, '수비': 1, '위': 1, '차례': 1, '북': 

...

'완전무결': 1, '성자': 1, '영웅': 1, '천관우': 1, '등': 2, '일기': 1, '시조': 1, '한시': 1, '여러': 1, '편의': 1, '작품': 1}


중복 단어를 제거하는 코드이다.

1
2
setdata = set(wordlist)    
print("발견 된 명사의 갯수(중복제거): " + str(len(setdata)))


발견 된 명사의 갯수(중복제거): 180


위의 결과를 DataFrame으로서 바꾸는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
print("DataFrame으로 읽어들이기")
from pandas import Series, DataFrame
li_data = Series(wordlist)
print(li_data)
seri_data = Series(word_dict)
print(seri_data)
print(seri_data.value_counts()[:5])

print()
df = DataFrame(wordlist)
print(type(df))


 DataFrame으로 읽어들이기
0       당시
1       조산
2       만호
3      이순신
4       북방
      ... 
248     한시
249      등
250     여러
251     편의
252     작품
Length: 253, dtype: object
당시      3
조산      1
만호      1
이순신    16
북방      1
       ..
시조      1
한시      1
여러      1
편의      1
작품      1
Length: 180, dtype: int64
1    143
2     25
3      6
6      2
5      2
dtype: int64

<class 'pandas.core.frame.DataFrame'>


위의 결과를 Plot을 활용하여 시각화하여 보여주는 예제이다.

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
plt.rc("font", family="malgun gothic") #한글깨짐 방지
plt.plot(seri_data.value_counts()[:5])
plt.xlabel("횟수 종류")
plt.ylabel("종류별 발생 수")
plt.title("단어 건수")
plt.legend("횟수")
plt.show() #최종적으로 plot을 보이게 하는 명령



참조: 원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Categories:

Updated:

Leave a comment