# Quiz 1 : 앞에서 학습한 Classifier 모델을 불러온다
# >> './data/classifiers.model' --> classifier
import pickle
classifier = pickle.load(open('../data/classifiers.model', 'rb'))
# Quiz 2 : 분류기준 단어목록 불러오기
# >> './data/selected.words' --> selected_words
selected_words = pickle.load(open('../data/selected.words', 'rb'))
# Tokenizer 생성/ 판단모듈
from konlpy.tag import Twitter
twitter = Twitter()
# 문단을 긍부정 분석용 Token 생성하기
def tokenize(doc):
doc = ['/'.join(t) for t in twitter.pos(doc, norm=True, stem=True)]
return {'exists({})'.format(word): (word in set(doc)) for word in selected_words}
# 위에서 생성한 Token을 활용하여 판단하기
def classify_text(text):
tokens = tokenize(text) # 트위터로 Stemming/ Taggging 후 Selected_word 판단결과 객체
return classifier.classify(tokens) # 분류모델 평가
# 데이터와 모델, 함수를 활용하여 긍/부정 Test
# 0 : 부정모델 , 1 : 긍정모델
text = """영화가 재미있어요"""
# 학습 데이터를 활용하여 text 내용 긍/부정 판단
result = classify_text(text)
if result == '1':
print('긍정리뷰')
else:
print('부정리뷰')
긍정리뷰
%%time
# 외부뉴스 데이터 수집하기
from txtutil import Naver_news_rep
news_url = "https://news.naver.com/main/hotissue/read.nhn?mid=hot&" +\
"sid1=&cid=1064721&iid=3227816&oid=001&aid=0010068060&ptype=021"
replies = Naver_news_rep(news_url)
# import pickle
# pickle.dump(replies, open('./data/naver_news.rep', 'wb'))
CPU times: user 863 ms, sys: 24.4 ms, total: 887 ms Wall time: 2.38 s
# Quiz 3 : 네이버 뉴스 댓글 저장데이터 불러오기
# >> './data/naver_news.rep' --> data
# import pickle
# data = pickle.load(open('./data/naver_news.rep', 'rb'))
# data[:5]
data = replies
data[:5]
['"방수 된다고 했지, 고장 안난다고 한적 없습나다 고갱님^^"', '"휴지에 물 묻혀서 청소하는게 생활방수 아니면 뭐임??"', '"이러니 순실전자니 뭐니해도 삼성 쓸수밖에.AS가 넘사벽이잖아.왜 소비자가 불편함과 불이익을 감수하면서 까지 불매를 해야함?"', '"실제 애플 홈페이지에 소개된 제품 설명 맨 하단에 보면 작은 글씨로 \\"아이폰은 IP67 등급 생활 방수 및 방진 기능을 갖추고 있다\\"면서도 \\"액체에 의한 손상은 보증 대상이 아니다\\"라고 못 박고 있다. <<< 이부분 어안벙벙하긴 함."', '"침수됐으니 유상으로 수리를 받아야 한다며 76만원을 내라고 했다...이거 실화냐 ? 이게 말이여 ? 방구여 ? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ"']
# 전체 댓글 갯수중 긍정/ 부정 갯수 계산하기
pro, con = [], []
for datum in data:
if classify_text(datum) == "1":
pro.append(datum)
else:
con.append(datum)
# 긍정 / 부정 분류된 데이터를 Json 과 같은 형태로 정리
result = {}
result["긍정"] = pro
result["부정"] = con
# 긍정리뷰 갯수
len(result["긍정"])
125
# 부정리뷰 갯수
len(result["부정"])
397
# 긍정 댓글을 구분하여 분류한 뒤
# 명사, 형용사, 동사 Token만 추출하기 (전처리 / Token의 예외처리는 미포함)
texts = result['부정']
texts[:3]
%%time
filtered_tokens = ""
# 명사, 형용사, 동사 Filtering
for text in texts:
for txt in text[0].split(' '):
tokens = twitter.pos(text ,stem=True)
tokens = [token[0] for token in tokens
if (token[1] in ['Noun','Adjective','Verb']) and (len(token[0]) > 1 )]
tokens = " ".join(tokens)
filtered_tokens += tokens
print(filtered_tokens[:300])
from nltk.tokenize import word_tokenize
filtered_tokens = word_tokenize(filtered_tokens)
# nltk.Text() 객체를 활용
# 상위 빈도수 20인 Token을 추출
import nltk
pos_nltk = nltk.Text(filtered_tokens, name='부정댓글')
pos_nltk.vocab().most_common(20)