카테고리 없음

[캡스톤디자인프로젝트A] 한글 자연어 처리 - konlpy의 형태소 분석기 활용하여 토큰화하기

이서경 2021. 11. 22. 09:43

 

konlpy 사용을 위해서는 Anaconda3, JDK, JPype 가 설치되어있어야 한다

요구되는 버전과 설치하면서 발생한 오류 및 해결방안은 하단에 적어두었다

 

 

 

 

프로젝트 주제를 간략히 말하자면 '문장 요약 문제, 어휘 문제를 통한 청소년의 문해력 및 어휘력 향상 웹서비스'

문제를 출제하기 위해서는 지문의 문장과 단어를 토큰화하는 자연어 처리 과정이 필수적이다.

파이썬으로 자연어 처리를 하는 경우 KSS로 문장 토큰화를 할 수 있으며 KoNLPy의 형태소 분석기를 사용할 수 있다.

KoNLPy에는 Okt(Open Korea Text), 꼬꼬마(Kkma), 한나눔(Hannanum), 코모란(Komoran), 메캅(Mecab)이 있으며

각 분석기로 같은 문장을 토큰화하고 결과를 비교해보고자 한다.

 

 

 

 

KoNLPy 설치

KoNLPy는 한국어 자연어 처리를 위한 형태소 분석기 패키지이다.

프롬프트에서 하단의 커맨드를 실행하여 설치 가능하다.

 

>pip install konlpy

 

 

 

JPype 설치

https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype

 

 

상단의 링크에서 자신의 윈도우, 파이썬 버전에 맞는 JPype 파일을 다운로드받는다.

ex) 윈도우 64비트, 파이썬 3.8 인 경우: JPype1-1.2.0-cp38-cp38-win_amd64.whl

 

 

프롬프트에서 해당 파일의 경로로 이동하여 아래와 같이 실행하면 설치 완료!

>pip install JPype1-1.2.0-cp38-cp38-win_amd64.whl

 

 

 

 

문장 토큰화

한국어 문장 토큰화를 위한 도구로는 KSS(Korean Sentence Splitter)가 있으며 하단의 커맨드로 설치 가능하다.

>pip install kss

 

 

KSS를 활용하여 아래와 같이 2009년 수능 언어영역 지문의 1-2문단 문장 토큰화를 진행해보았다.

 

 

 

import kss
text = '최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다. 창조 도시는 창조적 인재들이 창의성을 발휘할 수 있는 환경을 갖춘 도시이다. 즉 창조 도시는 인재들을 위한 문화 및 거주 환경의 창조성이 풍부하며, 혁신적이고도 유연한 경제 시스템을 구비하고 있는 도시인 것이다. 창조 도시의 주된 동력을 창조 산업으로 볼 것인가 창조 계층으로 볼 것인가에 대해서는 견해가 다소 엇갈리고 있다. 창조 산업을 중시하는 관점에서는, 창조 산업이 도시에 인적·사회적·문화적·경제적 다양성을 불어넣음으로써 도시의 재구조화를 가져오고 나아가 부가가치와 고용을 창출한다고 주장한다. 창의적 기술과 재능을 소득과 고용의 원천으로 삼는 창조 산업의 예로는 광고, 디자인, 출판, 공연 예술, 컴퓨터 게임 등이 있다.'
print(kss.split_sentences(text))
['최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다.', '창조 도시는 창조적 인재들이 창의성을 발휘할 수 있는 환경을 갖춘 도시이다.', '즉 창조 도시는 인재들을 위한 문화 및 거주 환경의 창조성이 풍부하며, 혁신적이고도 유연한 경제 시스템을 구비하고 있는 도시인 것이다.', '창조 도시의 주된 동력을 창조 산업으로 볼 것인가 창조 계층으로 볼 것인가에 대해서는 견해가 다소 엇갈리고 있다.', '창조 산업을 중시하는 관점에서는, 창조 산업이 도시에 인적·사회적·문화적·경제적 다양성을 불어넣음으로써 도시의 재구조화를 가져오고 나아가 부가가치와 고용을 창출한다고 주장한다.', '창의적 기술과 재능을 소득과 고용의 원천으로 삼는 창조 산업의 예로는 광고, 디자인, 출판, 공연 예술, 컴퓨터 게임 등이 있다.']

 

