1. 데이터 가져오기
# 고양이 질문 데이터
from bs4 import BeautifulSoup #HTML 파싱
import urllib #검색어 인코딩
import time #슬립 사용
import requests #HTML 가져오기
from tqdm import tqdm_notebook
#크롤링 결과 저장할 변수
present_candi_text = []
html = 'https://search.naver.com/search.naver?where=kin&sm=tab_jum&ie=utf8&query=' + urllib.parse.quote('고양이') + '&start='
for n in range(1, 1000, 10):
response = requests.get(html + str(n))
soup = BeautifulSoup(response.text, "html.parser")
tmp = soup.select('div.question_area > div.question_group > a') #선택자
for line in tmp:
#print(line.text)
present_candi_text.append(line.getText())
time.sleep(0.5)
print(present_candi_text)
... |
# 강아지 질문 데이터
2. 형태소 분석
#고양이
import nltk
from konlpy.tag import Okt
okt = Okt()
present_text = ''
for each_line in present_candi_text[:10000]:
present_text = present_text + each_line + '\n'
tokens_ko = okt.morphs(present_text)
print(tokens_ko)
#강아지
3. 단어별 등장횟수 확인
ko = nltk.Text(tokens_ko, name='고양이')
print(ko.vocab().most_common(100))
[('고양이', 4860), ('가', 1800), ('에', 1260), ('를', 1170), ('\n', 900), ('이', 900), ('...', 900), ('는', 720), ('?', 540), ('강아지', 540), ('을', 540), ('집', 540), ('..', 450), ('제', 450), ('새끼', 450), ('한', 450), ('스트레스', 450), ('애기', 360), ('상', 360), ('요', 360), ('사료', 360), ('안', 360), ('배', 360), ('??', 270), ('에서', 270), ('으로', 270), ('근데', 270), ('한테', 270), ('꿈', 270), ('키우는', 270), ('들', 270), ('마리', 270), ('알레르기', 270), ('많이', 270), ('친구', 270), ('도', 270), ('이사', 270), ('그냥', 180), ('했는데', 180), ('랑', 180), ('고', 180), ('생각', 180), ('각', 180), ('먹고', 180), ('.', 180), ('많아서', 180), ('해', 180), ('닫고', 180), ('저희', 180), ('친척', 180), ('이번', 180), ('때', 180), ('문', 180), ('아기', 180), ('부터', 180), ('음식', 180), ('하는', 180), ('가서', 180), ('계속', 180), ('…', 180), ('말', 180), ('지금', 180), ('원래', 180), ('구조', 180), ('사람', 180), ('좋은', 90), ('건가', 90), ('인데', 90), ('귀여운', 90), (',', 90), ('이라고', 90), ('들어', 90), ('봤는데', 90), ('상도', 90), ('아니고', 90), ('고양', 90), ('이상은', 90), ('뭔', 90), ('뜻', 90), ('이에요', 90), ('간식', 90), ('급여', 90), ('거', 90), ('줘도', 90), ('될꺼요', 90), ('이마트', 90), ('구매', 90), ('코너', 90), ('사이', 90), ('있었어요', 90), ('꺼인줄', 90), ('알', 90), ('구', 90), ('먀', 90), ('아닐수도', 90), ('있다는', 90), ('들어서요', 90), ('같이', 90), ('키우고있는데', 90), ('자율', 90)] |
ko_pup = nltk.Text(tokens_ko_pup, name='강아지')
print(ko_pup.vocab().most_common(100))
[('강아지', 5394), ('가', 2523), ('를', 1479), ('...', 1044), ('.', 1044), ('이', 870), ('는', 870), ('\n', 870), ('요', 783), ('?', 783), ('에서', 696), ('..', 609), ('에', 609), ('저', 522), ('도', 522), ('은', 522), ('ㅠㅠ', 435), ('집', 435), ('너무', 435), ('꿈', 435), ('키우고', 435), ('많이', 435), ('하는', 435), ('제', 348), ('을', 348), ('엄마', 348), ('들', 348), ('때', 348), ('입니다', 348), ('뭔가', 348), ('알르레기', 261), ('법', 261), ('키울', 261), ('몇', 261), ('낑낑', 261), ('거리', 261), ('적응', 174), ('제일', 174), ('물론', 174), ('하지만', 174), ('좋아해서', 174), ('마음', 174), ('못', 174), ('털', 174), ('있거든요', 174), (',', 174), ('진짜', 174), ('싶어요', 174), ('정도', 174), ('거', 174), ('잘', 174), ('시간', 174), ('안녕하세요', 174), ('돈', 174), ('입양', 174), ('1', 174), ('저희', 174), ('2', 174), ('나이', 174), ('키우는', 174), ('있는', 174), ('세상', 174), ('의', 174), ('다른', 174), ('처음', 174), ('것', 174), ('애기', 174), ('한테', 174), ('면', 174), ('데려오는', 174), ('(', 174), ('소리', 174), ('전', 174), ('달', 174), ('아빠', 174), ('절', 174), ('장염', 174), ('약', 174), ('밥', 174), ('않', 174), ('먹고', 174), ('물', 174), ('무엇', 87), ('보다', 87), ('걸리는게', 87), ('네', 87), ('이직', 87), ('하게', 87), ('되어도', 87), ('어머니', 87), ('케어', 87), ('해', 87), ('주시긴', 87), ('워낙', 87), ('좋아하고', 87), ('두고', 87), ('떠나려니', 87), ('안좋네요', 87), ('없어도', 87), ('금방', 87)] |
4. 불용어 제거
stop_words = ['.','가','요','답변','...','을','수','에','질문','제','를','이','도',
'좋','1','는','로','으로','2','것','은','다',',','니다','대','들',
'2017','들','데','..','의','때','겠','고','게','네요','한','일','할',
'10','?','하는','06','주','려고','인데','거','좀','는데','~','ㅎㅎ',
'하나','이상','20','뭐','까','있는','잘','습니다','다면','했','주려',
'지','있','못','후','중','줄','6','과','어떤','기본','!!',
'단어','라고','중요한','합','가요','....','보이','네','무지',
'\n', '??', '안', '에서', '근데', '한테', '랑', '입니다']
tokens_ko_pup = [each_word for each_word in tokens_ko_pup
if each_word not in stop_words]
ko_pup = nltk.Text(tokens_ko_pup, name='강아지')
ko.vocab().most_common(50)
[ ('강아지', 540), ('집', 540), ('새끼', 450), ('스트레스', 450), ('애기', 360), ('상', 360), ('사료', 360), ('배', 360), ('꿈', 270), ('키우는', 270), ('마리', 270), ('알레르기', 270), ('많이', 270), ('친구', 270), ('이사', 270), ('그냥', 180), ('했는데', 180), ('생각', 180), ('각', 180), ('먹고', 180), ('많아서', 180), ('해', 180), ('닫고', 180), ('저희', 180), ('친척', 180), ('이번', 180), ('문', 180), ('아기', 180), ('부터', 180), ('음식', 180), ('가서', 180), ('계속', 180), ('말', 180), ('지금', 180), ('원래', 180), ('구조', 180), ('사람', 180), ('좋은', 90), ('건가', 90), ('귀여운', 90), ('이라고', 90), ('들어', 90), ('봤는데', 90), ('상도', 90), ('아니고', 90), ('고양', 90), ('이상은', 90), ('뭔', 90), ('뜻', 90)] |
#강아지
stop_words = ['.','가','요','답변','...','을','수','에','질문','제','를','이','도',
'좋','1','는','로','으로','2','것','은','다',',','니다','대','들',
'2017','들','데','..','의','때','겠','고','게','네요','한','일','할',
'10','?','하는','06','주','려고','인데','거','좀','는데','~','ㅎㅎ',
'하나','이상','20','뭐','까','있는','잘','습니다','다면','했','주려',
'지','있','못','후','중','줄','6','과','어떤','기본','!!',
'단어','라고','중요한','합','가요','....','보이','네','무지',
'\n', '??', '안', '에서', '근데', '한테', '랑', '입니다']
tokens_ko_pup = [each_word for each_word in tokens_ko_pup
if each_word not in stop_words]
ko = nltk.Text(tokens_ko_pup, name='강아지')
ko.vocab().most_common(50)
[('강아지', 5394), ('저', 522), ('ㅠㅠ', 435), ('집', 435), ('너무', 435), ('꿈', 435), ('키우고', 435), ('많이', 435), ('엄마', 348), ('뭔가', 348), ('알르레기', 261), ('법', 261), ('키울', 261), ('몇', 261), ('낑낑', 261), ('거리', 261), ('적응', 174), ('제일', 174), ('물론', 174), ('하지만', 174), ('좋아해서', 174), ('마음', 174), ('털', 174), ('있거든요', 174), ('진짜', 174), ('싶어요', 174), ('정도', 174), ('시간', 174), ('안녕하세요', 174), ('돈', 174), ('입양', 174), ('저희', 174), ('나이', 174), ('키우는', 174), ('세상', 174), ('다른', 174), ('처음', 174), ('애기', 174), ('면', 174), ('데려오는', 174), ('(', 174), ('소리', 174), ('전', 174), ('달', 174), ('아빠', 174), ('절', 174), ('장염', 174), ('약', 174), ('밥', 174), ('않', 174)] |
5. 단어 시각화 - 선 그래프
plt.figure(figsize=(20,10))
ko.plot(50)
plt.show()
#강아지
6. 워드 클라우드
import pytagcloud
data = ko.vocab().most_common(101)
taglist = pytagcloud.make_tags(data, maxsize=200)
for i in taglist:
if i["tag"] == '고양이':
taglist.remove(i)
#태그 클라우드 생성
pytagcloud.create_tag_image(taglist, 'wordcloud.png', size=(2000, 2000), fontname='Korean', rectangular=False)
import matplotlib.pyplot
import matplotlib.image
img = matplotlib.image.imread('wordcloud.png')
imgplot = matplotlib.pyplot.imshow(img)
matplotlib.pyplot.show()
# 강아지
7. 단어 추천
!pip install gensim
from gensim.models import word2vec
okt = Okt()
results = []
lines = present_candi_text
for line in lines:
malist = okt.pos(line, norm=True, stem=True)
r = []
#조사, 어미, 구두점을 제거하고 r에 추가
for word in malist:
if not word[1] in ["Josa", "Eomi", "Punctuation"]: #품사가 아닌 경우
r.append(word[0])
#앞뒤에 있는 좌우 공백 제거
r1 = (" ".join(r)).strip()
results.append(r1)
print(r1)
print(results)
['애기 고양이 상 좋다 건가 고양이 상 귀엽다 고양이 상 애기 고양이 상 들다 보다 그냥 고양이 상도 아니다 애기 고양 이상은 뭔 뜻', '고양이 간식 급여 이 거 고양이 주다 되다 이마트 구매 하다 고양이 강아지 코너 사이 있다 고양이 끄다 알 구 먀 하다 아니다 있다 생각 들어서다', '강아지 고양이 사료 강아지 고양이 같이 키우다 자율 급식 고양이 강아지 사료 각 각 퍼 놓다 근데 강아지 고양이 사료 먹다 고양이 강아지 사료 먹다 괜찮다', '고양이 방 집착 하다 많다 고양이 해 되다 방뮨 닫다 지내다 저희 고양이 친척 안 좋아하다 근데 친척 이번 설 고양이 되게 쌔 혼내다 많다 고양이 해 되다 방문 닫다 사용 싶다 고양이 화장실 밥 먹다 때 문 열다 닫다 하다 돼다 걱정 많다 고양이', '고양이 꿈 해몽 부탁드리다 제 방금 일어나다 고양이 꿈 생생하다 궁금하다 일단 일어나다 제 집 키우다 고양이 마당 앉다 집 들어오다 문 열다 모르다 고양이 들 .... |
['강아지 적응 ㅠㅠ 무엇 제일 걸리다 강아지 네 물론 제 이직 하다 되어다 집 어머니 케어 해 주다 하지만 강아지 워낙 저 좋아하다 저 강아지 너무 좋아하다 두다 떠나다 마음 안좋다 강아지 제 없다 금방 적응 하다 요 물론 집 강아지 엄마 간식 맛있다', '강아지 꿈 해석 해주다 강아지 들 엘베 타다 강아지 못 타다 줄이다 올라가다 강아지 매달리다 사고 있다 그걸 꾸다 사람 들 이 줄 빨리 끊다 하니 끊다 안되다 하다 강아지 높이 올라가다 수록 더 아프다 20 층 멈추다 의미 있다', '강아지 털 알르레기 없애다 법 제 강아지 털 알르레기 있다 근데 강아지 너무 키우다 강아지 너무 좋아하다 ㅠㅠ 어리다 때 강아지 너무 좋아하다 강아지 훈련사 꾸다 ㅠㅠ 진짜 강아지 넘다 키우다 싶다 ㅠㅠ 엄마 키우다 되다 강아지 알르레기 땜 ㅠㅠㅠ 내공 40', '강아지 너무 키우다 싶다 저 5-6년 정도 강아지 키우다 싶다 마음 크다 엄마 강아지 침 알레르기 좀 있다 안되다 거 같다 저 엄마 신경 쓰다 진짜 강아지 자다 키우다 자신 있다 ㅜㅠ 강아지 키우다 정말로 힘들다 그렇다 거 ..... |
# Word2Vec 적용
data_file = 'cat.data'
with open(data_file, 'w', encoding='utf-8') as fp:
fp.write("\n".join(results))
data = word2vec.LineSentence(data_file)
model = word2vec.Word2Vec(data, vector_size=200, window=10, hs=1,min_count=2, sg=1)
model.save('cat.model')
model = word2vec.Word2Vec.load("cat.model")
model.wv.most_similar(positive=['고양이'])
[('근데', 0.3730681836605072), ('좋아하다', 0.33693957328796387), ('한', 0.31936752796173096), ('기도', 0.31049662828445435), ('부다', 0.285176157951355), ('제', 0.2773987352848053), ('강아지', 0.2767084240913391), ('애기', 0.2762206494808197), ('이번', 0.2740619480609894), ('많이', 0.2703922390937805)] |
#강아지
data_file_pup = 'pup.data'
with open(data_file_pup, 'w', encoding='utf-8') as fp:
fp.write("\n".join(results_pup))
data_pup = word2vec.LineSentence(data_file_pup)
modelp = word2vec.Word2Vec(data_pup, vector_size=200, window=10, hs=1,min_count=2, sg=1)
modelp.save('pup.model')
modelp = word2vec.Word2Vec.load("pup.model")
modelp.wv.most_similar(positive=['고양이'])
[('스트레스', 0.9240872263908386), ('하다', 0.8693583607673645), ('이사', 0.8684884309768677), ('많이', 0.850583016872406), ('받다', 0.8146383166313171), ('번', 0.790684163570404), ('새끼', 0.787282407283783), ('1년', 0.7280821800231934), ('ㅍ', 0.7129629850387573), ('가게', 0.7129014134407043)] |
- 강아지 데이터에서 '고양이'를 기점으로 window=10, 앞뒤로 10개까지 연관된 단어를 찾는다.
# 고양이에서
model.wv.most_similar(positive=['강아지'])
[('각', 0.8238824605941772), ('사료', 0.821792721748352), ('자율', 0.7821705937385559), ('퍼', 0.7787206172943115), ('놓다', 0.7757903337478638), ('급식', 0.7747383713722229), ('괜찮다', 0.7555736303329468), ('같이', 0.7227309346199036), ('급여', 0.5995111465454102), ('이', 0.5719886422157288)] |
'Python' 카테고리의 다른 글
[Python] 딥러닝 _ Tensorflow (0) | 2024.03.20 |
---|---|
[Python] 연관 분석 (0) | 2024.03.18 |
[Python] 감성 분석 실습 (3) | 2024.03.14 |
[Python] 차원 축소 (0) | 2024.03.12 |
[Python] 지도학습 연습 _ 범주형 데이터 이진분류 (0) | 2024.03.07 |