# Day_03_02_nltk.py 자연어 처리
import nltk # natural language toolkit 자연어 처리 모듈
# 데이터 -> 코퍼스 -> 토큰화 -> 어간 -> 품사
# 어간 -> 사람은, 사람이, 사람에게, 사람의, 사람이라면, 사람일까, ...
# nltk.download('punkt')
def load_datasets():
nltk.download('gutenberg')
nltk.download('webtext')
nltk.download('reuters')
# nltk.download()
def corpus():
print(nltk.corpus.gutenberg.fileids()) # file_ids 출력
moby = nltk.corpus.gutenberg.raw('melville-moby_dick.txt') # text 전체
print(moby[:1000]) # 너무 많으니 자름
print(type(moby)) # str로 되어있는 것 확인 가능
words = nltk.corpus.gutenberg.words('melville-moby_dick.txt') # 전체를 단어로 끊어서 출력
print(words)
def tokenize(): # 단어추출 word 를 숫자로 변환
moby = nltk.corpus.gutenberg.raw('melville-moby_dick.txt')
moby = moby[:1000]
# 함수의 유형 대문자 = 계쏙 사용하겠다 . 소문자 한번만 사용하겠다.
# print(nltk.tokenize.sent_tokenize(moby))
for sent in nltk.tokenize.sent_tokenize(moby):
print(sent)
print('-----------')
# print(nltk.tokenize.word_tokenize(moby))
print(nltk.tokenize.wordpunct_tokenize(moby))
print(nltk.tokenize.regexp_tokenize(moby, r'\w+')) # 써야하는 이유 다른게 너무 복잡함
# 1번째는 text 2번쨰는 패턴 위에꺼랑 비교해보기
print(nltk.tokenize.regexp_tokenize(moby, r'[A-Za-z]')) # 자유도가 가장 높음, 정규 표현식 알아야 함
print(nltk.tokenize.regexp_tokenize(moby, r'[A-Za-z0-9]+'))
print(nltk.tokenize.regexp_tokenize(moby, r'[A-Za-z0-9가힣]+')) # 한글도 뽑아냄
# 어간 추출 학자마다 구현방법이 조금 다름
def stemming():
words = ['lives', 'dies', 'flies', 'died'] # 2번째와 4번째가 다른지 알아봐야함
# 외국에서 유명한 2가지
st = nltk.stem.PorterStemmer() # 1 해석하는 방법
print([st.stem(i) for i in words])
st = nltk.stem.LancasterStemmer() # 2 해석하는 방법
print([st.stem(i) for i in words])
# 단어를 가지고 실제 데이터를 만드는 것
def grams():
text = 'all the known nations of the world'
tokens = nltk.word_tokenize(text)
# print([i for i in range(len(tokens) - 2)])
# print([tokens[i] for i in range(len(tokens))])
# n gram
g = [tokens[i:i+3] for i in range(len(tokens) - 2)]
print(g)
print(*g, sep='\n') # [] 사라짐 => 언패킹
print()
print(tuple(nltk.bigrams(tokens))) # 2개씩 출력 bi = 2개
print(list(nltk.trigrams(tokens))) # 3개씩 list로 출력해줌
# print(list(nltk.ngrams(tokens, 5))) # 5개씩 list로 출력해줌
print(*list(nltk.ngrams(tokens, 5)), sep='\n') # 5개씩 list로 출력해줌
# load_datasets()
# corpus()
# tokenize()
# stemming()
grams()