15_KoLNPy
# 형태소 분석(morphological_Analysis)은 자연 언어의 문장을 형태소라는 최소 단위로 분할하고 품사를 판별하는 작업이다.
# 영어 형태소 분석은 형태소 마다 띄어쓰기를 해서 문장을 구성하는 것이 기본이기 때문에 크게 어렵지 않으나 아시아 계열의 언어
# 분석에는 나름의 노력이 필요하다.
# 대표적으로 문법 규칙에 의한 방법과 확률적 언어 모델을 사용하는 방법이 있는데 최근에는 확률적 언어 모델을 사용한 형태소
# 분석이 많아서 정밀도가 높아졌다. 어쨌거나 두 가지 모두 품사 사전과 문법 사전을 기반으로 대조하면서 형태소를 분석한다.
# https://datascienceschool.net/intro.html => 머신러닝 편 => KoNLPy 한국어 처리 패키지 => JAVA 1.7이상 버전이 미리 설치되어
# 있어야 한다.
# 한국어 형태소 분석 라이브러리 => KoNLPy => pip install konlpy
# KoNLPy에서는 대한민국 헌법 말뭉치인 kolaw와 국회법안 말뭉치인 kobill을 제공한다. 각 말뭉치가 포함하는 파일의 이름은 fields
# 메서드로 알 수 있고 open 메서드로 해당 파일의 텍스트를 읽어들인다.
from konlpy.corpus import kolaw
kolaw.fileids()
['constitution.txt']
c = kolaw.open('constitution.txt').read()
print(c[:40])
대한민국헌법
유구한 역사와 전통에 빛나는 우리 대한국민은 3·1운동으로
from konlpy.corpus import kobill
kobill.fileids()
['1809890.txt',
'1809891.txt',
'1809892.txt',
'1809893.txt',
'1809894.txt',
'1809895.txt',
'1809896.txt',
'1809897.txt',
'1809898.txt',
'1809899.txt']
d = kobill.open('1809890.txt').read()
print(d[:40])
지방공무원법 일부개정법률안
(정의화의원 대표발의 )
의 안
번 호
# 형태소 분석
# KoNLPy는 다음과 같은 다양한 형태소 분석, 태깅 라이브러리를 파이썬에서 쉽게 사용할 수 있도록 모아놓았다.
# Hannanum: 한나눔. KAIST Semantic Web Research Center 개발.
# http://semanticweb.kaist.ac.kr/hannanum/
# Kkma: 꼬꼬마. 서울대학교 IDS(Intelligent Data Systems) 연구실 개발.
# http://kkma.snu.ac.kr/
# Komoran: 코모란. Shineware에서 개발.
# https://github.com/shin285/KOMORAN
# Mecab: 메카브. 일본어용 형태소 분석기를 한국어를 사용할 수 있도록 수정.
# https://bitbucket.org/eunjeon/mecab-ko
# Open Korean Text: 오픈 소스 한국어 분석기. 과거 트위터 형태소 분석기.
# https://github.com/open-korean-text/open-korean-text
# 다운그레이드: pip install "jpype1<1"
# 윈도우에서 하는 경우 pip install konlpy 바로하지 마시고
# 1. java_home 환경변수 설정하고
# 2. JPype 검색해서 파이썬버전과 윈도우 32/64bit 에 맞는 버전 설치
# 3. pip install konlpy
# https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 접속 버전에 맞는 JPype 다운로드
# JPype1-1.2.0-cp36-cp36m-win_amd64.whl 파일이 위치한 폴더에서 cmd 창을 띄우고 아래의 문장을 실행한다.
# python -m pip install --user JPype1-1.2.0-cp36-cp36m-win_amd64.whl
from konlpy.tag import *
hannanum = Hannanum()
kkma = Kkma()
komoran = Komoran()
# mecab = Mecab() # 윈도우에서 지원하지 않는다.
okt = Okt()
# 이 클래스들은 다음과 같은 메서드를 공통적으로 제공한다.
# nouns : 명사 추출
# morphs : 형태소 추출
# pos : 품사 부착
# 명사 추출 : 문자열에서 명사만 추출하려면 noun 명령을 사용한다.
hannanum.nouns(c[:40])
['대한민국헌법', '유구', '역사', '전통', '빛', '우리', '대한국민', '3·1운동']
kkma.nouns(c[:40])
['대한',
'대한민국',
'대한민국헌법',
'민국',
'헌법',
'유구',
'역사',
'전통',
'우리',
'국민',
'3',
'1',
'1운동',
'운동']
# komoran은 빈줄이 있으면 에러가 남
komoran.nouns("\n".join([s for s in c[:40].split("\n") if s]))
['대한민국', '헌법', '역사', '전통', '국민', '운동']
okt.nouns(c[:40])
['대한민국', '헌법', '유구', '역사', '전통', '우리', '국민', '운동']
# 형태소 추출 : 명사 뿐 아니라 모든 품사의 형태소를 알아내려면 morphs라는 명령을 사용한다.
hannanum.morphs(c[:40])
['대한민국헌법',
'유구',
'하',
'ㄴ',
'역사',
'와',
'전통',
'에',
'빛',
'나는',
'우리',
'대한국민',
'은',
'3·1운동',
'으로']
kkma.morphs(c[:40])
['대한민국',
'헌법',
'유구',
'하',
'ㄴ',
'역사',
'와',
'전통',
'에',
'빛나',
'는',
'우리',
'대하',
'ㄴ',
'국민',
'은',
'3',
'·',
'1',
'운동',
'으로']
# komoran은 빈줄이 있으면 에러가 남
komoran.morphs("\n".join([s for s in c[:40].split("\n") if s]))
['대한민국',
'헌법',
'유구',
'하',
'ㄴ',
'역사',
'와',
'전통',
'에',
'빛나',
'는',
'우리',
'대하',
'ㄴ',
'국민',
'은',
'3',
'·',
'1',
'운동',
'으로']
okt.morphs(c[:40])
['대한민국',
'헌법',
'\n\n',
'유구',
'한',
'역사',
'와',
'전통',
'에',
'빛나는',
'우리',
'대',
'한',
'국민',
'은',
'3',
'·',
'1',
'운동',
'으로']
# 품사 부착 : pos 명령을 사용하면 품사 부착을 한다.
# 한국어 품사 태그 세트로는 “21세기 세종계획 품사 태그세트”를 비롯하여 다양한 품사 태그 세트가 있다.
# 형태소 분석기마다 사용하는 품사 태그가 다르므로 각 형태소 분석기에 대한 문서를 참조한다.
hannanum.pos(c[:40])
[('대한민국헌법', 'N'),
('유구', 'N'),
('하', 'X'),
('ㄴ', 'E'),
('역사', 'N'),
('와', 'J'),
('전통', 'N'),
('에', 'J'),
('빛', 'N'),
('나는', 'J'),
('우리', 'N'),
('대한국민', 'N'),
('은', 'J'),
('3·1운동', 'N'),
('으로', 'J')]
kkma.pos(c[:40])
[('대한민국', 'NNG'),
('헌법', 'NNG'),
('유구', 'NNG'),
('하', 'XSV'),
('ㄴ', 'ETD'),
('역사', 'NNG'),
('와', 'JC'),
('전통', 'NNG'),
('에', 'JKM'),
('빛나', 'VV'),
('는', 'ETD'),
('우리', 'NNM'),
('대하', 'VV'),
('ㄴ', 'ETD'),
('국민', 'NNG'),
('은', 'JX'),
('3', 'NR'),
('·', 'SP'),
('1', 'NR'),
('운동', 'NNG'),
('으로', 'JKM')]
# komoran은 빈줄이 있으면 에러가 남
komoran.pos("\n".join([s for s in c[:40].split("\n") if s]))
[('대한민국', 'NNP'),
('헌법', 'NNP'),
('유구', 'XR'),
('하', 'XSA'),
('ㄴ', 'ETM'),
('역사', 'NNG'),
('와', 'JC'),
('전통', 'NNG'),
('에', 'JKB'),
('빛나', 'VV'),
('는', 'ETM'),
('우리', 'NP'),
('대하', 'VV'),
('ㄴ', 'ETM'),
('국민', 'NNP'),
('은', 'JX'),
('3', 'SN'),
('·', 'SP'),
('1', 'SN'),
('운동', 'NNP'),
('으로', 'JKB')]
okt.pos(c[:40])
[('대한민국', 'Noun'),
('헌법', 'Noun'),
('\n\n', 'Foreign'),
('유구', 'Noun'),
('한', 'Josa'),
('역사', 'Noun'),
('와', 'Josa'),
('전통', 'Noun'),
('에', 'Josa'),
('빛나는', 'Verb'),
('우리', 'Noun'),
('대', 'Modifier'),
('한', 'Modifier'),
('국민', 'Noun'),
('은', 'Josa'),
('3', 'Number'),
('·', 'Punctuation'),
('1', 'Number'),
('운동', 'Noun'),
('으로', 'Josa')]
# 부착되는 품사 태그의 기호와 의미는 tagset 속성으로 확인할 수 있다.
okt.tagset
{'Adjective': '형용사',
'Adverb': '부사',
'Alpha': '알파벳',
'Conjunction': '접속사',
'Determiner': '관형사',
'Eomi': '어미',
'Exclamation': '감탄사',
'Foreign': '외국어, 한자 및 기타기호',
'Hashtag': '트위터 해쉬태그',
'Josa': '조사',
'KoreanParticle': '(ex: ㅋㅋ)',
'Noun': '명사',
'Number': '숫자',
'PreEomi': '선어말어미',
'Punctuation': '구두점',
'ScreenName': '트위터 아이디',
'Suffix': '접미사',
'Unknown': '미등록어',
'Verb': '동사'}
from konlpy.tag import Okt
okt = Okt()
txt = '아버지가방에들어가신다.'
okt.pos(txt)
[('아버지', 'Noun'),
('가방', 'Noun'),
('에', 'Josa'),
('들어가신다', 'Verb'),
('.', 'Punctuation')]
okt.pos("이것도 되나욬ㅋㅋㅋㅋ")
[('이', 'Determiner'),
('것', 'Noun'),
('도', 'Josa'),
('되나욬', 'Noun'),
('ㅋㅋㅋㅋ', 'KoreanParticle')]
# norm = True : 품사 태깅(기본값 False)
okt.pos("이것도 되나욬ㅋㅋㅋㅋ", norm = True)
[('이', 'Determiner'),
('것', 'Noun'),
('도', 'Josa'),
('되나요', 'Verb'),
('ㅋㅋㅋ', 'KoreanParticle')]
# stem=True : 원형 글자로 바꿔준다.(기본값 False)
okt.pos("이것도 되나욬ㅋㅋㅋㅋ", norm = True, stem = True)
[('이', 'Determiner'),
('것', 'Noun'),
('도', 'Josa'),
('되다', 'Verb'),
('ㅋㅋㅋ', 'KoreanParticle')]
# 텍스트를 형태소 단위로 나눈다.
okt.morphs(txt)
['아버지', '가방', '에', '들어가신다', '.']
# 텍스트에서 명사만 추출한다.
okt.nouns(txt)
['아버지', '가방']
댓글남기기