728x90
반응형
In [1]:
"""
<한글 형태소 분석 라이브러리: KoNLPY>
-java 기반으로 만들어진 라이브러리 jdk설치 및 환경 설정 필요
환경 변수 등록
java_home: JDK 설치 폴더 까지
Path 수정 후 두개 추가: %JAVA_HOME%, %JAVA_HOME%\bin
-pc 재부팅 후 설정확인: command창 open후 ->java,javac 입력후 help 내용 나오면 성공
<라이브러리 설정>
nltk 설치: 영어 형태소 분석 라이브러리 KoNLPY의 상위 라이브러리이다.
pip install nltk
nltk 플러그인 추가 설치(다운로드 설치 방식)
-->> 플러그인은 최초 한번 설치하면 ,추후 다른 가상환경에서도 적용된
-->> 다른 가상환경에선 pip install nltk 라이브러리만 설치하면 됨
>python
>import nltk
>nltk.download()
>NLTK 창이 open 됨
>ALL Packages 탭 선택 > punkt 더블 클릭, stopwords 더블클릭
>exit()
워드클라우드 라이브러리 설치
pip install wordcloud
-konlpy 설치 전에 JAVA 라이브러리 인식을 위한 라이브러리 설치
pip install JPype1
pip install konlpy
-jvm.py 파일 내 별 (*)표시 삭제하기
위치 : C:\\Users\\user\\anaconda3\envs\gj_env_01\lib\site-packages\konlpy\
메모장으로 jvm.py 열기
folder_suffix[] 리스트 내에 별 * 표시 찾아서 삭제 >저장> 닫기
"""
Out[1]:
'\n<한글 형태소 분석 라이브러리: KoNLPY>\n-java 기반으로 만들어진 라이브러리 jdk설치 및 환경 설정 필요\n환경 변수 등록\njava_home: JDK 설치 폴더 까지\nPath 수정 후 두개 추가: %JAVA_HOME%, %JAVA_HOME%\x08in\n-pc 재부팅 후 설정확인: command창 open후 ->java,javac 입력후 help 내용 나오면 성공\n\n<라이브러리 설정>\nnltk 설치: 영어 형태소 분석 라이브러리 KoNLPY의 상위 라이브러리이다.\npip install nltk\n\nnltk 플러그인 추가 설치(다운로드 설치 방식)\n-->> 플러그인은 최초 한번 설치하면 ,추후 다른 가상환경에서도 적용된\n-->> 다른 가상환경에선 pip install nltk 라이브러리만 설치하면 됨\n>python\n>import nltk\n>nltk.download()\n>NLTK 창이 open 됨\n>ALL Packages 탭 선택 > punkt 더블 클릭, stopwords 더블클릭\n>exit()\n\n워드클라우드 라이브러리 설치\npip install wordcloud\n\n\n-konlpy 설치 전에 JAVA 라이브러리 인식을 위한 라이브러리 설치\npip install JPype1\npip install konlpy\n\n-jvm.py 파일 내 별 (*)표시 삭제하기\n위치 : C:\\Users\\user\\anaconda3\\envs\\gj_env_01\\lib\\site-packages\\konlpy메모장으로 jvm.py 열기\nfolder_suffix[] 리스트 내에 별 * 표시 찾아서 삭제 >저장> 닫기\n\n'
In [1]:
from konlpy.tag import Okt
In [2]:
okt=Okt()
okt
Out[2]:
<konlpy.tag._okt.Okt at 0x1bc13017a60>
영화 긍정/부정/ 리뷰데이터 빈도분석 및 워드 클라우드 시각화¶
In [8]:
### 라이브러리 정의하기
import pandas as pd
In [11]:
### 데이터셋 읽어들이기
# 데이터프레임 변수명 : df_org
df_org= pd.read_csv("./data/df_new.csv")
### 긍정 리뷰 데이터 필터링
# 데이터프레임 변수명 : pos_reviews
Out[11]:
| title | score | comment | label | |
|---|---|---|---|---|
| 0 | 서울의 봄 | 10 | 최고의 영화.. 지금 검찰 특수부 우두어너 윤두환이나 전두환 하나회나 똑같은 거... | 1 |
| 1 | 서울의 봄 | 10 | 이것이 한국의 역사.짦은 줄거리 요약하자면그땐 총칼이 대한민국을 장악했고.온갖비리와... | 1 |
| 2 | 서울의 봄 | 10 | 꼭 봐야 할 영화!!무능이 얼마나 무서운 일인지보여주는 영화!!영화 속 일은 현재도... | 1 |
| 3 | 서울의 봄 | 9 | 영화야 잘 만들었지.씁씁한 과거.빨리빨리 대한민국.용서도 왜그리 빨리하는지.아니지 ... | 1 |
| 4 | 서울의 봄 | 10 | 이건 묻고 따지지도 말고 그냥 봐야하는 영화!! | 1 |
| ... | ... | ... | ... | ... |
| 4031 | 싱글 인 서울 | 10 | 이상이배우 님 어떤모습으로 변신하실지 궁금합니다 화이팅 | 1 |
| 4032 | 싱글 인 서울 | 10 | 너무 기대됩니당!! 꺅⟩⟨ | 1 |
| 4033 | 싱글 인 서울 | 10 | 레드카펫 이후 신작 기다리다 목빠지는 줄 알았어요 기대합니다 | 1 |
| 4034 | 싱글 인 서울 | 10 | 꺅꺅 벌써부터 설레네욤 뿌잉 | 1 |
| 4035 | 싱글 인 서울 | 10 | 출연진들 완~~전 기대입니다 | 1 |
4036 rows × 4 columns
In [16]:
## 긍정 및 부정에 대해서만 각각 데이터 필터링 하기
### 긍정 리뷰 데이터 필터링
# 데이터프레임 변수명 : pos_reviews
pos_reviews=df_org[df_org["label"]==1]
pos_reviews
Out[16]:
| title | score | comment | label | |
|---|---|---|---|---|
| 0 | 서울의 봄 | 10 | 최고의 영화.. 지금 검찰 특수부 우두어너 윤두환이나 전두환 하나회나 똑같은 거... | 1 |
| 1 | 서울의 봄 | 10 | 이것이 한국의 역사.짦은 줄거리 요약하자면그땐 총칼이 대한민국을 장악했고.온갖비리와... | 1 |
| 2 | 서울의 봄 | 10 | 꼭 봐야 할 영화!!무능이 얼마나 무서운 일인지보여주는 영화!!영화 속 일은 현재도... | 1 |
| 3 | 서울의 봄 | 9 | 영화야 잘 만들었지.씁씁한 과거.빨리빨리 대한민국.용서도 왜그리 빨리하는지.아니지 ... | 1 |
| 4 | 서울의 봄 | 10 | 이건 묻고 따지지도 말고 그냥 봐야하는 영화!! | 1 |
| ... | ... | ... | ... | ... |
| 4031 | 싱글 인 서울 | 10 | 이상이배우 님 어떤모습으로 변신하실지 궁금합니다 화이팅 | 1 |
| 4032 | 싱글 인 서울 | 10 | 너무 기대됩니당!! 꺅⟩⟨ | 1 |
| 4033 | 싱글 인 서울 | 10 | 레드카펫 이후 신작 기다리다 목빠지는 줄 알았어요 기대합니다 | 1 |
| 4034 | 싱글 인 서울 | 10 | 꺅꺅 벌써부터 설레네욤 뿌잉 | 1 |
| 4035 | 싱글 인 서울 | 10 | 출연진들 완~~전 기대입니다 | 1 |
3226 rows × 4 columns
In [19]:
### 부정 리뷰 데이터 필터링
# 데이터프레임 변수명 : neg_reviews
neg_reviews=df_org[df_org["label"]==0]
리뷰 데이터 전처리¶
In [20]:
### 긍정 및 부정 리뷰 데이터에서 한글 이외 모두 제거하기
### 정규 표현식 라이브러리 활용
import re
In [27]:
# 긍정 리뷰에서 한글 이외 모두 제거 처리하기
pos_reviews.loc[:,"comment"] =[re.sub(r"[^ㄱ-ㅣ가-힣+]"," ", data) for data in pos_reviews['comment']]
pos_reviews
Out[27]:
| title | score | comment | label | |
|---|---|---|---|---|
| 0 | 서울의 봄 | 10 | 최고의 영화 지금 검찰 특수부 우두어너 윤두환이나 전두환 하나회나 똑같은 거... | 1 |
| 1 | 서울의 봄 | 10 | 이것이 한국의 역사 짦은 줄거리 요약하자면그땐 총칼이 대한민국을 장악했고 온갖비리와... | 1 |
| 2 | 서울의 봄 | 10 | 꼭 봐야 할 영화 무능이 얼마나 무서운 일인지보여주는 영화 영화 속 일은 현재도... | 1 |
| 3 | 서울의 봄 | 9 | 영화야 잘 만들었지 씁씁한 과거 빨리빨리 대한민국 용서도 왜그리 빨리하는지 아니지 ... | 1 |
| 4 | 서울의 봄 | 10 | 이건 묻고 따지지도 말고 그냥 봐야하는 영화 | 1 |
| ... | ... | ... | ... | ... |
| 4031 | 싱글 인 서울 | 10 | 이상이배우 님 어떤모습으로 변신하실지 궁금합니다 화이팅 | 1 |
| 4032 | 싱글 인 서울 | 10 | 너무 기대됩니당 꺅 | 1 |
| 4033 | 싱글 인 서울 | 10 | 레드카펫 이후 신작 기다리다 목빠지는 줄 알았어요 기대합니다 | 1 |
| 4034 | 싱글 인 서울 | 10 | 꺅꺅 벌써부터 설레네욤 뿌잉 | 1 |
| 4035 | 싱글 인 서울 | 10 | 출연진들 완 전 기대입니다 | 1 |
3226 rows × 4 columns
In [28]:
# 부정 리뷰에서 한글 이외 모두 제거 처리하기
neg_reviews.loc[:,"comment"] =[re.sub(r"[^ㄱ-ㅣ가-힣+]"," ", data) for data in neg_reviews['comment']]
neg_reviews
Out[28]:
| title | score | comment | label | |
|---|---|---|---|---|
| 69 | 서울의 봄 | 4 | 다 아는 얘기 똑같은 얘기의 반복 명령만 하다 끝나는 영화 | 0 |
| 70 | 서울의 봄 | 1 | 정치적 의도가 빤히 보이는 영화 보고나니 더 확실히 알겠네요 | 0 |
| 72 | 서울의 봄 | 1 | 보지맙시다 정치색이 너무 보여요 | 0 |
| 75 | 서울의 봄 | 1 | 역사왜곡 거지발싸기 북한이 만든 영화 빵점 | 0 |
| 128 | 서울의 봄 | 1 | 여기 죄파들 세상이군이거 완전 구라영화 | 0 |
| ... | ... | ... | ... | ... |
| 3998 | 싱글 인 서울 | 1 | 이러니 이 나라 출산율이 바닥이지ㅋㅋㅋㅋ | 0 |
| 4001 | 싱글 인 서울 | 2 | 오늘 봤음이동욱님 연기어색이상이님 훨씬 연기 잘하고임수정님 왜 이영화 선택을 ㅡ ㅡ아쉽닺 | 0 |
| 4009 | 싱글 인 서울 | 1 | 뻔한 대사와 설정지루한 연출과 스토리 게다가싱글인 서울의 봄으로 홍보 생각했다는파렴... | 0 |
| 4014 | 싱글 인 서울 | 1 | 핵노잼이겠다 누가 이런 영화 좋아하겠냐 이건 흥행 못 한다 나폴레옹한테 짓 밟히게 ... | 0 |
| 4021 | 싱글 인 서울 | 1 | 나 혼자는 싫어 외치면서 혼자서 섬만 타는 수동적인 그녀는 매일 창문 너머 어... | 0 |
568 rows × 4 columns
긍정 및 부정 리뷰 형태소 추출하기¶
In [30]:
# 형태소 분석 라이브러리
# jpype : java 라이브러리를 python에서 사용할 수 있도록 도와주는 라이브러리
# konlpy 는 java로 만들어진 라이브러리
import jpype
# Okt: 한국어 형태소 분석 라이브러리
# Okt(open korean text) 대표적 한글 형태소 분석기
from konlpy.tag import Okt
In [31]:
### 형태소 분석기 객체 생성하기
okt = Okt()
okt
Out[31]:
<konlpy.tag._okt.Okt at 0x1bc56dc6520>
In [37]:
### 긍정 리뷰 데이터에서 -> 명사 추출하기
# 명사만 담을 리스트 변수선언
pos_comment_nouns =[]
for cmt in pos_reviews["comment"]:
# print(okt.nouns(cmt))
pos_comment_nouns.extend(okt.nouns(cmt))
pos_comment_nouns
Out[37]:
['최고',
'영화',
'지금',
'검찰',
'특수',
'부',
'우두',
....]
In [38]:
### 부정 리뷰 데이터에서 -> 명사 추출하기
# 명사만 담을 리스트 변수선언
neg_comment_nouns =[]
for cmt in neg_reviews["comment"]:
# print(okt.nouns(cmt))
neg_comment_nouns.extend(okt.nouns(cmt))
neg_comment_nouns
Out[38]:
['얘기',
'얘기',
'반복',
'명령',
'영화',
'정치',
'의도',
'영화',
'더',
'생각',
'그',
'동안',
'그',
'작품',
'온',
'것',
'스토리',
'그',
'바탕',
'평화',
'주의',
'환경',
'대한',
'사랑',
'때문',
'젠',
'스토리',
'아무',
'설명',
'작품',
'은퇴',
'것',
'스토리',
'뭔가',
'흐름',
'평',
'의미',
'부여',
'완전',
'실망',
'은근',
'제국주의',
'시대',
'동경',
'미화',
'듯',
'기분',
'영화',
'왜',
'만화',
'이건',
'재미',
'관객',
'생각',
'하나',
'안',
'영화',
'재미',
'거리',
'영화',
'볼',
'선택',
'영화',
'시간',
...]
긍정 및 부정 리뷰 데이터에서 한자리 글자는 모두 제외시키기¶
In [48]:
# 긍정 리뷰 명사 데이터에서 1글자 모두 제외하기
# neg_reviews2 = neg_comment_nouns.copy()
# for data in neg_comment_nouns:
# if len(data)==1:
# neg_reviews2.remove(data)
pos_comment_nouns2 = [w for w in pos_comment_nouns if len(w) >1 ]
pos_comment_nouns2
neg_comment_nouns2 = [w for w in neg_comment_nouns if len(w) >1 ]
neg_comment_nouns2
Out[48]:
['얘기',
'얘기',
'똑땅함',
'스트레스',
'최고',
'영화',
'지금',
'현재',
'진행형',
'그땐',
'신군부',
'지금',
'검찰',
'세력',
'언론',
'찬탈',
'모습',
'화가',
'서울',
'눈물',
'펑펑',
'진짜',
'나라',
'생각',
'사람',
'모습',
'상당',
'부분',
'사실',
'극단',
'왜곡',
'영화',
'극적',
'부분',
'이해',
'허구',
'사실',
'감독',
'다음',
'검찰',
'카르텔',
'적발',
'영화',
'영화',
'시간',
'십분',
...]
긍정 및 부정 명사들의 빈도 분석¶
In [49]:
### 긍정 리뷰 명사들에 대한 워드카운트
from collections import Counter
In [53]:
### 긍정 명상 워드카운트 처리
pos_word_count = Counter(pos_comment_nouns2)
print (pos_word_count)
Counter({'영화': 1431,........ 뿌잉': 1})
In [54]:
### 부정 명사 워드 카운터 처리
neg_word_count = Counter(neg_comment_nouns2)
print (neg_word_count)
Counter({'영화': 212, '마블': 68, '작품': 48, '사람': 48, '내용': 42,...})
In [74]:
### 긍정 워드 카운트 상위 20 개 단어 추출
# count()에서 지원하는 함수 중에 내림차순 함수 : most_common(20)
#- > 내림 차순 후에 상위 20개 추출하는 함수임
pos_top_20 = dict(pos_word_count.most_common(20))
neg_top_20={k:v for k, v in neg_word_count.most_common(20)}
neg_top_20
Out[74]:
{'영화': 212,
'마블': 68,
'작품': 48,
'사람': 48,
'내용': 42,
'감독': 41,
'스토리': 36,
'시간': 35,
'그냥': 33,
'진짜': 29,
'보고': 29,
'재미': 28,
'배우': 26,
'생각': 25,
'평점': 23,
'이해': 22,
'연기': 20,
'장면': 20,
'이제': 19,
'일본': 18}
긍정 및 부정 상위 20개 명사에 대한 빈도 시각화¶
In [76]:
### 시각화 라이브러리
import matplotlib.pyplot as plt
## 폰트 설정 라이브러리
from matplotlib import font_manager, rc
## 폰트설정
plt.rc("font", family="Malgun Gothic")
### 마이너스 기호 설정
plt.rcParams["axes.unicode_minus"] = False
In [84]:
### 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize = (10,15))
#### 제목 넣기
plt.title(f"긍정 리뷰의 단어 상위 (20)개 빈도 시각화", fontsize=17)
### 막대 그래프 그리기
for key, value in pos_top_20.items():
# 영화라는 단어는 의미가 없을 것으로 여겨짐
if key == "영화":
continue
plt.bar(key, value, color="lightgrey")
### x축과 y축에 제목넣기
plt.xlabel("리뷰명사")
plt.ylabel("빈도(count)")
### x축 각도
plt.xticks(rotation=70)
plt.show()
In [85]:
### 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize = (10,15))
#### 제목 넣기
plt.title(f"부정 리뷰의 단어 상위 (20)개 빈도 시각화", fontsize=17)
### 막대 그래프 그리기
for key, value in neg_top_20.items():
# 영화라는 단어는 의미가 없을 것으로 여겨짐
if key == "영화":
continue
plt.bar(key, value, color="lightgrey")
### x축과 y축에 제목넣기
plt.xlabel("리뷰명사")
plt.ylabel("빈도(count)")
### x축 각도
plt.xticks(rotation=70)
plt.show()
긍정 및 부정 리뷰 단어 워드 클라우드 시각화¶
In [117]:
### 워드 클라우드 라이브러리
from wordcloud import WordCloud
In [122]:
### 긍정 리뷰 단어 워드 클라우드 시각화
plt.figure(figsize=(8,8,))
#그래프 제목
plt.title("[긍정] 리뷰 단어 워드 클라우드 시각화")
### 사용할 폰트 파일 지정하기
font_path ="C:/Windows/Fonts/malgunsl.ttf"
# WordCloud 객체 생성
# 워크 클라우드 그래프 속성 설정
wc = WordCloud(
##폰트지정
font_path= font_path,
#배경색 지정
background_color="black",
## 그래프 너비
width=800,
# 그래프 높이
height=800
)
#워드 클라우드 그래프에 데이터 넣기
# generate_from_frequencies > 워드 클라우드 이미지로 반환해줌
# cloud = wc.generate_from_frequencies(pos_top_20)
cloud = wc.generate_from_frequencies(pos_word_count)
###워드클라우드 이미지 보여주기
plt.imshow(cloud)
plt.axis("off")
plt.savefig("./img/긍정_리뷰_단어_워드클라우드_시각화.png")
plt.show()
In [ ]:
728x90
반응형
'파이썬' 카테고리의 다른 글
| 머신러닝 기초 (3) | 2023.12.19 |
|---|---|
| 데이터프레임_정리 (3) | 2023.12.05 |
| 원형 그래프 그리기 (1) | 2023.12.05 |
| 수집한 영화 데이터 전처리 및 시각화 (5) | 2023.12.04 |
| 영화 데이터 수집 웹 크롤링 (2) | 2023.12.04 |