자연어 처리는 컴퓨터로 하여금 사람이 작성한 언어(음성과 글)의 의미를 이해시키는 것을 목표로 한다.
먼저 텍스트 데이터를 준비한다. 3개 문장으로 구성된 영어문장을 텍스트 데이터로 삼아 단어주머니 언어모형을 구현해보자. text
는 하나의 텍스트이며, sentence
는 문장 3개를 들고 있는 리스트다.
text = "I like to play football. Did you go outside to play tennis. John and I play tennis"
sentence = ["I like to play football.", "Did you go outside to play tennis.", "John and I play tennis"]
단어주머니 모형은 오래되고 직관적이며 오래되서 잘 구현된 라이브러리가 많이 있다. nltk
, TextBlob
라이브러리를 사용해서 단어주머니 모형을 구현해보자. “아나콘다3”을 기반으로 작업할 경우 설치가 되어 있지 않으니 conda
를 사용해서 설치한다. 터미널에서 conda install -c conda-forge textblob
명령어를 실행시키면 TextBlob
이 설치된다.
기본적인 작업흐름은 텍스트 데이터를 blob
객체로 변환시킨다. 그리고 나서 blob
객체 메쏘드를 사용해서 단어주머니를 만들고 이를 판다스 데이터프레임으로 변환시킨 후에 groupby()
메쏘드를 사용해서 단어 빈도수를 만든다.
from textblob import TextBlob
import pandas as pd
blob = TextBlob(text)
print(blob.words)
# 데이터프레임 변환
['I', 'like', 'to', 'play', 'football', 'Did', 'you', 'go', 'outside', 'to', 'play', 'tennis', 'John', 'and', 'I', 'play', 'tennis']
text_df = pd.DataFrame(blob.pos_tags, columns=['word', 'pos'])
text_df.groupby('word')['word'].count().sort_values(ascending=False)
word
play 3
to 2
tennis 2
I 2
you 1
outside 1
like 1
go 1
football 1
and 1
John 1
Did 1
Name: word, dtype: int64
“Sentiment Analysis using Python”은 데이터프레임 판다스를 기본 자료구조로 감성분석하는 좋은 코드를 만들어 주었다. 앞선 3문장을 대상으로 간단히 감성분석 작업을 수행해보자!
sentence_df = pd.DataFrame(sentence, columns=['sentence'])
sentence_df['sentiment'] = sentence_df.sentence.apply(lambda sentence: TextBlob(sentence).sentiment)
print(sentence_df)
sentence sentiment
0 I like to play football. (0.0, 0.0)
1 Did you go outside to play tennis. (0.0, 0.05)
2 John and I play tennis (0.0, 0.0)
명사만 추출하고자 하는 경우 앞서 단어에 대한 품사를 식별했기 때문에 판다스 행을 추출하는 방식으로 뽑아낸다.
word pos
4 football NN
11 tennis NN
16 tennis NN
영어 자연어처리를 위해서 다양한 파이썬 라이브러리가 존재한다. 대표적으로 많이 사용되는 자연어 처리 파이썬 라이브러리는 다음과 같다.
영문 자연어 처리에서 많이 사용되는 Spacy
, NLTK
, CoreNLP
의 경우 라이선스에서 차이도 나지만 기능에서도 차이가 있다.
Feature | Spacy | NLTK | Core NLP | |
---|---|---|---|---|
Easy installation | Y | Y | Y | |
Python API | Y | Y | N | |
Multi Language support | N | Y | Y | |
Tokenization | Y | Y | Y | |
Part-of-speech tagging | Y | Y | Y | |
Sentence segmentation | Y | Y | Y | |
Dependency parsing | Y | N | Y | |
Entity Recognition | Y | Y | Y | |
Integrated word vectors | Y | N | N | |
Sentiment analysis | Y | Y | Y | |
Coreference resolution | N | N | Y |