2019. 1. 23. 02:41ㆍUdacity Nanodegree/Natural Language Processing
개체명 인식(Named Entity Recognition)
개체명(Named Entity)란 보통 특정한 사물이나 사람 또는 장소를 지칭하는 명사이다.
자세한 설명 및 이해를 위해서는 https://wikidocs.net/24682를 참고하면 좋다.
개체명 인식을 위해서는 NLTK 라이브러리의 ne_chunk 함수를 통해 텍스트 내의 개체명을 판별할 수 있다.
이를 위해서는 PoS Tagging과 Tokenization이 모두 완료되어 있는 상태여야 한다.
from nltk import pos_tag, ne_chunk
from nltk.tokenize import word_tokenize
# Recognize named entities in a tagged sentence
ne_chunk(pos_tag(word_tokenize("Antonio joined Udacity Inc. in California")))
보통은 결과가 그렇게 정확한 편은 아니지만, 대규모의 corpus를 이용해 학습을 시키는 것으로 이러한 점을 개선시킬 수 있다.
개체명 인식(Named Entity Recognition)은 일반적으로 지정한 뉴스 회사에서의 뉴스 기사 검색 및 살펴보기를 위한 용도로 쓰인다.
어간 추출과 표제어 추출(Stemming and Lemmatization)
텍스트 데이터를 더욱 심플하게 만들기 위해서는, 단어를 더 다양한 방법으로 가공할 필요가 있다.
어간 추출과 표제어 추출에 대해 https://wikidocs.net/21707를 참고하면 자세한 설명을 볼 수 있다.
Stemming
어간 추출(Stemming)은 단어를 기본 형태로 되돌리는 작업을 의미한다.
예를 들면, branching / branched / branches라는 단어들은 모두 branch라는 단어가 기본 형태이다.
그리고 반대로 생각해보면, branch라는 단어에서 파생된 형태로 branching / branched / branches라는 단어가 있다는 의미가 된다.
이러한 작업은 복잡도를 완화시켜주며, 동시에 단어에 내재되어있는 의미를 그대로 가져갈 수 있다는 장점이 있다.
어간 추출은 빠르지만 까다로운 작업이다.
단어를 원본 형태로 바꿔주는 작업이기 때문
예를 들자면 caching / cached / caches라는 단어에서 ing / ed / es만 제외하면 cach라는 단어가 남는다.
이 단어는 나열한 세 단어들의 기본 형태가 아니다.
하지만 모든 단어가 같은 기본 형태를 가지고 있는 이상, 이러한 것들은 너그럽게 허용될 수 있다.
단어들이 모두 뜻을 공유하고 있다면 형태는 어느정도 허용하는 것
NLTK에는 Stemming을 위한 몇가지 종류가 있다.
PorterStemmer
from nltk.stem.porter import PorterStemmer
SnowballStemmer
그리고 언어에 특화된 몇가지 다른 stemmer들이 있다.
이러한 Stemmer를 사용할 때는, stemmer함수에 단어를 하나씩 넣어줘야 한다.
from nltk.stem.porter import PorterStemmer
# Reduce words to their stems
stemmed = [PorterStemmer().stem(w) for w in words] # Stop words removed
print(stemmed)
Lemmatization
표제어 추출(Lemmatization)은 단어를 normalized형태로 바꾸기 위한 또다른 방법이다.
여기서는 Stemming과는 다르게 Dictionary를 사용하여 변환한다.
이는 단어의 여러 변형된 형태를 감안하기 위함이다.
예를 들면, is / was / were라는 세 단어는 모두 be라는 형태로 변환된다.
이러한 점의 장점은 불규칙적인 형태 변형을 탐지하는데 효과적이라는 것이다.
NLTK에서 사용하는 lemmatization의 기본 설정은 WordNet 데이터베이스를 기반으로 단어를 기본 형태로 바꿔준다.
from nltk.stem.wordnet import WordNetLemmatizer
# Reduce words to their root form
lemmed = [WordNetLemmatizer().lemmatize(w) for w in words]
print(lemmed)
Stemming에서와 같이 WordNetLemmatizer를 initialize해주고 한 단어씩 함수에 넣어준다.
Lemmatizer가 작동하기 위해서는 변환하고자 하는 단어의 PoS(Part-of-Speech)를 알거나 예측을 해야 한다.
이 경우에는, WordNetLemmatizer의 기본 설정은 명사이다.
하지만 원하는 경우에는 PoS의 parameter를 특정해 주는 것으로 새롭게 정의할 수 있다.
# Lemmatize verbs by specifying pos
lemmed = [WordNetLemmatizer().lemmatize(w, pos='v') for w in lemmed]
print(lemmed)
정리하자면 다음과 같다.
Stemming은 Lemmatization과 다르게 기본 형태로 변환한 단어가 의미를 가진 단어가 아닐 수 있다.
이것이 의미하는 바는, Stemming은 Lemmatization과 다르게 Dictionary가 따로 필요가 없다는 점이다.
상황에 따라서 Stemming이 메모리를 더 적게 사용한다는 점에서 사용을 고려할 수도 있을 것이다.
'Udacity Nanodegree > Natural Language Processing' 카테고리의 다른 글
Language Model(1) - Bayesian Theorem 부터 Naive Bayes까지 (0) | 2019.02.03 |
---|---|
Text Processing(4) - 한장 요약 (0) | 2019.01.23 |
Text Processing(2) - 데이터 전처리(Text Preprocessing) (0) | 2019.01.23 |
Text Processing(1) - 데이터 클리닝(Data Cleaning/Cleansing) (0) | 2019.01.20 |
NLP의 작업 과정 (0) | 2019.01.20 |