▷ 오늘 학습 계획: 머신러닝 강의(18~20)
KoNLPy: 쉽고 간결한 한국어 정보처리 파이썬 패키지
(Korean natural language processing in Python)
형태소: 언어의 최소 의미 단위
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('한국어 분석을 시작합니다 재미있어요!')
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()
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]
지도학습에 속하기 때문에 정답을 알려주는 과정이 필요하다.
감성 분석(영어)
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)
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)