4 분 소요

# 형태소 분석(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)
['아버지', '가방']

태그:

카테고리:

업데이트:

댓글남기기