출력 결과, 6문장으로 잘 분리되었다!

 

 

 

 

 

 

 

단어 토큰화

한국어 NLP에서 형태소 분석기를 사용한다는 것은 단어 토큰화가 아니라 정확히는 형태소(morpheme) 단위로 형태소 토큰화(morpheme tokenization)를 수행하게 됨을 뜻한다.

한국어 자연어 처리를 위해서는 KoNLPy를 사용할 수 있다.

KoNLPy를 통해서 사용할 수 있는 형태소 분석기로 Okt(Open Korea Text), 꼬꼬마(Kkma), 한나눔(Hannanum), 코모란(Komoran), 메캅(Mecab)이 있다.

 

 

 

 

 

공통적으로 활용할 메소드 종류

1) morphs : 형태소 추출

2) pos : 품사 태깅(Part-of-speech tagging)

3) nouns : 명사 추출

 

 

 

 

 

최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다. 

라는 문장으로 형태소 추출, 품사 태깅, 명사 추출을 진행하였다.

 

 

 

1. Okt(Open Korea Text)

 

형태소 추출

from konlpy.tag import Okt 
okt = Okt() 
print(okt.morphs("최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다. "))
['최근', '들어', '도시', '의', '경쟁력', '향상', '을', '위', '한', '새로운', '전략', '의', '하나로', '창조', '도시', '에', '대한', '논의', '가', '활발하게', '진행', '되고', '있다', '.']

 

 

품사 태깅

[('최근', 'Noun'), ('들어', 'Verb'), ('도시', 'Noun'), ('의', 'Josa'), ('경쟁력', 'Noun'), ('향상', 'Noun'), ('을', 'Josa'), ('위', 'Noun'), ('한', 'Josa'), ('새로운', 'Adjective'), ('전략', 'Noun'), ('의', 'Josa'), ('하나로', 'Noun'), ('창조', 'Noun'), ('도시', 'Noun'), ('에', 'Josa'), ('대한', 'Noun'), ('논의', 'Noun'), ('가', 'Josa'), ('활발하게', 'Adjective'), ('진행', 'Noun'), ('되고', 'Verb'), ('있다', 'Adjective'), ('.', 'Punctuation')]

 

 

명사 추출

['최근', '도시', '경쟁력', '향상', '위', '전략', '하나로', '창조', '도시', '대한', '논의', '진행']

 

 

 

 

 

 

2. 꼬꼬마(Kkma) 서울대학교 IDS(intelligent Data Systems) 연구실에서 개발

 

형태소 추출

from konlpy.tag import Kkma
kkma = Kkma()
print(kkma.morphs(u'최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다. '))
['최근', '듣', '어', '도시', '의', '경쟁력', '향상', '을', '위하', 'ㄴ', '새', '롭', 'ㄴ', '전략', '의', '하나', '로', '창조', '도시', '에', '대하', 'ㄴ', '논의', '가', '활발', '하', '게', '진행', '되', '고', '있', '다', '.']

 

 

품사 태깅

[('최근', 'NNG'), ('듣', 'VV'), ('어', 'ECD'), ('도시', 'NNG'), ('의', 'JKG'), ('경쟁력', 'NNG'), ('향상', 'NNG'), ('을', 'JKO'), ('위하', 'VV'), ('ㄴ', 'ETD'), ('새', 'NNG'), ('롭', 'XSA'), ('ㄴ', 'ETD'), ('전략', 'NNG'), ('의', 'JKG'), ('하나', 'NNG'), ('로', 'JKM'), ('창조', 'NNG'), ('도시', 'NNG'), ('에', 'JKM'), ('대하', 'VV'), ('ㄴ', 'ETD'), ('논의', 'NNG'), ('가', 'JKS'), ('활발', 'XR'), ('하', 'XSA'), ('게', 'ECD'), ('진행', 'NNG'), ('되', 'XSV'), ('고', 'ECE'), ('있', 'VXV'), ('다', 'EFN'), ('.', 'SF')]

 

 

