형태소 분석 해주는 라이브러리가 NLTK
NLTK(Natural Language Toolkit) 패키지는 교육용으로 개발된 자연어 처리 및 문서 분석용 파이썬 패키지다. 다양한 기능 및 예제를 가지고 있으며 실무 및 연구에서도 많이 사용된다.
NLTK 패키지가 제공하는 주요 기능은 다음과 같다.
corpus는 분석 작업을 위한 샘플 문서 집합을 말한다. 단순히 소설, 신문 등의 문서를 모아놓은 것도 있지만 대부분 품사. 형태소, 등의 보조적 의미를 추가하고 쉬운 분석을 위해 구조적인 형태로 정리해 놓은 것이 많다.
NLTK 패키지의 corpus 서브패키지에서는 다음과 같은 다양한 연구용 corpus를 제공한다. 이 목록은 전체 corpus의 일부일 뿐이다.
이러한 corpus 자료는 설치시에 제공되는 것이 아니라 download
명령으로 사용자가 다운로드 받아야 한다.
In [1]:
import nltk
nltk.download('averaged_perceptron_tagger')
nltk.download("gutenberg")
nltk.download('punkt')
nltk.download('reuters')
nltk.download("stopwords")
nltk.download("taggers")
nltk.download("webtext")
nltk.download("wordnet")
Out[1]:
In [3]:
nltk.corpus.gutenberg.fileids()
Out[3]:
In [4]:
emma_raw = nltk.corpus.gutenberg.raw("austen-emma.txt")
print(emma_raw[:1302])
문장을 쪼개는 것. 전체 텍스트를 쪼개는 과정. 어떻게 쪼개느냐? 그건 다 다르다. 자기가 원하는 방식으로
문서를 분석하기 위해서는 우선 긴 문자열을 분석을 위한 작은 단위로 나누어야 한다. 이 문자열 단위를 토큰(token)이라고 한다.
In [5]:
from nltk.tokenize import word_tokenize
word_tokenize(emma_raw[50:100]) #,도 별도로 token으로 만들어준다.
Out[5]:
In [7]:
from nltk.tokenize import RegexpTokenizer
t = RegexpTokenizer("[\w]+") #글자로 인식할 수 있는 거 1개 이상. ,는 생략
t.tokenize(emma_raw[50:100])
Out[7]:
In [8]:
from nltk.tokenize import sent_tokenize
print(sent_tokenize(emma_raw[:1000])[3])
형태소 분석이란 어근, 접두사/접미사, 품사(POS, part-of-speech) 등 다양한 언어적 속성의 구조를 파악하는 작업이다. 구체적으로는 다음과 같은 작업으로 나뉜다.
In [9]:
from nltk.stem import PorterStemmer
st = PorterStemmer()
st.stem("eating")
Out[9]:
In [10]:
from nltk.stem import LancasterStemmer
st = LancasterStemmer()
st.stem("shopping")
Out[10]:
In [11]:
from nltk.stem import RegexpStemmer
st = RegexpStemmer("ing")
st.stem("cooking")
Out[11]:
In [12]:
from nltk.stem import WordNetLemmatizer
lm = WordNetLemmatizer()
print(lm.lemmatize("cooking"))
print(lm.lemmatize("cooking", pos="v"))
print(lm.lemmatize("cookbooks"))
In [13]:
print(WordNetLemmatizer().lemmatize("believes"))
print(LancasterStemmer().stem("believes"))
POS(part-of-speech)는 품사를 말한다.
In [14]:
from nltk.tag import pos_tag
tagged_list = pos_tag(word_tokenize(emma_raw[:100]))
tagged_list
Out[14]:
In [15]:
from nltk.tag import untag
untag(tagged_list)
Out[15]: