Python/NLP

[NLP] Language Processing and Python

_키아 2022. 10. 23. 18:56

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']))