인공지능/RNN

간단한 자연어 처리 (NLTK)

쿠와와 2020. 11. 21. 17:14
# 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()