In [ ]:
"""
<한글 형태소 분석 라이브러리 : 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 창이 Open됨
> All Packages 탭 선택 > punkt 더블클릭 혹은 엔터 , stopwords 더블클릭
> exit()
- 워드클라우드 설치
> pip install wordcloud
- Konlpy 설치 전에 파이썬에서 JAVA 라이브러리 인식을 위한 라이브러리 설치
> pip install JPype1 (끝에는 숫자 1)
> pip install konlpy
- JVM.PY 파일 내에 별표시(*) 삭제하기
* 위치 : C:/Users/user/anaconda3/env/gj_env_01/Lib/site-packages/konlpy/
* 메모장으로 jvm.py 열기
* folder_suffix[] 리스트 내에 별(*) 표시 찾아서 삭제 > 저장 > 닫기
"""
In [1]:
from konlpy.tag import Okt
In [2]:
okt = Okt()
okt
Out[2]:
<konlpy.tag._okt.Okt at 0x2928d725760>
In [4]:
okt.nouns("안녕 하세요 파이썬 입니다. 안녕")
Out[4]:
['안녕', '파이썬', '안녕']
영화 긍정/부정 리뷰데이터 빈도 분석 및 워드클라우드 시각화¶
In [5]:
### 라이브러리 정의하기
import pandas as pd
In [7]:
### 데이터셋 읽어들이기
# 데이터프레임 변수명 : df_org
df_org = pd.read_csv("./data/df_new.csv")
df_org
Out[7]:
title | score | comment | label | |
---|---|---|---|---|
0 | 서울의 봄 | 10 | 꼭 봐야 할 영화!!무능이 얼마나 무서운 일인지보여주는 영화!!영화 속 일은 현재도... | 1 |
1 | 서울의 봄 | 9 | 영화야 잘 만들었지.씁씁한 과거.빨리빨리 대한민국.용서도 왜그리 빨리하는지.아니지 ... | 1 |
2 | 서울의 봄 | 10 | 이건 묻고 따지지도 말고 그냥 봐야하는 영화!! | 1 |
3 | 서울의 봄 | 10 | 기대하지 않고 들어갔는데, 아주 감동하고 돌아왔어요. 안타깝고 분노하게 되고, 저때... | 1 |
4 | 서울의 봄 | 10 | ㄱ ㅐ딸 광신도들과 독재권력 추종자들이 보고 반성해야할영화 | 1 |
... | ... | ... | ... | ... |
4028 | 싱글 인 서울 | 10 | 이상이배우 님 어떤모습으로 변신하실지 궁금합니다 화이팅 | 1 |
4029 | 싱글 인 서울 | 10 | 너무 기대됩니당!! 꺅⟩⟨ | 1 |
4030 | 싱글 인 서울 | 10 | 레드카펫 이후 신작 기다리다 목빠지는 줄 알았어요 기대합니다 | 1 |
4031 | 싱글 인 서울 | 10 | 꺅꺅 벌써부터 설레네욤 뿌잉 | 1 |
4032 | 싱글 인 서울 | 10 | 출연진들 완~~전 기대입니다 | 1 |
4033 rows × 4 columns
긍정 및 부정에 대해서만 각각 데이터 필터링하기¶
In [8]:
### 긍정 리뷰 데이터 필터링
# - 데이터프레임 변수명 : pos_reviews
In [13]:
pos_reviews = df_org[df_org["label"]==1]
pos_reviews
Out[13]:
title | score | comment | label | |
---|---|---|---|---|
0 | 서울의 봄 | 10 | 꼭 봐야 할 영화!!무능이 얼마나 무서운 일인지보여주는 영화!!영화 속 일은 현재도... | 1 |
1 | 서울의 봄 | 9 | 영화야 잘 만들었지.씁씁한 과거.빨리빨리 대한민국.용서도 왜그리 빨리하는지.아니지 ... | 1 |
2 | 서울의 봄 | 10 | 이건 묻고 따지지도 말고 그냥 봐야하는 영화!! | 1 |
3 | 서울의 봄 | 10 | 기대하지 않고 들어갔는데, 아주 감동하고 돌아왔어요. 안타깝고 분노하게 되고, 저때... | 1 |
4 | 서울의 봄 | 10 | ㄱ ㅐ딸 광신도들과 독재권력 추종자들이 보고 반성해야할영화 | 1 |
... | ... | ... | ... | ... |
4028 | 싱글 인 서울 | 10 | 이상이배우 님 어떤모습으로 변신하실지 궁금합니다 화이팅 | 1 |
4029 | 싱글 인 서울 | 10 | 너무 기대됩니당!! 꺅⟩⟨ | 1 |
4030 | 싱글 인 서울 | 10 | 레드카펫 이후 신작 기다리다 목빠지는 줄 알았어요 기대합니다 | 1 |
4031 | 싱글 인 서울 | 10 | 꺅꺅 벌써부터 설레네욤 뿌잉 | 1 |
4032 | 싱글 인 서울 | 10 | 출연진들 완~~전 기대입니다 | 1 |
3224 rows × 4 columns
In [12]:
pos_reviews.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4034 entries, 0 to 4033
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 1 4034 non-null object
dtypes: object(1)
memory usage: 31.6+ KB
In [14]:
### 부정 리뷰 데이터 필터링
# - 데이터프레임 변수명 : neg_reviews
neg_reviews = df_org[df_org["label"]==0]
neg_reviews
Out[14]:
title | score | comment | label | |
---|---|---|---|---|
67 | 서울의 봄 | 4 | 다 아는 얘기. 똑같은 얘기의 반복. 명령만 하다 끝나는 영화. | 0 |
68 | 서울의 봄 | 1 | 정치적 의도가 빤히 보이는 영화.보고나니 더 확실히 알겠네요. | 0 |
70 | 서울의 봄 | 1 | 보지맙시다 정치색이 너무 보여요 | 0 |
73 | 서울의 봄 | 1 | 역사왜곡 거지발싸기 북한이 만든 영화 빵점 | 0 |
126 | 서울의 봄 | 1 | 여기 죄파들 세상이군이거 완전 구라영화 | 0 |
... | ... | ... | ... | ... |
3995 | 싱글 인 서울 | 1 | 이러니 이 나라 출산율이 바닥이지ㅋㅋㅋㅋ | 0 |
3998 | 싱글 인 서울 | 2 | 오늘 봤음이동욱님 연기어색이상이님 훨씬 연기 잘하고임수정님 왜.이영화 선택을 ㅡ ㅡ아쉽닺 | 0 |
4006 | 싱글 인 서울 | 1 | 뻔한 대사와 설정지루한 연출과 스토리.게다가싱글인 서울의 봄으로 홍보 생각했다는파렴... | 0 |
4011 | 싱글 인 서울 | 1 | 핵노잼이겠다 누가 이런 영화 좋아하겠냐 이건 흥행 못 한다 나폴레옹한테 짓 밟히게 ... | 0 |
4018 | 싱글 인 서울 | 1 | 나 혼자는 싫어.. 외치면서 혼자서 섬만 타는, 수동적인 그녀는 매일 창문 너머 어... | 0 |
568 rows × 4 columns
리뷰 데이터 전처리¶
In [15]:
### 긍정 및 부정 리뷰 데이터에서 한글 이외 모두 제거하기
In [16]:
### 정규표현식 라이브러리 활용
import re
In [18]:
### 긍정 리뷰에서 한글 이외 모두 제거 처리하기
pos_reviews.loc[: , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]"," ", data) for data in pos_reviews["comment"]]
pos_reviews
Out[18]:
title | score | comment | label | |
---|---|---|---|---|
0 | 서울의 봄 | 10 | 꼭 봐야 할 영화 무능이 얼마나 무서운 일인지보여주는 영화 영화 속 일은 현재도... | 1 |
1 | 서울의 봄 | 9 | 영화야 잘 만들었지 씁씁한 과거 빨리빨리 대한민국 용서도 왜그리 빨리하는지 아니지 ... | 1 |
2 | 서울의 봄 | 10 | 이건 묻고 따지지도 말고 그냥 봐야하는 영화 | 1 |
3 | 서울의 봄 | 10 | 기대하지 않고 들어갔는데 아주 감동하고 돌아왔어요 안타깝고 분노하게 되고 저때... | 1 |
4 | 서울의 봄 | 10 | ㄱ ㅐ딸 광신도들과 독재권력 추종자들이 보고 반성해야할영화 | 1 |
... | ... | ... | ... | ... |
4028 | 싱글 인 서울 | 10 | 이상이배우 님 어떤모습으로 변신하실지 궁금합니다 화이팅 | 1 |
4029 | 싱글 인 서울 | 10 | 너무 기대됩니당 꺅 | 1 |
4030 | 싱글 인 서울 | 10 | 레드카펫 이후 신작 기다리다 목빠지는 줄 알았어요 기대합니다 | 1 |
4031 | 싱글 인 서울 | 10 | 꺅꺅 벌써부터 설레네욤 뿌잉 | 1 |
4032 | 싱글 인 서울 | 10 | 출연진들 완 전 기대입니다 | 1 |
3224 rows × 4 columns
In [19]:
### 부정 리뷰에서 한글 이외 모두 제거 처리하기
neg_reviews.loc[: , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]"," ", data) for data in neg_reviews["comment"]]
neg_reviews
Out[19]:
title | score | comment | label | |
---|---|---|---|---|
67 | 서울의 봄 | 4 | 다 아는 얘기 똑같은 얘기의 반복 명령만 하다 끝나는 영화 | 0 |
68 | 서울의 봄 | 1 | 정치적 의도가 빤히 보이는 영화 보고나니 더 확실히 알겠네요 | 0 |
70 | 서울의 봄 | 1 | 보지맙시다 정치색이 너무 보여요 | 0 |
73 | 서울의 봄 | 1 | 역사왜곡 거지발싸기 북한이 만든 영화 빵점 | 0 |
126 | 서울의 봄 | 1 | 여기 죄파들 세상이군이거 완전 구라영화 | 0 |
... | ... | ... | ... | ... |
3995 | 싱글 인 서울 | 1 | 이러니 이 나라 출산율이 바닥이지ㅋㅋㅋㅋ | 0 |
3998 | 싱글 인 서울 | 2 | 오늘 봤음이동욱님 연기어색이상이님 훨씬 연기 잘하고임수정님 왜 이영화 선택을 ㅡ ㅡ아쉽닺 | 0 |
4006 | 싱글 인 서울 | 1 | 뻔한 대사와 설정지루한 연출과 스토리 게다가싱글인 서울의 봄으로 홍보 생각했다는파렴... | 0 |
4011 | 싱글 인 서울 | 1 | 핵노잼이겠다 누가 이런 영화 좋아하겠냐 이건 흥행 못 한다 나폴레옹한테 짓 밟히게 ... | 0 |
4018 | 싱글 인 서울 | 1 | 나 혼자는 싫어 외치면서 혼자서 섬만 타는 수동적인 그녀는 매일 창문 너머 어... | 0 |
568 rows × 4 columns
긍정 및 부정 리뷰 형태소 추출하기¶
In [21]:
### 형태소 분석 라이브러리
# jpype : java 라이브러리를 python에서 사용할 수 있도록 도와주는 라이브러리
# - konlpy는 java로 만들어진 라이브러리
import jpype
# Okt : 한국어 형태소 분석 라이브러리
# - Okt(Open Korean Text) : 대표적 한글 형태소 분석기
from konlpy.tag import Okt
In [22]:
### 형태소 분석기 객체 생성하기
okt = Okt()
okt
Out[22]:
<konlpy.tag._okt.Okt at 0x292ce4bd0a0>
In [28]:
### 긍정 리뷰 데이터에서 --> 명사 추출하기
pos_comment_nouns = []
for cmt in pos_reviews["comment"]:
# print(okt.nouns(cmt))
pos_comment_nouns.extend(okt.nouns(cmt))
print(pos_comment_nouns)
['꼭', '영화', '무능', '얼마나', '인지', '영화', '영화', '속', '일', '현재', '진행중', '영화', '과거', '대한민국', '용서', '왜', '용서', '처벌', '친일', '쿠테타', '모두', '이건', '그냥', '영화', '아주', '감동', '때', '선택', '순간', '어찌', '반성', '아마', '타협', '거', '작품', '딸', '광신도', '독재', '권력', '추종자', '보고', '반성', '영화', '한번', '더', '연말', '이순신', '이태', '신', '가명', '원조', '듯', '이태', '신', '광화문', '때', '위', '이순신장군', '동상', '의', '노량해전', '영화', '값', '댓글', '무수', '김영삼', '욕', '분', '그', '김영삼', '비록', '전두환', '군부', '당시', '민주', '정의당', '전두환', '돈', '갈취', '관제', '여당', '지금', '국민', '힘', '지속', '야합', '대통령', '광석', '하나회', '척결', '전두환', '노태우', '체포', '국가',
------------------------------- 생략 -------------------
정', '드하', '은', '흠', '요즘', '편집자', '머리', '느낌', '문학', '표현', '이상', '이미도', '또', '그', '여직원', '연기', '영화', '재미', '살림', '이상', '굿', '보기', '마음', '보기', '경험', '다른', '기억', '오늘', '내', '감정', '정이', '거거', '박', '범수', '감독', '영화', '기원', '이동욱', '얼마', '영화', '임', '스크린', '벌써', '얼른', '개봉', '진짜', '영화', '온', '인', '개봉', '누', '건축학개론', '데', '벌써', '존잼각', '두', '배우', '움', '겨울', '털실', '설레임', '영화', '기대', '연말', '볼', '한국영', '화가', '극장', '이동욱', '임수정', '로코', '정석', '기대', '검블유', '세계관', '확장', '벌써', '이동', '농', '얼굴', '스크린', '얼굴', '조합', '극락', '걸', '극장', '화면', '개봉일', '누', '싱글', '두', '남녀', '서울', '연애', '그린', '한국', '영화', '매력', '이소영', '욤', '임수정', '로맨스', '장르', '검색어', '입력', '거기', '임수정', '배우', '이', '영화', '관련', '케릭', '터', '이동욱', '배우', '구미호', '이제', '도시', '정착', '건강', '앜', '장난', '기대', '출연', '잔', '분', '영화', '개봉', '그때', '바로', '무조건', '이동욱', '임수정', '배우', '연기', '이건', '정말', '꼭', '꼭', '욱', '배우', '임수정', '배우', '화이팅', '얼른', '이상', '배우', '모습', '변신', '화이팅', '기대', '레드카펫', '이후', '신작', '목', '줄', '벌써', '욤', '뿌잉', '출연', '진', '완', '전', '기대']
In [29]:
### 부정 리뷰 데이터에서 --> 명사 추출하기
neg_comment_nouns = []
for cmt in neg_reviews["comment"]:
# print(okt.nouns(cmt))
neg_comment_nouns.extend(okt.nouns(cmt))
print(neg_comment_nouns)
['얘기', '얘기', '반복', '명령', '영화', '정치', '의도', '영화', '더', '보지맙시', '정치', '색', '역사왜곡', '거지', '발', '북한', '영화', '빵점', '여기', '죄파', '상이', '거', '완전', '구라', '영화', '걸', '역시', '개딸', '영화', '우성', '또', '또', '정지', '따위', '발암', '질', '역할', '우성', '특허', '잔', '자기', '신념', '정의', '척', '역사', '진전', '발', '암', '물', '질', '정말', '케릭', '극악', '무도', '일당', '역사', '껍데기', '영화', '진실', '모서리', '수', '영화', '팝콘', '줌', '그대로', '영화', '영화', '그', '현재', '지옥', '정우성', '김성균', '가장', '이유', '뭘', '정말', '작품', '알', '결말', '임', '불구', '영화상', '내내', '긴장', '강추', '내생', '최고', '영화', '울', '말', '최고', '영화', '광', '부인', '씬', '관객', '빵', '싱크로', '율', '장난', '절대', '영화', '고구마', '개', '스트레', '적', '몰랏던', '부분', '감', '똑땅함', '열', '스트레스', '땅', '최고', '영화', '지금', '현재', '진행형', '그땐', '신군부', '지금', '검찰', '세력', '언론', '찬탈', '모습', '화가', '서울', '봄', '때', '눈물', '펑펑', '진짜', '나라', '생각', '사람', '모습', '상당', '부분', '사실', '극단', '왜곡', '영화', '극적', '부분', '이해', '허구', '사실', '감독', '다음', '검찰', '카르텔', '적발', '영화', '꼭', '영화', '시간', '십분', '짜임새', '구성', '배우', '연기력', '만', '깊이', '몰
------------- 생략 -------------------
점', '댓글', '동원', '배우', '팬', '응원', '점', '평점', '댓글', '영화', '평점', '괴담', '영화', '퍼센트', '결말', '마지막', '편의점', '스토리', '한다인', '연기', '점', '평점', '점', '렷', '평', '주기', '반도', '안보', '영화', '처음', '소재', '연기', '스토리', '연출', '몰입', '음악', '처음', '틈', '긴장', '감속', '모든', '터', '배우', '연기', '한번', '케', '승진', '신', '실감', '깜짝', '최지우', '반전', '연기', '이유', '미씨', '데', '개성', '강', '한역', '번역', '진짜', '각심', '생각', '항상', '주위', '살피', '역시', '정범', '감독', '지금', '현실', '일', '결코', '현실', '모습', '각심', '드네', '뜻', '영화', '세상', '공포', '내내', '살인', '영화', '무슨', '영화', '혼자', '사람', '조심', '건가', '최지우', '사람', '이유', '몬데', '마지막', '파트', '편의점', '알바로', '여배우', '연기', '인상', '몰입도', '여운', '영화', '한번', '더', '생각', '강력', '추천', '정동원', '배우', '연기력', '현실', '일', '한번', '더', '각심', '일', '영화', '에피소드', '하나로', '응집', '각각', '최지우', '행동', '개연', '성도', '이문식', '장면', '사도', '정동원', '이야기', '설명', '다만', '처음', '배우', '매력', '이군', '배우', '연기', '전혀', '생각', '못', '충격', '전개', '집중', '봄', '대안', '봣', '우왕', '박', '칭찬', '해웰', '메이드', '프랑스', '영화', '재탕', '고민', '추천', '거', '예전', '일본', '단편', '공포영화', '카피', '스토리', '기대', '포스터', '놈', '디자인', '스릴러', '하나', '안', '건', '뭐', '캐스팅', '조합', '몰입', '방금', '보고', '클레멘타인', '명작', '생각', '듭니', '유기', '옴니버스', '구성', '떡밥', '여기', '회수', '감탄사', '클레멘타인', '저', '정동원', '응원', '동원', '노래', '가수', '팬', '화평', '왜', '감독', '초보', '티', '확', '배우', '개연', '부족', '왜', '갑자기', '키스', '뭘', '영호', '서울', '싱글', '생활', '사람', '얼마나', '스토리', '별로', '공감', '설정', '진짜', '예고편', '진짜', '연말', '속지', '나', '존', '나', '누구', '멍', '장식', '크리스마스', '트리', '밑', '포장', '박스', '선물', '진짜', '줄', '알', '덥석', '장식', '용', '박스', '는걸', '알', '때', '개봉', '영화', '모두', '편', '나', '영화', '스텝', '진', '생각', '점', '후', '작성', '편이', '최악', '영화', '별', '점', '오늘', '서울', '인', '싱글', '최저', '점', '갱신', '심야', '간반', '영화', '보지', '영화', '관람', '사상', '처음', '졸', '스토리', '전개', '지장', '방금', '보고', '분', '중', '시간', '이', '나라', '출산율', '바닥', '오늘', '이동욱', '어색', '상이', '연기', '임수정', '왜', '이영화', '선택', '아쉽닺', '대사', '설정', '연출', '스토리', '게다가', '싱글', '서울', '봄', '홍보', '생각', '헛소리', '마구', '감독', '남', '것', '제', '자인', '건가', '핵', '노잼', '누가', '영화', '이건', '흥행', '못', '나폴레옹', '짓', '이', '영화', '망작', '한국영', '영화', '이제', '멜로', '코미디', '드라마', '경찰', '영화', '조폭', '영화', '할리우드', '못', '할리우드', '절대', '못', '접', '화일', '것', '나', '혼자', '혼자', '섬', '수동', '그녀', '매일', '창문', '너머', '그', '매일', '그대', '노래', '번', '곡', '그', '날', '갑자기', '나', '사람', '나', '싱글', '답', '라며', '도시', '싱글', '인', '서울', '이', '두', '남녀', '가장', '숙제']
긍정 및 부정 리뷰 데이터에서 1글자는 모두 제외 시키기¶
In [30]:
### 긍정 리뷰 데이터에서 1글자 모두 제외하기
pos_comment_nouns2 = [w for w in pos_comment_nouns if len(w) > 1]
print(pos_comment_nouns2)
['영화', '무능', '얼마나', '인지', '영화', '영화', '현재', '진행중', '영화', '과거', '대한민국', '용서', '용서', '처벌', '친일', '쿠테타', '모두', '이건', '그냥', '영화', '아주', '감동', '선택', '순간', '어찌', '반성', '아마', '타협', '작품', '광신도', '독재', '권력', '추종자', '보고', '반성', '영화', '한번', '연말', '이순신', '이태', '가명', '원조', '이태', '광화문', '이순신장군', '동상', '노량해전', '영화', '댓글', '무수', '김영삼', '김영삼', '비록', '전두환', '군부', '당시', '민주', '정의당', '전두환', '갈취', '관제', '여당', '지금', '국민', '지속', '야합', '대통령', '광석', '하나회', '척결', '전두환', '노태우', '체포', '국가', '반역죄', '재판', '김영삼', '전두환', '면복', '김대중', '시인', '용서', '혼자', '쑈잉', '정치', '득표율', '거꾸로', '맙시', '비록', '김영삼', '가지', '결단', '시대', '지나', '세대', '재미', '영화', '흥미', '어디', '대가리', '짜증', '요즘', '윤석열', '특수', '검사', '짓거리', '이해', '최고', '영화', '결말', '서울', '시대', '관통', '후반', '나이', '영화', '내내', '긴장감', '엔딩크레딧',
------- 생략 ----------------
'이미도', '여직원', '연기', '영화', '재미', '살림', '이상', '보기', '마음', '보기', '경험', '다른', '기억', '오늘', '감정', '정이', '거거', '범수', '감독', '영화', '기원', '이동욱', '얼마', '영화', '스크린', '벌써', '얼른', '개봉', '진짜', '영화', '개봉', '건축학개론', '벌써', '존잼각', '배우', '겨울', '털실', '설레임', '영화', '기대', '연말', '한국영', '화가', '극장', '이동욱', '임수정', '로코', '정석', '기대', '검블유', '세계관', '확장', '벌써', '이동', '얼굴', '스크린', '얼굴', '조합', '극락', '극장', '화면', '개봉일', '싱글', '남녀', '서울', '연애', '그린', '한국', '영화', '매력', '이소영', '임수정', '로맨스', '장르', '검색어', '입력', '거기', '임수정', '배우', '영화', '관련', '케릭', '이동욱', '배우', '구미호', '이제', '도시', '정착', '건강', '장난', '기대', '출연', '영화', '개봉', '그때', '바로', '무조건', '이동욱', '임수정', '배우', '연기', '이건', '정말', '배우', '임수정', '배우', '화이팅', '얼른', '이상', '배우', '모습', '변신', '화이팅', '기대', '레드카펫', '이후', '신작', '벌써', '뿌잉', '출연', '기대']
In [31]:
### 부정 리뷰 명사 데이터에서 1글자 모두 제외하기
neg_comment_nouns2 = [w for w in neg_comment_nouns if len(w) > 1]
print(neg_comment_nouns2)
['얘기', '얘기', '반복', '명령', '영화', '정치', '의도', '영화', '보지맙시', '정치', '역사왜곡', '거지', '북한', '영화', '빵점', '여기', '죄파', '상이', '완전', '구라', '영화', '역시', '개딸', '영화', '우성', '정지', '따위', '발암', '역할', '우성', '특허', '자기', '신념', '정의', '역사', '진전', '정말', '케릭', '극악', '무도', '일당', '역사', '껍데기', '영화', '진실', '모서리', '영화', '팝콘', '그대로', '영화', '영화', '현재', '지옥', '정우성', '김성균', '가장', '이유', '정말', '작품', '결말', '불구', '영화상', '내내', '긴장', '강추', '내생', '최고', '영화', '최고', '영화', '부인', '관객', '싱크로', '장난', '절대', '영화', '고구마', '스트레', '몰랏던', '부분', '똑땅함', '스트레스', '최고', '영화', '지금', '현재', '진행형', '그땐', '신군부', '지금', '검찰', '세력', '언론', '찬탈', '모습', '화가', '서울', '눈물', '펑펑', '진짜', '나라', '생각', '사람', '모습', '상당', '부분', '사실', '극단', '왜곡', '영화', '극적', '부분', '이해', '허구', '사실', '감독', '다음', '검찰', '카르텔', '적발', '영화', '영화', '시간',
------------------- 생략 --------------------
'십분', '짜임새', '구성', '배우', '연기력', '깊이', '몰입', '시절', '젊은이', '생각', '가슴', '자신', '탐욕', '역사', '뒷걸음', '간악', '가슴', '이영화', '내기억', '편의', '영화', '재미', '감동', '집중', '만점', '대한민국', '국민', '라면', '영화', '상황', '영화', '국가', '위해', '진정', '희생', '사람', '악인', '승승장구', '세상', '혈압', '이치', '사람', '반드시', '영화', '개봉일', '엔딩', '감동', '결과', '심장', '쫄깃쫄깃', '재밋음', '전두환', '윤석열', '황정민', '정우성', '이성민', '김성균', '특급', '배우', '연기', '정야', '간반', '영화', '보지', '영화', '관람', '사상', '처음', '스토리', '전개', '지장', '방금', '보고', '시간', '나라', '출산율', '바닥', '오늘', '이동욱', '어색', '상이', '연기', '임수정', '이영화', '선택', '아쉽닺', '대사', '설정', '연출', '스토리', '게다가', '싱글', '서울', '홍보', '생각', '헛소리', '마구', '감독', '자인', '건가', '노잼', '누가', '영화', '이건', '흥행', '나폴레옹', '영화', '망작', '한국영', '영화', '이제', '멜로', '코미디', '드라마', '경찰', '영화', '조폭', '영화', '할리우드', '할리우드', '절대', '화일', '혼자', '혼자', '수동', '그녀', '매일', '창문', '너머', '매일', '그대', '노래', '갑자기', '사람', '싱글', '라며', '도시', '싱글', '서울', '남녀', '가장', '숙제']
긍정 및 부정 명사들의 빈도 분석¶
In [32]:
### 리뷰 명사들에 대한 워드카운트
from collections import Counter
In [42]:
### 긍정 명사 워드카운트 처리
pos_word_count = Counter(pos_comment_nouns2)
print(pos_word_count)
Counter({'영화': 1429, '역사': 410, '배우': 405, '정동원': 380, '노멀': 351, '연기': 326, '최고': 247, '지금': 243, '전두환': 223, '생각': 213, '보고': 199, '사람': 196, '국민': 184, '정말': 165, '우리': 150, '감독': 149, '시간': 143, '기대': 129, '정우성': 126, '응원': 122, '개봉': 118, '황정민': 117, '대한민국': 111, '나라': 111, '몰입': 110, '가슴': 108, '검찰': 107, '화가': 104, '내내': 102, '현실': 102, '진짜': 100, '눈물': 94, '모두': 93, '군인': 92, '하나회': 87, '다시': 86, '추천': 84, '작품': 82, '내용': 82, '마지막': 82, '서울': 80, '인간': 78, '가수': 77, '반복': 76, '반란': 76, '사실': 75, '시대': 73, '한번': 71, '화이팅': 67, '권력': 64, '분노': 64, '모든': 64, '재미': 60, '연출': 60, '기억': 59, '현재': 58, '하나': 58, '장면': 58, '정도': 55, '올해': 55, '쿠데타': 55, '정권': 54, '이야기': 54, '감동': 50, '독재': 50, '긴장감': 49, '관람': 49, '마음': 49, '대박': 49, '대통령': 47, '정치': 47, '세상': 47, '모습': 47, '때문': 46, '스토리': 45, '연기력': 45, '결말': 44, '세력': 44, '평점': 44, '계속': 44, '위해': 44, '처음': 42, '한국': 42, '극장': 42, '그때': 41, '사건': 40, '과거': 39, '이해': 39, '윤석열': 38, '영화관': 38, '느낌': 38, '실화': 38, '장태완': 38, '공포': 38, '그냥': 37, '진실': 37, '장군': 37, '얼마나': 36, '검사': 36, '제대로': 36, '미래': 35, '사
------------ 생략 ----------
회': 35, '이태': 34, '세대': 34, '제발': 34, '정의': 34, '시절': 34, '투표': 34, '국가': 33, '동안': 33, '이상': 33, '반드시': 33, '관객': 33, '강추': 33, '다른': 33, '상황': 33, '당시': 32, '오늘': 32, '되풀이': 32, '대사': 31, '사랑': 31, '가족': 31, '자신': 31, '개성': 1, '예능': 1, '발휘': 1, '정동': 1, '바레': 1, '유수': 1, '염원': 1, '활약': 1, '꽃미남': 1, '팔색조': 1, '회이팅': 1, '대성': 1, '참가': 1, '영화개봉': 1, '연주': 1, '승승장구': 1, '개막식': 1, '홧이팅': 1, '뉴너': 1, '마자': 1, '시일': 1, '회제': 1, '초정': 1, '슈스': 1, '리보': 1, '사내': 1, '대합': 1, '대기': 1, '바르샤바': 1, '종이': 1, '미도': 1, '스틸': 1, '코트': 1, '브런치': 1, '패러독스': 1, '불빛': 1, '색상': 1, '광고': 1, '츤데레': 1, '신기': 1, '시즌': 1, '멜로': 1, '세포': 1, '흐믓하': 1, '장물': 1, '광대': 1, '승천': 1, '수습': 1, '세수': 1, '머금': 1, '중년': 1, '때론': 1, '센스': 1, '볼땐': 1, '이듭': 1, '심심': 1, '로맨틱코미디': 1, '영민': 1, '백진솔': 1, '수역': 1, '기타연주': 1, '부담': 1, '고수': 1, '훈풍': 1, '색감': 1, '로맨스영화': 1, '이솜': 1, '드하': 1, '편집자': 1, '문학': 1, '이미도': 1, '여직원': 1, '살림': 1, '정이': 1, '거거': 1, '범수': 1, '건축학개론': 1, '존잼각': 1, '털실': 1, '정석': 1, '검블유': 1, '조합': 1, '극락': 1, '이소영': 1, '검색어': 1, '입력': 1, '케릭': 1, '구미호': 1, '도시': 1, '정착': 1, '건강': 1, '레드카펫': 1, '뿌잉': 1})
In [36]:
### 부정 명사 워드카운트 처리
neg_word_count = Counter(neg_comment_nouns2)
print(neg_word_count)
Counter({'영화': 212, '마블': 68, '작품': 48, '사람': 48, '내용': 42, '감독': 41, '스토리': 36, '시간': 35, '그냥': 33, '진짜': 29, '보고': 29, '재미': 28, '배우': 26, '생각': 25, '평점': 23, '이해': 22, '연기': 20, '장면': 20, '이제': 19, '일본': 18, '정말': 17, '전쟁': 17, '미야자키': 16, '드라마': 16, '박서준': 16, '기대': 15, '하나': 15, '무슨': 15, '중간': 15, '감동': 14, '개봉': 14, '주인공': 14, '페미': 14, '이건': 13, '의미': 13, '자신': 12, '마지막': 12, '댓글': 12, '애니': 12, '실망': 12, '한국': 12, '처음': 12, '역사': 11, '최고': 11, '몰입': 11, '우리': 11, '이야기': 11, '개연': 11, '최악': 11, '노잼': 11, '관객': 10, '이영화': 10, '이번': 10, '기분': 10, '시작': 10, '지브리': 10, '도대체': 10, '엄마': 10, '역시': 9, '자기': 9, '내내': 9, '때문': 9, '다른': 9, '주의': 9, '보기': 9, '군수': 9, '설정': 9, '디즈니': 9, '완전': 8, '이유': 8, '절대': 8, '나라': 8, '사실': 8, '전개': 8, '연출': 8, '모든': 8, '전혀': 8, '수준': 8, '출연': 8, '정도': 8, '요소': 8, '자체': 8, '시대': 8, '얼마나': 8, '영상': 8, '극장': 8, '느낌': 8, '캡틴마블': 8, '빌런': 8, '고양이': 8, '여자': 8, '억지': 8, '얘기': 7, '결말': 7, '지금': 7, '다음': 7, '연기력': 7, '대한민국': 7, '한번': 7, '쓰레기': 7, '현실': 7, '제목': 7, '어디': 7, '보지': 7, '캐스팅': 7, '흥행': 7, '공감': 7, '조금': 7, '그림': 7, '세계': 7, '웃음':
----- 생략 --------
'전범': 5, '무시': 5, '혼자': 5, '진심': 5, '마음': 5, '가지': 5, '언제': 5, '히어로': 5, '망작': 5, '코믹': 5, '네이버': 5, '예전': 5, '예고편': 5, '여주': 5, '싱글': 5, '현재': 4, '정우성': 4, '모습': 4, '화가': 4, '시절': 4, '집중': 4, '국민': 4, '상황': 4, '전두환': 4, '윤석열': 4, '긴장감': 4, '올해': 4, '감상': 4, '차라리': 4, '계속': 4, '선동': 4, '바로': 4, '정신': 4, '일이': 4, '한국인': 4, '정보': 4, '영화관': 4, '졸작': 4, '대해': 4, '결론': 4, '아버지': 4, '뭔가': 4, '흐름': 4, '애니메이션': 4, '거장': 4, '대충': 4, '기본': 4, '평가': 4, '대체': 4, '능력': 4, '작가': 4, '과거': 4, '이모': 4, '누가': 4, '캐릭터': 4, '천재': 4, '감성': 4, '거나': 4, '가끔': 4, '아주': 4, '소리': 4, '영웅': 4, '조연': 4, '액션': 4, '별로': 4, '엔드게임': 4, '게임': 4, '플러스': 4, '노래': 4, '매력': 4, '로코': 4, '정소민': 4, '전소민': 4, '최지우': 4, '그대로': 3, '긴장': 3, '장난': 3, '고구마': 소드': 1, '하나로': 1, '응집': 1, '각각': 1, '행동': 1, '이문식': 1, '사도': 1, '이군': 1, '충격': 1, '대안': 1, '우왕': 1, '칭찬': 1, '해웰': 1, '메이드': 1, '프랑스': 1, '재탕': 1, '단편': 1, '카피': 1, '디자인': 1, '스릴러': 1, '조합': 1, '듭니': 1, '유기': 1, '옴니버스': 1, '회수': 1, '감탄사': 1, '가수': 1, '화평': 1, '초보': 1, '부족': 1, '키스': 1, '영호': 1, '연말': 1, '속지': 1, '크리스마스': 1, '트리': 1, '포장': 1, '선물': 1, '작성': 1, '최저': 1, '갱신': 1, '심야': 1, '간반': 1, '사상': 1, '지장': 1, '출산율': 1, '바닥': 1, '이동욱': 1, '어색': 1, '임수정': 1, '아쉽닺': 1, '게다가': 1, '마구': 1, '자인': 1, '나폴레옹': 1, '멜로': 1, '화일': 1, '수동': 1, '그녀': 1, '창문': 1, '도시': 1, '숙제': 1})
긍정 및 부정 워드카운트 상위 20개 단어만 추출¶
In [46]:
### 긍정 -> 워드카운트 상위 20개 단어 추출
# - Count() -> 지원하는 함수-> 내림차순 함수 : most_common(20)
# --> 내림차순 후에 상위 20개 추출하는 함수
pos_top_20 = {}
for k, v in pos_word_count.most_common(20):
pos_top_20[k] = v
### 둘 중 하나 쓰면 됨
pos_top_20 = {k:v for k, v in pos_word_count.most_common(20)}
print(pos_top_20)
# --> 내림차순 후에 상위 20개 추출하는 함수임
{'영화': 1429, '역사': 410, '배우': 405, '정동원': 380, '노멀': 351, '연기': 326, '최고': 247, '지금': 243, '전두환': 223, '생각': 213, '보고': 199, '사람': 196, '국민': 184, '정말': 165, '우리': 150, '감독': 149, '시간': 143, '기대': 129, '정우성': 126, '응원': 122}
In [47]:
for neg_top_20 in neg_word_count:
neg_top_20 = {k:v for k, v in neg_word_count.most_common(20)}
print(neg_top_20)
{'영화': 212, '마블': 68, '작품': 48, '사람': 48, '내용': 42, '감독': 41, '스토리': 36, '시간': 35, '그냥': 33, '진짜': 29, '보고': 29, '재미': 28, '배우': 26, '생각': 25, '평점': 23, '이해': 22, '연기': 20, '장면': 20, '이제': 19, '일본': 18}
긍정 및 부정 상위 20개 명사에 대한 빈도 시각화¶
In [49]:
### 시각화 라이브러리
import matplotlib.pyplot as plt
### 폰트 설정 라이브러리
from matplotlib import font_manager, rc
### 폰트 설절
plt.rc("font", family= "Malgun Gothic")
### 마이너스기호 설정
plt.rcParams["axes.unicode_minus"] = False
In [53]:
### 긍정 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize=(10,5))
### 제목 넣기
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 [55]:
### 부정 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize=(10,5))
### 제목 넣기
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()
긍정 및 부정 리뷰 단어 워드클라우드(wordcloud) 시각화¶
In [56]:
### 워드클라우드 라이브러리
from wordcloud import WordCloud
In [63]:
### 긍정 리뷰 단어 워드클라우드 시각화
plt.figure(figsize=(8, 8))
### 그래프 제목
plt.title("[긍정] 리뷰 단어 워드클라우드 시각화")
### 사용할 폰트 파일 지정하기
font_path = "C:/Windows/Fonts/malgunsl.ttf"
### 워드클라우드 그래프 속성 설정
wc = WordCloud(
### 폰트 지정
font_path=font_path,
### 배경색 지정
background_color = "ivory",
### 그래프 너비
width=800,
###그래프 높이
height=600
)
### 워드클라우드 그래프에 데이터 넣기
# - wc.generate_from_frequencies() : 워드클라우드 이미지로 반환해줌
# cloud = wc.generate_from_frequencies(pos_top_20)
cloud = wc.generate_from_frequencies(pos_word_count)
### 워드클라우드 이미지 보여주기
plt.imshow(cloud)
### x y 좌표축 제외시키기
plt.axis("off")
plt.savefig("./img/긍정_리뷰_단어_워드클라우드_시가화.png")
### 보여주기
plt.show()
In [67]:
### 부정 리뷰 단어 워드클라우드 시각화
plt.figure(figsize=(8, 8))
### 그래프 제목
plt.title("[부정] 리뷰 단어 워드클라우드 시각화")
### 사용할 폰트 파일 지정하기
font_path = "C:/Windows/Fonts/malgunsl.ttf"
### 워드클라우드 그래프 속성 설정
wc = WordCloud(
### 폰트 지정
font_path=font_path,
### 배경색 지정
background_color = "black",
### 그래프 너비
width=800,
###그래프 높이
height=600
)
### 워드클라우드 그래프에 데이터 넣기
# - wc.generate_from_frequencies() : 워드클라우드 이미지로 반환해줌
# cloud = wc.generate_from_frequencies(neg_top_20)
cloud = wc.generate_from_frequencies(neg_word_count)
### 워드클라우드 이미지 보여주기
plt.imshow(cloud)
### x y 좌표축 제외시키기
plt.axis("off")
plt.savefig("./img/부정_리뷰_단어_워드클라우드_시가화.png")
### 보여주기
plt.show()
In [ ]:
In [ ]:
In [ ]: