본문 바로가기

나 취준생/파이썬

감정 분석 + 워드 클라우드

320x100

웹 스크롤링한 데이터를 분석하는 예시


1. 신제품이 출시되었을 때 소비자들의 반응을 살펴보고자 할 때 -> 감정 분석

2. 시기별 사회 현상을 파악하고자 할 때

3. 인공지능 상담원 ( 딥러닝 RNN )

4. 딥러닝 CNN의 신경망의 학습 자료 활용



데이터의 종류 3가지


1. 정형 데이터 : 정형화된 스키마 구조. DBMS에 저장될 수 있는 구조

예 : Oracle 테이블, MYSQL, MSSQL


2. 반정형 데이터 : 데이터 내부의 데이터 구조에 대한 메타 정보가 포함된 구조의 데이터

예 : html 문서, xml 문서


3. 비정형 데이터 : 웹스크롤링 기술로 수집해서 모은 데이터

예 : 텍스트 파일, 이미지, 동영상




1. 조선일보에서 '봉사' 키워드로 웹 스크롤링 했던 bongsa.txt 파일 확인




2. 텍스트 파일을 불러오고, 어절 별로 분리해서 리스트에 담은 뒤, 정렬하기


stev=open("c:\\data\\bongsa.txt",encoding='UTF8')

stev2=stev.read().split()

stev2.sort()

print(stev2)




3. 단어별 몇 번 나왔는지 세는 Counter 모듈 호출해서 사용하기


stev=open("c:\\data\\bongsa.txt",encoding='UTF8')

stev2=stev.read().split()

stev2.sort()


from collections import Counter

count_list=Counter(stev2)

print(count_list)




4. 가장 많이 중복된 단어 ~위까지만 검색하기 ( most_common )


stev=open("c:\\data\\bongsa.txt",encoding='UTF8')

stev2=stev.read().split()

stev2.sort()


from collections import Counter

count_list=Counter(stev2)

result=count_list.most_common(10)

print(result)




5. 위의 결과를 for 문을 이용해서 출력하기


stev=open("c:\\data\\bongsa.txt",encoding='UTF8')

stev2=stev.read().split()

stev2.sort()


from collections import Counter

count_list=Counter(stev2)

result=count_list.most_common(10)

for i in result:

    print(i[0],i[1])




6. 어제 스크롤링 했던 영화 조제 반응 txt 불러와서 해보기


stev=open("c:\\data\\joje.txt",encoding='cp949')

stev2=stev.read().split()

stev2.sort()


from collections import Counter

count_list=Counter(stev2)

result=count_list.most_common(15)

for i in result:

    print(i[0],i[1])




# 욕하는 게 다 보이는 거 같네


7. 웹스크롤링을 한 데이터로 영화 라라랜드 감정 분석 ( 긍정 단어 txt, 부정 단어 txt 활용 )


positive=open('c:\\data\\positive-words2.txt',encoding='cp949')

pos=positive.read().split('\n')

stev=open('c:\\data\\sample6_laland_review.txt',encoding='utf8')

stev2=stev.read().split()

cnt=0

for i in stev2:

    if i.lower() in pos:

        print(i.lower())

        cnt+=1

print(cnt)




긍정    /     부정




# 라라랜드 평가 게시글 txt




# 평가 점수만 출력하기


stev=open("c:\\data\\sample6_laland_review.txt",encoding='utf8')

stev2=stev.readlines()

for i in stev2:

    print(i[6:8])



# 정수형으로 변환


stev=open("c:\\data\\sample6_laland_review.txt",encoding='utf8')

stev2=stev.readlines()

for i in stev2:

    print(int(i[6:8]))


공백은 int에 들어가면 사라지니 걱정하지 않아도 된다. 오히려 좋다



# 평점 6점 이상을 준 사람들의 감상평 출력하기


stev=open("c:\\data\\sample6_laland_review.txt",encoding='utf8')

stev2=stev.readlines()

for i in stev2:

    if int(i[6:8])>=6:

        print(i)




# 6점 이상은 pos에, 5점 이하는 nag에 담기


stev=open("c:\\data\\sample6_laland_review.txt",encoding='utf8')

stev2=stev.readlines()

pos=[]

nag=[]

for i in stev2:

    if int(i[6:8])>=6:

        pos.append(i)

    else:

        nag.append(i)

print(len(pos))

print(len(nag))



# pos에 들어있는 긍정 글들을 project 폴더 내에 pos_lala.txt로 저장


stev=open("c:\\data\\sample6_laland_review.txt",encoding='utf8')

stev2=stev.readlines()

pos=[]

nag=[]

f=open('c:\\project\\pos_lala.txt','w',encoding='utf8')

for i in stev2:

    if int(i[6:8])>=6:

        pos.append(i[8:])

    else:

        nag.append(i[8:])

f.writelines(pos)

f.close()



부정글도 동일하게 nag_lala.txt에 저장했다



# 두 텍스트 글을 워드 클라우드를 통해 시각화 하기 ( 저번 내용 참조 )


stev=open("c:\\data\\sample6_laland_review.txt",encoding='utf8')

stev2=stev.readlines()

pos=[]

nag=[]

f=open('c:\\project\\pos_lala2.txt','w',encoding='utf8')

f2=open('c:\\project\\nag_lala2.txt','w',encoding='utf8')

for i in stev2:

    if int(i[6:8])>=6:

        pos.append(i[8:])

    else:

        nag.append(i[8:])

f.write(str(pos))

f.close()



# 워드 클라우드로 시각화하기


from wordcloud import WordCloud, STOPWORDS

import matplotlib.pyplot as plt  # 그래프 그리는 모듈

from os import path     #  os 에 있는 파일을 파이썬에서 인식하기 위해서

import re   #  데이터 정제를 위해서 필요한 모듈 

import numpy as np  

from PIL import Image  # 이미지 시각화를 위한 모듈 


usa_mask = np.array(Image.open("c:\\project\\usa_im.png"))

script = 'pos_lala.txt'

d = path.dirname("c:\\project\\")

text = open(path.join(d, "%s"%script), mode="r", encoding="utf8").read()

file = open('c:\\project\\word.txt', 'r', encoding = 'utf-8')

word = file.read().split(' ')

for i in word:

    text = re.sub(i,'',text)

wordcloud = WordCloud(font_path='C://Windows//Fonts//gulim', # 글씨체

stopwords=STOPWORDS,   # 마침표, 느낌표,싱글 쿼테이션 등을 정제

max_words=1000, # 워드 클라우드에 그릴 최대 단어 개수

background_color='white', # 배경색깔

max_font_size = 100, # 최대 글씨 크기 

min_font_size = 1, # 최소 글씨 

mask = usa_mask, # 배경 모양 

colormap='jet').generate(text).to_file('c:/project/cnn_cloud.png')

plt.figure(figsize=(15,15))

plt.imshow(wordcloud, interpolation='bilinear')

plt.axis("off")




부정적 반응은 표본이 적어서 아쉽다

반응형