Machine Learning_8

YJ·2023년 5월 23일
0

▷ 오늘 학습 계획: 머신러닝 강의(18~20)

📖 Chapter 08_NLP

Natural Language Processing

KoNLPy: 쉽고 간결한 한국어 정보처리 파이썬 패키지
(Korean natural language processing in Python)

1) 형태소 분석

형태소: 언어의 최소 의미 단위

Kkma

from konlpy.tag import Kkma
kkma = Kkma()
kkma.sentences('한국어 분석을 시작합니다 재미있어요!')
# ['한국어 분석을 시작합니다', '재미있어요!']
kkma.nouns('한국어 분석을 시작합니다 재미있어요!')
['한국어', '분석']
kkma.pos('한국어 분석을 시작합니다 재미있어요!')

Hannanum

from konlpy.tag import Hannanum
hannanum = Hannanum()
hannanum.nouns('한국어 분석을 시작합니다 재미있어요!')
# ['한국어', '분석', '시작']
hannanum.morphs('한국어 분석을 시작합니다 재미있어요!')
# ['한국어', '분석', '을', '시작', '하', 'ㅂ니다', '재미있', '어', '요', '!']
hannanum.pos('한국어 분석을 시작합니다 재미있어요!')

Okt

from konlpy.tag import Okt
t = Okt()
t.nouns('한국어 분석을 시작합니다 재미있어요!')
# ['한국어', '분석', '시작']
t.morphs('한국어 분석을 시작합니다 재미있어요!')
# ['한국어', '분석', '을', '시작', '합니다', '재미있어요', '!']
t.pos('한국어 분석을 시작합니다 재미있어요!')

2) 워드클라우드

WordCloud 모듈: 자체적으로 단어를 추출해서 빈도수를 조사하여 정규화

from wordcloud import WordCloud, STOPWORDS
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
text = open('../data/06_alice.txt').read()
alice_mask = np.array(Image.open('../data/06_alice_mask.png'))
stopwords = set(STOPWORDS)
stopwords.add("said")
wc = WordCloud(background_color='white', max_words=2000, mask=alice_mask, stopwords=stopwords)
wc = wc.generate(text)
wc.words_ # 단어의 빈도
plt.figure(figsize=(12,12))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

3) 육아휴직 법안 분석

import nltk
from konlpy.corpus import kobill
doc_ko = kobill.open('1809890.txt').read()
# Okt 엔진으로 명사 분석
from konlpy.tag import Okt
t = Okt()
tokens_ko = t.nouns(doc_ko)
# nltk를 이용한 토큰 분석
ko = nltk.Text(tokens_ko, name="대한민국 국회 의안 제 1809890호")
print(len(ko.tokens))  # number of tokens(document length)
print(len(set(ko.tokens)))  # number of unique tokens
ko.vocab()  # frequency distribution
ko.count('초등학교') #특정단어의빈도수조사
ko.dispersion_plot(["육아휴직", '초등학교', '공무원'])
# 텍스트 내 단어 사용 빈도와 위치를 나타낸 분산 그래프
ko.concordance('초등학교') #단어가 쓰인 모든 경우의 문맥 색인
ko.collocations() #함께 위치하는 단어 조회(어휘의 조합) 
# 한글 stopword 적용
ko = [each_word for each_word in ko if each_word not in stop_words]

4) Naive Bays Classifier

지도학습에 속하기 때문에 정답을 알려주는 과정이 필요하다.

감성 분석(영어)

from nltk.tokenize import word_tokenize
import nltk
train = [('i like you', "pos"), ('i hate you', 'neg'),
         ('you like me', 'neg'), ('i like her', 'pos')]
# 전체 말 뭉치 만들기
all_words = set(word.lower() for sentence in train for word in word_tokenize(sentence[0]))
# {'hate', 'her', 'i', 'like', 'me', 'you'}
t = [({word: (word in word_tokenize(x[0])) for word in all_words}, x[1]) for x in train]

classifier = nltk.NaiveBayesClassifier.train(t)
classifier.show_most_informative_features()

각 단어별로 독립적으로 확률을 계산한다.

test_sentence = 'i like MeRui'
test_sentence_features = {
    word.lower(): (word in word_tokenize(test_sentence.lower())) for word in all_words
}
classifier.classify(test_sentence_features)

감성 분석(한글)

한글은 형태소 분석이 필수이다.

from konlpy.tag import Okt
pos_tagger = Okt()
train = [("메리가 좋아", 'pos'), ('고양이도 좋아', 'pos'),
         ('난 수업이 지루해', 'neg'), ('메리는 이쁜 고양이야', 'pos'),
         ('난 마치고 메리랑 놀거야', 'pos')]
# 형태소 분석 및 품사를 단어 뒤에 붙이기
def tokenize(doc):
    return ["/".join(t) for t in pos_tagger.pos(doc, norm=True, stem=True)]
train_docs = [(tokenize(row[0]), row[1]) for row in train]
# 말뭉치 만들기
tokens = [t for d in train_docs for t in d[0]]
def term_exists(doc):
    return {word: (word in set(doc)) for word in tokens}
train_xy = [(term_exists(d), c) for d, c in train_docs]
classifier = nltk.NaiveBayesClassifier.train(train_xy)
classifier.show_most_informative_features()

test_sentence = [('난 수업이 마치면 메리랑 놀거야')]
test_docs = pos_tagger.pos(test_sentence[0])
test_sent_features = {word: (word in tokens) for word in test_docs}
classifier.classify(test_sent_features)

5) 문장의 유사도

CountVectorizer: 문장을 벡터로 변환하는 함수

벡터로 만들어서 만들어진 벡터 사이의 거리를 계산
거리를 구하기 때문에 지도할 내용은 없다.

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(min_df=1)
# 형태소 분석
from konlpy.tag import Okt
t=Okt()

→ 형태소가 분석된 결과를 다시 합쳐준다

X = vectorizer.fit_transform(contents_for_vectorize)
vectorizer.get_feature_names_out()
X.toarray().transpose()

유클리드 거리

import scipy as sp
def dist_raw(v1, v2):
    delta = v1-v2
    return sp.linalg.norm(delta.toarray())

TF-IDF

TF: Term Freq.(한 문서에서 많이 등장한 단어에 가중치)
IDF: Inverse Document Freq.(전체 문서에 많이 나타난 단어는 중요하지 않게)

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(min_df=1, decode_error='ignore')
X = vectorizer.fit_transform(contents_for_vectorize)
new_post_vec = vectorizer.transform(new_post_for_vectorize)
def dist_norm(v1,v2):
    v1_normalized = v1/sp.linalg.norm(v1.toarray())
    v2_normalized=v2/sp.linalg.norm(v2.toarray())
    delta = v1_normalized - v2_normalized
    return sp.linalg.norm(delta.toarray())
dist = [dist_norm(each, new_post_vec) for each in X]
dist.index(min(dist))
min(dist)

네이버 지식인 검색 결과에서 유사한 문장 찾기

▷ 내일 학습 계획: 머신러닝 강의(21~22)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글