1. 형태소 분석이란?
더 이상 분해될 수 없는 최소한의 의미 단위인 형태소를 자연어의 제약 조건과 문법 규칙에 맞춰 분석하는 것
형태소 분석 절차
1) 단어에서 최소 의미를 포함하는 형태소 후보로 분리
한국어는 = "한국어" + "는"
2) 형태론적 변형이 일어난 형태소의 원형 복원
3) 단어와 사전들 사이의 결합 조건에 따라 옳은 분석 후보를 선택
2. 한국어 형태소 분석
한국어 형태소 분석기의 오픈 라이브러리
- KoNLPy
- 한나눔(Hannanum)
- 코모란(Komoran)
- 꼬꼬마(Kkma)
각 라이브러리를 이용해서 형태소 분석을 해보겠습니다.
어떤 차이가 있는지 보시죠~~~~

1) 필요한 라이브러리 import
from konlpy.tag import Okt
from konlpy.tag import Kkma # 문자 분리 가능
from konlpy.tag import Hannanum
from konlpy.tag import Komoran
from konlpy.tag import Twitter
2) 라이브러리 별 객체 생성
kkma = Kkma()
okt = Okt()
komoran = Komoran()
hannanum = Hannanum()
twitter = Twitter()
3) 문장 set
sentence = u'감정노동자 보호법은 사업주로 하여금 감정노동으로부터 근로자를 보호하는 예방 조치를 이행하도록 강제한다.\
다만 현장 근로자들을 중심으론 이 같은 법안이 현장에 제대로 적용되기 위해서는 회사의 수직적 위계 구조와 인력 부족 문제 등\
구조적 문제가 우선 해결돼야 한다는 지적도 나온다.'
4) 형태소 분석 및 결과
라이브러리별로 조금씩 차이가 있음을 알 수 있습니다.
morphs 함수를 이용해서 간단하게 형태소를 분석 할 수 있습니다.
print("okt 형태소 분석 : ", okt.morphs(sentence))
okt 형태소 분석 : ['감정노동자', '보호', '법', '은', '사업', '주로', '하여금', '감정노동', '으로부터', '근로자', '를', '보호', '하는', '예방', '조치', '를', '이행', '하도록', '강제', '한다', '.', '다만', '현장', '근로자', '들', '을', '중심', '으론', '이', '같은', '법안', '이', '현장', '에', '제대로', '적용', '되기', '위', '해서는', '회사', '의', '수직', '적', '위계', '구조', '와', '인력', '부족', '문제', '등', '구조', '적', '문제', '가', '우선', '해결', '돼야', '한다는', '지적도', '나온다', '.']
print("kkma 형태소 분석 : ", kkma.morphs(sentence))
kkma 형태소 분석 : ['감정', '노동자', '보호법', '은', '사업주', '로', '하여금', '감정', '노동', '으로', '부터', '근로자', '를', '보호', '하', '는', '예방', '조치', '를', '이행', '하', '도록', '강제', '하', 'ㄴ다', '.', '다만', '현장', '근로자', '들', '을', '중심', '으로', 'ㄴ', '이', '같', '은', '법안', '이', '현장', '에', '제대', '로', '적용', '되', '기', '위하', '어서', '는', '회사', '의', '수직적', '위계', '구조', '와', '인력', '부족', '문제', '등', '구조적', '문제', '가', '우선', '해결', '되', '어야', '하', 'ㄴ다는', '지적도', '나오', 'ㄴ다', '.']
print("hannanum 형태소 분석 :",hannanum.morphs(sentence))
hannanum 형태소 분석 : ['감정노동자', '보호법', '은', '사업주', '로', '하여금', '감정노동', '으로부터', '근로자', '를', '보호', '하', '는', '예방', '조치', '를', '이행', '하', '도록', '강제', '하', 'ㄴ다', '.', '다만', '현장', '근로자들', '을', '중심', '으론', '이', '같', '은', '법안', '이', '현장', '에', '제대로', '적용', '되', '기', '위하', '어서', '는', '회사', '의', '수직적', '위계', '구조', '와', '인력', '부족', '문제', '등구조적', '문제', '가', '우선', '해결', '되', '어야', '하', 'ㄴ다는', '지적', '도', '나', '아', '오', 'ㄴ다', '.']
print("komoran 형태소 분석:", komoran.morphs(sentence))
komoran 형태소 분석: ['감정', '노동자', '보호', '법', '은', '사업주', '로', '하여금', '감정노동', '으로부터', '근로자', '를', '보호', '하', '는', '예방', '조치', '를', '이행', '하', '도록', '강제', '하', 'ㄴ다', '.', '다만', '현장', '근로자', '들', '을', '중심', '으로', 'ㄴ', '이', '같', '은', '법안', '이', '현장', '에', '제대로', '적용', '되', '기', '위하', '아서', '는', '회사', '의', '수직', '적', '위계', '구조', '와', '인력', '부족', '문제', '등', '구조', '적', '문제', '가', '우선', '해결', '되', '어야', '하', 'ㄴ다는', '지적', '도', '나오', 'ㄴ다', '.']
print("twitter 형태소 분석 :", twitter.morphs(sentence))
twitter 형태소 분석 : ['감정노동자', '보호', '법', '은', '사업', '주로', '하여금', '감정노동', '으로부터', '근로자', '를', '보호', '하는', '예방', '조치', '를', '이행', '하도록', '강제', '한다', '.', '다만', '현장', '근로자', '들', '을', '중심', '으론', '이', '같은', '법안', '이', '현장', '에', '제대로', '적용', '되기', '위', '해서는', '회사', '의', '수직', '적', '위계', '구조', '와', '인력', '부족', '문제', '등', '구조', '적', '문제', '가', '우선', '해결', '돼야', '한다는', '지적도', '나온다', '.']
3. 품사 태깅
품사 태깅이란 같은 단어에 대해 의미가 다를 경우(중의성)을 해결하기 위해 부가적인 언어 정보를 부착한 것
품사를 분리할때는 pos 함수를 사용합니다.
print("okt 품사 태깅", okt.pos(sentence))
okt 품사 태깅 [('감정노동자', 'Noun'), ('보호', 'Noun'), ('법', 'Noun'), ('은', 'Josa'), ('사업', 'Noun'), ('주로', 'Noun'), ('하여금', 'Adverb'), ('감정노동', 'Noun'), ('으로부터', 'Josa'), ('근로자', 'Noun'), ('를', 'Josa'), ('보호', 'Noun'), ('하는', 'Verb'), ('예방', 'Noun'), ('조치', 'Noun'), ('를', 'Josa'), ('이행', 'Noun'), ('하도록', 'Verb'), ('강제', 'Noun'), ('한다', 'Verb'), ('.', 'Punctuation'), ('다만', 'Noun'), ('현장', 'Noun'), ('근로자', 'Noun'), ('들', 'Suffix'), ('을', 'Josa'), ('중심', 'Noun'), ('으론', 'Josa'), ('이', 'Noun'), ('같은', 'Adjective'), ('법안', 'Noun'), ('이', 'Josa'), ('현장', 'Noun'), ('에', 'Josa'), ('제대로', 'Noun'), ('적용', 'Noun'), ('되기', 'Verb'), ('위', 'Noun'), ('해서는', 'Verb'), ('회사', 'Noun'), ('의', 'Josa'), ('수직', 'Noun'), ('적', 'Suffix'), ('위계', 'Noun'), ('구조', 'Noun'), ('와', 'Josa'), ('인력', 'Noun'), ('부족', 'Noun'), ('문제', 'Noun'), ('등', 'Noun'), ('구조', 'Noun'), ('적', 'Suffix'), ('문제', 'Noun'), ('가', 'Josa'), ('우선', 'Noun'), ('해결', 'Noun'), ('돼야', 'Verb'), ('한다는', 'Modifier'), ('지적도', 'Noun'), ('나온다', 'Verb'), ('.', 'Punctuation')]
print("kkma 품사 태깅:" , kkma.pos(sentence))
kkma 품사 태깅: [('감정', 'NNG'), ('노동자', 'NNG'), ('보호법', 'NNG'), ('은', 'JX'), ('사업주', 'NNG'), ('로', 'JKM'), ('하여금', 'MAG'), ('감정', 'NNG'), ('노동', 'NNG'), ('으로', 'JKM'), ('부터', 'JX'), ('근로자', 'NNG'), ('를', 'JKO'), ('보호', 'NNG'), ('하', 'XSV'), ('는', 'ETD'), ('예방', 'NNG'), ('조치', 'NNG'), ('를', 'JKO'), ('이행', 'NNG'), ('하', 'XSV'), ('도록', 'ECD'), ('강제', 'NNG'), ('하', 'XSV'), ('ㄴ다', 'EFN'), ('.', 'SF'), ('다만', 'MAG'), ('현장', 'NNG'), ('근로자', 'NNG'), ('들', 'XSN'), ('을', 'JKO'), ('중심', 'NNG'), ('으로', 'JKM'), ('ㄴ', 'JX'), ('이', 'NP'), ('같', 'VA'), ('은', 'ETD'), ('법안', 'NNG'), ('이', 'JKS'), ('현장', 'NNG'), ('에', 'JKM'), ('제대', 'NNG'), ('로', 'JKM'), ('적용', 'NNG'), ('되', 'XSV'), ('기', 'ETN'), ('위하', 'VV'), ('어서', 'ECD'), ('는', 'JX'), ('회사', 'NNG'), ('의', 'JKG'), ('수직적', 'NNG'), ('위계', 'NNG'), ('구조', 'NNG'), ('와', 'JC'), ('인력', 'NNG'), ('부족', 'NNG'), ('문제', 'NNG'), ('등', 'NNB'), ('구조적', 'NNG'), ('문제', 'NNG'), ('가', 'JKS'), ('우선', 'NNG'), ('해결', 'NNG'), ('되', 'XSV'), ('어야', 'ECD'), ('하', 'VV'), ('ㄴ다는', 'ETD'), ('지적도', 'NNG'), ('나오', 'VV'), ('ㄴ다', 'EFN'), ('.', 'SF')]
print("hannanum 품사 태깅:", hannanum.pos(sentence))
hannanum 품사 태깅: [('감정노동자', 'N'), ('보호법', 'N'), ('은', 'J'), ('사업주', 'N'), ('로', 'J'), ('하여금', 'M'), ('감정노동', 'N'), ('으로부터', 'J'), ('근로자', 'N'), ('를', 'J'), ('보호', 'N'), ('하', 'X'), ('는', 'E'), ('예방', 'N'), ('조치', 'N'), ('를', 'J'), ('이행', 'N'), ('하', 'X'), ('도록', 'E'), ('강제', 'N'), ('하', 'X'), ('ㄴ다', 'E'), ('.', 'S'), ('다만', 'M'), ('현장', 'N'), ('근로자들', 'N'), ('을', 'J'), ('중심', 'N'), ('으론', 'J'), ('이', 'M'), ('같', 'P'), ('은', 'E'), ('법안', 'N'), ('이', 'J'), ('현장', 'N'), ('에', 'J'), ('제대로', 'M'), ('적용', 'N'), ('되', 'X'), ('기', 'E'), ('위하', 'P'), ('어서', 'E'), ('는', 'J'), ('회사', 'N'), ('의', 'J'), ('수직적', 'N'), ('위계', 'N'), ('구조', 'N'), ('와', 'J'), ('인력', 'N'), ('부족', 'N'), ('문제', 'N'), ('등구조적', 'N'), ('문제', 'N'), ('가', 'J'), ('우선', 'M'), ('해결', 'N'), ('되', 'X'), ('어야', 'E'), ('하', 'P'), ('ㄴ다는', 'E'), ('지적', 'N'), ('도', 'J'), ('나', 'P'), ('아', 'E'), ('오', 'P'), ('ㄴ다', 'E'), ('.', 'S')]
print("komoran 품사 태깅: ", komoran.pos(sentence))
komoran 품사 태깅: [('감정', 'NNP'), ('노동자', 'NNP'), ('보호', 'NNG'), ('법', 'NNG'), ('은', 'JX'), ('사업주', 'NNG'), ('로', 'JKB'), ('하여금', 'MAG'), ('감정노동', 'NNP'), ('으로부터', 'JKB'), ('근로자', 'NNG'), ('를', 'JKO'), ('보호', 'NNG'), ('하', 'XSV'), ('는', 'ETM'), ('예방', 'NNP'), ('조치', 'NNG'), ('를', 'JKO'), ('이행', 'NNG'), ('하', 'XSV'), ('도록', 'EC'), ('강제', 'NNG'), ('하', 'XSV'), ('ㄴ다', 'EF'), ('.', 'SF'), ('다만', 'NNP'), ('현장', 'NNG'), ('근로자', 'NNG'), ('들', 'XSN'), ('을', 'JKO'), ('중심', 'NNG'), ('으로', 'JKB'), ('ㄴ', 'JX'), ('이', 'MM'), ('같', 'VA'), ('은', 'ETM'), ('법안', 'NNG'), ('이', 'JKS'), ('현장', 'NNG'), ('에', 'JKB'), ('제대로', 'MAG'), ('적용', 'NNG'), ('되', 'XSV'), ('기', 'ETN'), ('위하', 'VV'), ('아서', 'EC'), ('는', 'JX'), ('회사', 'NNG'), ('의', 'JKG'), ('수직', 'NNG'), ('적', 'XSN'), ('위계', 'NNP'), ('구조', 'NNG'), ('와', 'JC'), ('인력', 'NNG'), ('부족', 'NNG'), ('문제', 'NNG'), ('등', 'NNB'), ('구조', 'NNP'), ('적', 'XSN'), ('문제', 'NNG'), ('가', 'JKS'), ('우선', 'MAG'), ('해결', 'NNG'), ('되', 'XSV'), ('어야', 'EC'), ('하', 'VV'), ('ㄴ다는', 'ETM'), ('지적', 'NNG'), ('도', 'JX'), ('나오', 'VV'), ('ㄴ다', 'EF'), ('.', 'SF')]
print("twitter 품사 태깅:", twitter.pos(sentence))
twitter 품사 태깅: [('감정노동자', 'Noun'), ('보호', 'Noun'), ('법', 'Noun'), ('은', 'Josa'), ('사업', 'Noun'), ('주로', 'Noun'), ('하여금', 'Adverb'), ('감정노동', 'Noun'), ('으로부터', 'Josa'), ('근로자', 'Noun'), ('를', 'Josa'), ('보호', 'Noun'), ('하는', 'Verb'), ('예방', 'Noun'), ('조치', 'Noun'), ('를', 'Josa'), ('이행', 'Noun'), ('하도록', 'Verb'), ('강제', 'Noun'), ('한다', 'Verb'), ('.', 'Punctuation'), ('다만', 'Noun'), ('현장', 'Noun'), ('근로자', 'Noun'), ('들', 'Suffix'), ('을', 'Josa'), ('중심', 'Noun'), ('으론', 'Josa'), ('이', 'Noun'), ('같은', 'Adjective'), ('법안', 'Noun'), ('이', 'Josa'), ('현장', 'Noun'), ('에', 'Josa'), ('제대로', 'Noun'), ('적용', 'Noun'), ('되기', 'Verb'), ('위', 'Noun'), ('해서는', 'Verb'), ('회사', 'Noun'), ('의', 'Josa'), ('수직', 'Noun'), ('적', 'Suffix'), ('위계', 'Noun'), ('구조', 'Noun'), ('와', 'Josa'), ('인력', 'Noun'), ('부족', 'Noun'), ('문제', 'Noun'), ('등', 'Noun'), ('구조', 'Noun'), ('적', 'Suffix'), ('문제', 'Noun'), ('가', 'Josa'), ('우선', 'Noun'), ('해결', 'Noun'), ('돼야', 'Verb'), ('한다는', 'Modifier'), ('지적도', 'Noun'), ('나온다', 'Verb'), ('.', 'Punctuation')]
'AI' 카테고리의 다른 글
[자연어처리] 영화 리뷰 데이터로 평점을 예측해보자 (0) | 2022.01.13 |
---|---|
RNN:: LSTM이란 무엇일까 (0) | 2022.01.12 |
[자연어 처리] 언어학에 대해서 배워보자 (0) | 2021.12.27 |
[자연어처리] 자연어 처리 기초 이론 (0) | 2021.12.27 |
[AI] 대학교 합격 예측 프로그램 (0) | 2021.12.27 |