명사 추출

['최근', '도시', '경쟁력', '향상', '새', '전략', '하나', '창조', '논의', '진행']

 

 

 

 

3. 한나눔(Hannanum) KAIST SWRC(Semantic Web Research Center)에서 개발

 

형태소 추출

from konlpy.tag import Hannanum
hannanum = Hannanum()
print(hannanum.morphs(u'최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다. '))
['최근', '들', '어', '도시', '의', '경쟁력', '향상', '을', '위하', 'ㄴ', '새롭', '은', '전략', '의', '하나', '로', '창조', '도시', '에', '대하', 'ㄴ', '논의', '가', '활발', '하', '게', '진행', '되', '고', '있', '다', '.']

 

 

품사 태깅

[('최근', 'M'), ('들', 'P'), ('어', 'E'), ('도시', 'N'), ('의', 'J'), ('경쟁력', 'N'), ('향상', 'N'), ('을', 'J'), ('위하', 'P'), ('ㄴ', 'E'), ('새롭', 'P'), ('은', 'E'), ('전략', 'N'), ('의', 'J'), ('하나', 'N'), ('로', 'J'), ('창조', 'N'), ('도시', 'N'), ('에', 'J'), ('대하', 'P'), ('ㄴ', 'E'), ('논의', 'N'), ('가', 'J'), ('활발', 'N'), ('하', 'X'), ('게', 'E'), ('진행', 'N'), ('되', 'X'), ('고', 'E'), ('있', 'P'), ('다', 'E'), ('.', 'S')]

 

명사 추출

['도시', '경쟁력', '향상', '전략', '하나', '창조', '도시', '논의', '활발', '진행']

 

 

4. 코모란(Komoran) Shineware에서 개발

 

형태소 추출

from konlpy.tag import Komoran
komoran = Komoran()
print(komoran.morphs(u'최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다. '))
['최근', '들', '어', '도시', '의', '경쟁력', '향상', '을', '위하', 'ㄴ', '새롭', 'ㄴ', '전략', '의', '하나로', '창조', '도시', '에', '대하', 'ㄴ', '논의', '가', '활발', '하', '게', '진행', '되', '고', '있', '다', '.']

 

 

품사 태깅

[('최근', 'NNG'), ('들', 'VV'), ('어', 'EC'), ('도시', 'NNG'), ('의', 'JKG'), ('경쟁력', 'NNG'), ('향상', 'NNG'), ('을', 'JKO'), ('위하', 'VV'), ('ㄴ', 'ETM'), ('새롭', 'VA'), ('ㄴ', 'ETM'), ('전략', 'NNG'), ('의', 'JKG'), ('하나로', 'NNP'), ('창조', 'NNG'), ('도시', 'NNG'), ('에', 'JKB'), ('대하', 'VV'), ('ㄴ', 'ETM'), ('논의', 'NNG'), ('가', 'JKS'), ('활발', 'XR'), ('하', 'XSA'), ('게', 'EC'), ('진행', 'NNG'), ('되', 'XSV'), ('고', 'EC'), ('있', 'VX'), ('다', 'EF'), ('.', 'SF')]

 

 

명사 추출

['최근', '도시', '경쟁력', '향상', '전략', '하나로', '창조', '도시', '논의', '진행']

 

 

5. 메캅(Mecab) 일본어용 형태소 분석기를 한국어 사용 가능하도록 수정한 것

