Text Processing(3) - 텍스트 내에서의 분류/변환작업

2019. 1. 23. 02:41Udacity Nanodegree/Natural Language Processing

개체명 인식(Named Entity Recognition)

  • 개체명(Named Entity)란 보통 특정한 사물이나 사람 또는 장소를 지칭하는 명사이다.

  • 개체명 인식을 위해서는 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")))
  • 위 코드를 실행하면 다음과 같은 결과를 보인다.


  • 결과를 자세히 살펴보면 Udacity와 Inc.가 Organization이라는 동일 범주에 묶인 것을 확인할 수 있다.

  • 보통은 결과가 그렇게 정확한 편은 아니지만, 대규모의 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이 메모리를 더 적게 사용한다는 점에서 사용을 고려할 수도 있을 것이다.