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