[NLP] Language Processing and Python
Python으로 자연어처리 진행하기
NLTK
NLTK는 Nature Language ToolKit의 약자이며, 이 라이브러리는 NLP를 위한 많은 말뭉치, 어휘 자원 등의 기능을 제공한다. 여기서 말뭉치(corpus)란 자연어 분석 작업을 위해 만든 샘플 문서 집합을 의미한다.
위와 같은 방법으로 nltk를 import 해준 후 말뭉치 자료를 다운로드하기 위한 명령을 실행한다.
import nltk #import NLTK Library
nltk.download("book")
from nltk.book import *
book에 포함된 type 중 하나의 이름을 넣으면 해당 타입의 제목이 출력된다.
text1
해당 실습에서는 저작권이 말소된 문학작품을 포함하는 gutenberg 말뭉치를 샘플로 활용한다.
Searching Text
gutenberg 말뭉치 중 austen-sense.txt. 파일을 사용하려 한다. words() 함수는 파일의 모든 단어를 리스트 안에 넣어 반환한다. 그러나 이후 사용할 함수에 따라 다른 타입도 선언해두는 것이 좋다.
sense = gutenberg.words("austen-sense.txt")
sense_text = Text(sense)
concordance
: 단어가 쓰인 모든 경우의 문맥을 찾아준다. 여기서 문맥이란 해당단어의 앞과 뒤에 사용된 단어를 뜻한다.
sense_text.concordance("sense")
similar
: 주어진 단어와 비슷한 환경에서 쓰이는 단어를 찾아준다. 의미상으로 비슷한 단어를 찾아주는 것이 아니라, 오직 쓰이는 환경이 비슷한 단어들을 찾아준다.
sense_text.similar("sense")
common_contexts
: 두 단어의 공통 문맥을 확인한다.
sense_text.common_contexts(["sense", "so"])
dispersion_plot
: Y축에서 각 단어의 인스턴스를 보여준다. 각 단어가 사용된 위치를 시각화한다.
sense_text.dispersion_plot(["à Elinor", "Marianne", "Colonel", "Edward", "Lucy"])
Fine-grained Selection of Words
: 조금 더 세밀한 조건으로 단어를 찾을 때 활용할 수 있다.
예를 들어 endswith()을 사용해 특정 문자로 끝나는 단어들을 찾을 수 있다.
print([w for w in set(sense) if w.endswith('ed')])
혹은 문자 길이를 지정해 조건을 만족하는 단어들을 찾을 수도 있다.
print([w for w in set(sense) if len(w) == 5])
Counting Vocabulary
len
: 파일의 길이를 알려준다. 여기서 파일의 길이란 토큰의 수를 의미한다.
print(len(sense_text))
sorted
: 오름차순으로 정렬해주는 함수. 아래 코드에서 Set()은 중복을 제거해주는 역할을 한다.
sorted(set(sense_text))
count
: 주어진 단어가 파일에서 몇 번 등장하는지 세어준다.
sense_text.count("sense")
※응용 : 전체에서 몇 번 등장했는지 비율(%)로 나타내기
100*sense_text.count('a')/len(sense_text)
lexical diversity
: 새로운 함수를 정의하여 어휘의 다양성을 측정한다. 전체 단어 수를 세는 len()과 중복을 제거하는 set()을 활용하면 서로 다른 단어들이 얼마나 많이 사용되었는지 확인할 수 있다.
def lexical_diversity(text) :
return len(set(text))/len(text)
lexical_diversity(sense_text)
Frequency Distributions
FreqDist
: 문서에 사용된 단어(토큰)의 사용빈도 정보를 담는다.
sense_fdist = FreqDist(sense_text)
print(sense_fdist)
어떤 단어가 몇 번 담겼는지도 찾을 수 있다.
sense_fdist['sense']
most_common
: n번째로 자주 사용되는 단어를 찾아준다. 이때, plot()을 사용하면 누적 빈도도를 그릴 수 있다.
print(sense_fdist.most_common(10))
sense_fdist.plot(10, cumulative=True)
Collocations and Bigrams
collocation
: collocation이란, 동일한 맥락에서 일반적인 경우보다 높은 빈도로나타나는 어휘의 쌍을 의미한다.
sense_text.collocations()
Bigrams
: N-gram은 문장을 이루는 여러 단어들을 연속한 N개씩 묶어서 이 단위로 여러가지 처리(주로 빈도분석, 통계처리 등)를 수행하는 기법을 의미한다. 이 중 Bigram은 N의 값이 2일 경우를 나타낸다.
list(bigrams(['more', 'is', 'said', 'than', 'done', 'she']))