- 명사 (책상, 조영진)
- 대명사 (나, 너, 우리)
- 수사 (하나, 둘, 셋)
- 동사 (뛰다, 걷다, 눕다)
- 형용사 (예쁘다, 크다, 작다)
- 관형사 (이, 그, 저)
- 부사 (자주, 잘, 매우)
- 조사 (의, 에, 을/를)
- 감탄사 (아이고, 앗, 와)
단어는 문장을 이루는 가장 작은 의미 단위이다.
단어는 최소의 자립형식을 가져야한다.
그러나 조사같은 경우에는 독립적으로 사용할 수 없지만 단어이다.
그 이유는 문장에서 필수적으로 사용되는 형식형태소이기 때문이다.
1. 실질 형태소
실제적인 의미를 가지고 있는 형태소
명사, 형용사, 동사 등으로 구성된다.
예 : 먹다, 큰, 책, 나
2. 형식 형태소
문법적인 기능을 수행하는 형태소
단어의 문법적인 형태나 관계를 나타낸다.
조사, 어미, 접속사 등으로 구성된다.
한국어 - 교착어 (어형 변화가 있음 -> 알아볼 수 있지만 경계면 부분에서는 분리가 힘듦)
예 : 했다 -> (하 + 었 + 다), 봤다 -> (보 + 았 + 다)
한국어는 어형 변화 경우의 수가 매우 다양해
데이터를 구축하는데 있어 형태소 분석을 하지 않으면
데이터의 크기가 매우 커진다.
그렇기 때문에 형태소 분석을 잘 진행해야 한다.
영어 - 굴절어 (어형 변화가 있음 -> 알아보기 힘들게 바뀜
예 : do -> did -> done (왜 do가 did가 되었는지 알기 힘듦),
go -> went -> gone (왜 go가 went로 바뀌었는지 알기 힘듦)
영어는 어형 변화가 파생 전 단어를 모를 정도로 많이 진행된다.
그러나 어형 변화 경우의 수가 적기 때문에
전부 따로 학습시켜도 데이터의 양이 많지 않다.
중국어 - 고립어 (각 단어가 어형 변화를 안함)
형태소 분석기는 주어진 한국어 텍스트를 가장 작은 의미단위인
'형태소'로 분리하는 도구이다.
형태소 분석은 복잡한 한국어의 구조를 파악하는데 필요한 기초 작업이다.
향태소 분석기의 이름을 생각해본다면
형태소 분석기의 결과는 항상 형태소 단위여야 하는가??
.
.
.
.
.
.
.
.
.
.
.
'형태소 분석기'라는 명칭을 생각하면 분석 내용은
항상 형태소 단위여야 한다고 생각할 수 있다.
그러나 문장을 '의미있는 단위'로 분리하는 목적이지,
반드시 '최소 의미 단위'로의 분리가 아니다!
영어의 경우에 형태소 분석기는
POS tagger(Part of Speech tagger)라는 이름으로 사용된다.
이 때의 part는 단어(word)가 될 것을 기대한다.
그 이유는 영어에서 형태소 단위는 기대하는 단위 이하이기 때문이다.
영어는 기본적으로 띄어쓴 단위가 곧 단어이다.
- it is unbreakable → ‘it’, ‘is’, ‘unbreakable’ (O), ‘it’, ‘is’, ‘un’, ‘break’, ‘able’ (X)
- baseball → ‘baseball’ (O), ‘base’, ‘ball’ (X)
그러나 한국어의 경우에는 단어 단위는 기대하는 단위 이상일 때가 많으므로
단어 이하의 단위로 분리해야한다.
이것이 곧 형태소 단위가 된다.
‘밥을 먹었다’ → ‘밥’, ‘을‘, ‘먹었다’ (X), ‘밥’, ‘을’, ‘먹’, ‘었’, ‘다’ (O)
그러나 복합명사에서는 '형태소 단위'가 아닌,
의미있는 단위가 중요하니 반드시 형태소 분리가 되게 할 것이 아니라,
목적에 적합한 단위(형태소/단어)로 나오면 된다.
'탄도미사일' → '탄도', '미사일' (X), '탄도미사일' (O)
'탄도미사일'을 형태소로 나누면 '탄도' + '미사일'이 된다.
그렇지만 '탄도미사일'이 가진 의미는
'탄도' + '미사일'의 의미가 아니라 '탄도미사일'의 의미이다.
형태소 분석은 기본적으로 품사 사전을 이용하여 분석을 진행한다.
품사 사전 : 단어와 그 단어에 해당하는 품사를 정리해놓은 사전(파일)
그렇기에 사전을 미리 만들어 두어야 한다.
이때 "품사들을 어떻게 줄여서 영어로 저장할 것인가?" 에 대한 의문이 생긴다.
그렇기에 형태소 분석기마다 각자의 품사태그들을 만들었지만,
통일되어 있지 않아 사용자는 혼란을 겪는다.
그래서 국립국어원에서 품사태그를 만들어 배포하였다.
품사 사전의 태그들을 다음과 같다.
아래에서 사용할 라이노(rhinoMorph)는 세종 품사 태그를 사용하지만,
KoNLPy에 있는 코모란(Komoran)만이 세종 품사 태그를 따르고,
다른 모델들은 고유의 품사 태그를 사용한다.
의존명사는 독립적으로 존재할 수 없는 명사이다.
것 : 그것은 나의 가방이다.
데 : 그런 데에서는 조심해야한다.
바 : 그럴 바에는 하지 않겠다.
리 : 그럴 리가 없어.
줄 : 그럴 줄 알았어.
정보량은 한 단어를 듣고 떠올릴 수 있는
심상의 구체화 정도를 의미한다고 할 수 있다.
일반명사와 의존명사는 정보량의 차이가 크다.
'구름' 에 대해서 떠올려보자.
하얗고 두둥실 떠다니는 구름이 떠오를 것이다.
이번에는 '것' 에 대해서 떠올려보자.
떠오르는 것이 구체적이지 않다.
이렇게 심상이 구체적이지 않은 것을 "정보량이 적다" 라고 할 수 있다.
정보량이 적은 단어들은 언어 데이터 분석에 있어
의미를 알아내기 힘들기 때문에 단어를 제거하는데 있어
기초적인 하나의 기준이 된다.
1. 자바 개발자 버전인 JDK 다운로드 받기
2. JPype1 다운로드 받기
pip install JPype1
anaconda frompt에서 실행
3. 형태소 분석기 다운로드 받기 (rhinoMorph, KoNLPy)
pip install rhinoMorph
anaconda frompt에서 실행
1. 자바(JDK) 설치
!apt-get install g++ openjdk-8-jdk
2. JPype 설치하기
!pip install JPype1
3. 라이노 설치하기
!pip install rhinoMorph
JPype를 사용하기 때문에
한 번에 하나의 형태소 분석기 모듈만 사용할 수 있다.
라이노를 사용하다 KoNLPy를 불러와 사용할 수 없다는 뜻이다.
import rhinoMorph
rn = rhinoMorph.startRhino()
test='한글로 된 한글텍스트를 분석하는 것은 즐겁다.'
text_analyzed = rhinoMorph.onlyMorph_list(rn, test)
print('형태소 분석 결과 :', text_analyzed)
형태소 분석 결과 : ['한글', '로', '되', 'ㄴ', '한글', '텍스트', '를', '분석', '하', '는', '것', '은', '즐겁', '다', '.']
test='한글로 된 한글텍스트를 분석하는 것은 즐겁다.'
text_analyzed = rhinoMorph.onlyMorph_list(rn, test, pos=['NNG', 'NNP', 'VV',
'VA', 'XR', 'IC', 'MM', 'MAG', 'MAJ'])
print("2. 형태소 분석 결과: ", text_analyzed)
2. 형태소 분석 결과: ['한글', '되', '한글', '텍스트', '분석', '즐겁']
onlyMorph_list 함수의pos인자를 사용하여
원하는 품사를 선택할 수 있다.
test='한글로 된 한글텍스트를 분석하는 것은 즐겁다.'
text_analyzed = rhinoMorph.onlyMorph_list(rn, test, pos=['NNG', 'NNP', 'VV',
'VA', 'XR', 'IC', 'MM', 'MAG', 'MAJ'], eomi=True)
print("3. 형태소 분석 결과: ", text_analyzed)
3. 형태소 분석 결과: ['한글', '되다', '한글', '텍스트', '분석', '즐겁다']
onlyMorph_list 함수의 eomi인자를 True로 바꾸어
어말어미를 포함시킬 수 있다.. (기본값=False)
이 때 eomi는 '어미'를 영어로 직역한 것이다.
test='한글로 된 한글텍스트를 분석하는 것은 즐겁다.'
morphs, poses = rhinoMorph.wholeResult_list(rn, test)
print('4. 형태소 분석 결과')
print(morphs)
print(poses)
4. 형태소 분석 결과
['한글', '로', '되', 'ㄴ', '한글', '텍스트', '를', '분석', '하', '는', '것', '은', '즐겁', '다', '.']
['NNG', 'JKB', 'VV', 'ETM', 'NNG', 'NNG', 'JKO', 'XR', 'XSV', 'ETM', 'NNB', 'JX', 'VA', 'EF', 'SF']
wholeResult_list 함수를 이용해
전체 형태소와 품사정보를 한 번에 받아올 수 있다.
test='한글로 된 한글텍스트를 분석하는 것은 즐겁다.'
text_analyzed = rhinoMorph.wholeResult_text(rn, test)
print('5. 형태소 분석 결과:', text_analyzed)
5. 형태소 분석 결과:
한글로 한글/NNG + 로/JKB
된 되/VV + ㄴ/ETM
한글텍스트를 한글/NNG + 텍스트/NNG + 를/JKO
분석하는 분석/XR + 하/XSV + 는/ETM
것은 것/NNB + 은/JX
즐겁다 즐겁/VA + 다/EF
. ./SF
wholeResult_text함수를 이용해
형태소 분석 결과의 전과 후를 비교하며 볼 수 있다.
test='한글로 된 한글텍스트를 분석하는 것은 즐겁다.'
text_analyzed = rhinoMorph.onlyMorph_list(rn, test, pos=['NNG', 'NNP', 'VV',
'VA', 'XR', 'IC', 'MM', 'MAG', 'MAJ'], combineN=True)
print('6. 형태소 분석 결과', text_analyzed)
6. 형태소 분석 결과 ['한글', '되', '한글텍스트', '분석', '즐겁']
combineN 인자를 이용해 한 어절로 연결된 명사를
그 자체로 분석할 수 있다. (기본값=False)
text_analyzed = rhinoMorph.wholeResult_list(rn,' 사랑합니다')
print('7. 형태소 분석 결과', text_analyzed)
text_analyzed = rhinoMorph.wholeResult_list(rn,' 사랑합니다', xrVv=True)
print('8. 형태소 분석 결과', text_analyzed)
7. 형태소 분석 결과 (['사랑', '하', 'ㅂ니다'], ['XR', 'XSV', 'EF'])
8. 형태소 분석 결과 (['사랑하', 'ㅂ니다'], ['VV', 'EF'])
xrVv 인자를 사용하여 어근+하 형태를 하나의 동사로 분석할 수 있다.
(기본값=False)
형태소 분석기의 사용법과 함수, 인자들도 모두 중요하다.
그러나 가장 중요한 것은
형태소 분석의 본질적인 의미를 이해하는 것 이라고 생각한다.
형태소 분성의 본질적인 의미는
항상 형태소 단위로 분리 하는 것이 아닌,
'의미있는 단어'의 단위로 분리하는 것임을 잊으면 안된다!