정규화는 같은 의미를 갖는 다른 표기방법의 단어를 합치는 과정으로, 표제어 추출, 어간 추출 등의 방법이 있다. 정규화의 목적은 원본이 되는 corpus의 복잡성을 줄이는 일이다. 단어들의 빈도수를 기반으로 문제를 푸는 BoW(Bag of Words)표현을 사용하는 NLP 문제에서 주로 사용된다. 먼저 형태소와 기본적인 한국어의 문법에 대해서 알아보자
먼저 형태소란 '의미를 가진 가장 작은 단위' 를 뜻한다. 두가지 기준으로 형태소를 분류할 수 있다. 의미를 가지는지에 따라서 실질 형태소 (의미를 가지고 있음), 형식 형태소 (문법적인 의미를 가지고 있음) 으로 분류할 수 있고, 독립적으로 사용될 수 있는지에 따라서 자립 형태소 (혼자서도 쓰일 수 있음), 의존 형태소 (다른 형태소와 결합해서 쓰여야 함) 으로 나뉜다.
- 어근 : 단어의 실질적인 의미가 있는 부분
- 접사 : 어근에 첨가되어 새 의미나 문법기능을 나타내는 형태소
- 어간 : 활용어에서 변하지 않는 부분
- 어미 : 용언,서술격 조사가 변하는 부분
📌 헷갈릴만한 부분
분리하여 자립적으로 쓸 수 있는 말이나, 어떤 말 뒤에 붙어서 문법적인 기능을 나타내는 말이다. 단일어, 복합어로 나누어진다. 단일어는 실질형태소 한개로 이뤄져있다. 복합어는 합성어와 파생어가 있는데, 각각 실질형태소 2개로 이뤄지거나, 실질형태소와 접사로 이루어진 단어이다.
합성어도 의미관계에 따라서 구별되고, 배열법에 따라 분류되지만 자세히는 다루지 않겠다.
단일어: 손, 책, 이마, 저고리, 어느, 첫, 뛰다, 읽다, 만지다, 가르치다, 작다, 예쁘다
합성어: 잘못, 곧잘, 또다시, 돌다리, 어깨동무
파생어: 불가능, 비정상, 신제품, 빚쟁이, 개발자, 운전자
단어를 기능,형태,의미로 나눈 것이다. 을,는,를 과 같은 조사도 품사에 해당하는데, 띄어쓰기 단위가 아니더라도 조사도 단어취급이다. 그리고 유사한 기능 및 의미를 가지는 품사들을 묶어서 ~언 이라고 한다.
명사,대명사,수사 --체언
관형사,부사 --수식언
감탄사 --독립언
조사 --관계언
동사,형용사 --용언
표제어는 위와 같은 의미를 가진다. 표제어 추출은 다른 형태를 가진 단어라도 그 뿌리 단어를 찾아서 정규화를 진행한다. 단어의 기본 사전형 단어로 추출하는 것이다.
am , are , is → be
위의 예시와 같이 am,are,is 모두 be라는 뿌리 단어를 가지는 것을 알 수 있다. 이때 표제어를 be라고 한다. 표제어 추출을 하기 위한 방법으로 먼저 형태학정 파싱을 진행해야한다. 형태학(morphology)이란 형태소로부터 단어를 만들어가는 학문을 뜻한다.
형태학적 파싱은 단어를 어근과 접사로 분리하는 작업이다. 예를들어, cats는 cat(어간),-s(접사) 로 분리한다. 하지만, 단어 cat은 형태학적 파싱이 불가능한데 독립적인 형태소이기 때문이다.
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
words = ['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
print('표제어 추출 전 :',words)
print('표제어 추출 후 :',[lemmatizer.lemmatize(word) for word in words])
표제어 추출 전 : ['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
표제어 추출 후 : ['policy', 'doing', 'organization', 'have', 'going', 'love', 'life', 'fly', 'dy', 'watched', 'ha', 'starting']
위의 실행결과를 보면, dy,ha와 같이 제대로 추출되지 않는 경우가 있다. WordNetLemmatizer는 입력으로 단어가 어떤 품사인지 알려줄 수 있다. 이를 통해서 더 정확한 어근을 추출하는 것이 가능하다.
lemmatizer.lemmatize('dies', 'v')
lemmatizer.lemmatize('watched', 'v')
lemmatizer.lemmatize('has', 'v')
'die'
'watch'
'have'
활용어에서 변형되지 않는 부분을 추출하는 어간추출이 있다. 이는 알고리즘의 종류에 따라서 추출 결과가 달라진다.
한글에서는 용언이 어간과 어미로 이루어져 있다. 어간이 원래는 활용될 때 변화가 없어야 하는데, 불규칙 활용시 어간이 달라지는 경우도 존재한다. 아래는 어간 추출 알고리즘 중 하나인 포터 알고리즘을 적용한 예시이다. 모두 규칙에 기반하여 어간 추출을 진행하기 때문에, 서로 다른 알고리즘으로 추출할 시 같은 단어여도 다른 결과가 나올 수 있다.
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
stemmer = PorterStemmer()
sentence = "This was not the map we found in Billy Bones's chest, but an accurate copy, complete in all things--names and heights and soundings--with the single exception of the red crosses and the written notes."
tokenized_sentence = word_tokenize(sentence)
print('어간 추출 전 :', tokenized_sentence)
print('어간 추출 후 :',[stemmer.stem(word) for word in tokenized_sentence])
어간 추출 전 : ['This', 'was', 'not', 'the', 'map', 'we', 'found', 'in', 'Billy', 'Bones', "'s", 'chest', ',', 'but', 'an', 'accurate', 'copy', ',', 'complete', 'in', 'all', 'things', '--', 'names', 'and', 'heights', 'and', 'soundings', '--', 'with', 'the', 'single', 'exception', 'of', 'the', 'red', 'crosses', 'and', 'the', 'written', 'notes', '.']
어간 추출 후 : ['thi', 'wa', 'not', 'the', 'map', 'we', 'found', 'in', 'billi', 'bone', "'s", 'chest', ',', 'but', 'an', 'accur', 'copi', ',', 'complet', 'in', 'all', 'thing', '--', 'name', 'and', 'height', 'and', 'sound', '--', 'with', 'the', 'singl', 'except', 'of', 'the', 'red', 'cross', 'and', 'the', 'written', 'note', '.']
https://wikidocs.net/21707
https://blog.naver.com/anthony79/220426937511