Windowp에서 설치가 복잡하며 Window7은 지원하지 않음(https://github.com/koshort/pyeunjeon에서 사용가능)

 

형태소 추출

from eunjeon import Mecab
mecab=Mecab()
print(mecab.morphs(u'최근 들어 도시의 경쟁력 향상을 위한 새로운 전략의 하나로 창조 도시에 대한 논의가 활발하게 진행되고 있다. '))
['최근', '들', '어', '도시', '의', '경쟁력', '향상', '을', '위한', '새로운', '전략', '의', '하나', '로', '창조', '도시', '에', '대한', '논의', '가', '활발', '하', '게', '진행', '되', '고', '있', '다', '.']

 

품사 태깅

[('최근', 'NNG'), ('들', 'XSN'), ('어', 'IC'), ('도시', 'NNG'), ('의', 'JKG'), ('경쟁력', 'NNG'), ('향상', 'NNG'), ('을', 'JKO'), ('위한', 'VV+ETM'), ('새로운', 'VA+ETM'), ('전략', 'NNG'), ('의', 'JKG'), ('하나', 'NR'), ('로', 'JKB'), ('창조', 'NNG'), ('도시', 'NNG'), ('에', 'JKB'), ('대한', 'VV+ETM'), ('논의', 'NNG'), ('가', 'JKS'), ('활발', 'XR'), ('하', 'XSA'), ('게', 'EC'), ('진행', 'NNG'), ('되', 'XSV'), ('고', 'EC'), ('있', 'VX'), ('다', 'EF'), ('.', 'SF')]

 

 

명사 추출

['최근', '도시', '경쟁력', '향상', '전략', '하나', '창조', '도시', '논의', '진행']

 

명사 추출 비교 결과

  최근 도시 경쟁력 향상 전략 하나 창조 도시 논의
Okt O O O O O X O O O
꼬꼬마 O O O O O O O X O
한나눔 X O O O O O O O O
Komoran O O O O O X O O O
Mecab O O O O O O O O O

 

-      공통 오류: '진행되고' '진행'을 명사로 추출

-      Okt : ‘위한’, ‘하나로’ (조사를 포함하여 명사로 추출), ‘도시에 대한대한

-      꼬꼬마: ‘새로운

-      한나눔: ‘활발하게활발

-      코모란: ‘하나로’ (조사를 포함하여 명사로 추출)

 

**진행하면서 있었던 오류와 해결방안

 

1. JPype 버전 오류

konlpy를 import하여 Okt를 실행하려하니 발생한 오류.

SystemError: java.nio.file.InvalidPathException: Illegal char <*> at index 43

 

서치해보니 JPype 버전과 파이썬의 버전이 맞지 않아 생기는 오류라고 했고

기존에 설치되어있던 파이썬 3.9, 윈도우 64비트에 맞는 올바른 버전을 다운받아 설치했으나 오류는 해결되지 않았다.

 

 

파이썬이 3.8 버전이어야 한다는 글을 보고 재설치하여 실행해보았으나 여전히 해결되지 않았다.

 

결국 anaconda, JDK, JPype 다 지우고 아래의 버전으로 재설치했더니 해결되었다.

 

anaconda3 (Python 3.8) Anaconda3-2020.07-Windows-x86_64.exe (Index of / (anaconda.com))

JDK 16.0.1 (Java Archive Downloads - Java SE 16 (oracle.com))

JPype 1.2.0 cp38 (Releases · jpype-project/jpype · GitHub)

 

 

2. Tweepy 버전 오류

AttributeError: module 'tweepy' has no attribute 'StreamListener'

anaconda prompt에서

>pip list

실행하면 tweepy 버전을 확인할 수 있다. 보통 4.x.x로 되어있는 것 같다.

>pip install tweepy==3.10.0

실행하여 버전을 바꾸어 설치해주면 오류가 해결된다.

 

 

3. 시스템 환경변수 오류

JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly.

시스템 환경변수를 재설정하면 해결된다고 해서 아래와 같이 진행했다.

오른쪽 하단의 환경변수 선택

 

JAVA_HOME이 없는 경우 새로 만들기

JAVA_HOME이 이미 있는 경우에는 선택 후 편집 버튼을 누른다.

변수이름은 JAVA_HOME, 변수 값에는 jvm.dll이 있는 폴더 위치를 넣어준다.

설치 시 따로 지정을 하지 않았다면 보통 C:\Program Files\Java\jdk-16.0.1\bin\server 의 형태이다.

 

이 과정을 완료한 후 다시 실행해보았지만 여전히 같은 오류가 발생했고 eclipse를 지웠더니 해결되었다.