【실습】 Python >> Text Mining -- 감성 분류 분석 (호텔 리뷰 데이터) (2023)

  • 0. 개요
  • 2. 데이터셋 살펴보기
  • 3. 한국어 텍스트 데이터 전처리
    • 3-0. konlpy 설치
    • 3-1. 정규 표현식 적용
    • 3-2. 한국어 형태소 분석 - 명사 단위
    • 3-3. 불용어 사전
    • 3-4. Word Count
    • 3-5. TF-IDF 적용
  • 4. 감성 분류 – Logistic Regression
    • 4-1. 데이터셋 생성
    • 4-2. Training set / Test set 나누기
    • 4-3. 모델 학습
    • 4-4. 샘플링 재조정
    • 4-5. 모델 재학습
  • 5. 긍정 / 부정 키워드 분석

0. 개요

제주 호텔의 리뷰 데이터(평가 점수 + 평가 내용)을 활용해 다음 2가지 분석을 진행합니다:

  1. 리뷰속에 담긴 사람의 긍정 / 부정 감성을 파악하여 분류할 수 있는 감성 분류 예측 모델을 만든다

  2. 만든 모델을 활용해 긍정 / 부정 키워드를 출력해, 이용객들이 느낀 제주 호텔의 장,단점을 파악한다


1. Library & Data Import

>> 사용할 Library

1
2
3
4
5
6
7
8
9
%matplotlib inline

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
warnings.filterwarnings('ignore')

>> 사용할 데이터셋

Tripadvisor 여행사이트에서 "제주 호텔"로 검색해서 나온 리뷰들을 활용합니다. (평점 & 평가 내용 포함)

1
df = pd.read_csv("https://raw.githubusercontent.com/yoonkt200/FastCampusDataset/master/tripadviser_review.csv")
1
df.head()
rating text
0 4 여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다. 위치선정 또한 적당한 ...
1 4 2일 이상 연박시 침대, 이불, 베게등 침구류 교체 및 어메니티 보강이 필요해 보입...
2 4 지인에소개로온 호텔 깨끗하고 좋은거같아요 처음에는 없는게 많아 많이 당황했는데 ...
3 5 방에 딱 들어서자마자 눈이 휘둥그레질정도로 이렇게 넓은 호텔 처음 와본 것 같아요!...
4 5 저녁에 맥주한잔 하는게 좋아서 렌트 안하고 뚜벅이 하기로 했는데 호텔 바로 앞에 버...

>> Feature Description

  • rating: 이용자 리뷰의 평가 점수 (1~5)

  • text: 이용자 리뷰 평가 내용


2. 데이터셋 살펴보기

1
2
# dimension
df.shape
(1001, 2)

1
2
# 결측치
df.isnull().sum()
rating 0text 0dtype: int64

1
2
# information
df.info()
<class 'pandas.core.frame.DataFrame'>RangeIndex: 1001 entries, 0 to 1000Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 rating 1001 non-null int64 1 text 1001 non-null objectdtypes: int64(1), object(1)memory usage: 15.8+ KB

1
2
3
# text 변수 확인

df['text'][0]
'여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다. 위치선정 또한 적당한 편이었고 청소나 청결상태도 좋았습니다.'

1
df['text'][100]
'올 봄에 벚꽃기간에 방문, 협재를 바라보는 바다뷰가 좋고 대로변이라 렌트해서 가기도 좋음. 조식은 이용안했는데 근처 옹포밥집까지 아침 산책겸 걸어가서 하고옴. 루프탑 수영장과 바가 있었는데 내가 갔을때는 밤에 비바람이 너무 불어서 이용못하고옴 ㅠㅠ 단점으로는 모 유명 여행블로거 리뷰처럼 화장실 물떄가... 그거빼곤 다 만족'

“text” 내용을 확인해보면, 소량의 "특수 문자"와 "모음"이 존재하는 경우가 있습니다. 이들은 Text Mining을 적용할 의미가 없기 때문에 정규표현식을 이용해서 제거해보도록 할게요.

3. 한국어 텍스트 데이터 전처리

기계가 텍스트 형식으로 되어 있는 리뷰 데이터를 이해하려면, 텍스트 데이터를 단어 단위로 분리하는 전처리 괴정이 필요합니다. 여기서 분리된 단어들은 Bag of Words로 Count 기반으로 나타날 수도 있고, TF-IDF를 통해서 점수로 나타날 수도 있습니다.

먼저 리뷰의 평가 내용을 단어화해서 형태소를 추출하고, 그 다음 Bag of Words를 생성하여 TF-IDF 변환을 진행하겠습니다.


3-0. konlpy 설치

영문이 아닌 한글을 처리해야 하기 때문에 "konlpy"이라는 library를 사용합니다.

참고 자료:

  1. 파이썬 한글 형태소 분석기 KoNLPy 설치방법 및 에러해결
  2. KoNLPy 홈메이지 – 설치하기
  3. [Anaconda에서 KoNLPy 설치하기] 삽질은 이제 그만~

1
!pip install konlpy==0.5.2 jpype1 Jpype1-py3
 Requirement already satisfied: konlpy==0.5.2 in d:\anaconda\lib\site-packages (0.5.2) Requirement already satisfied: jpype1 in d:\anaconda\lib\site-packages (1.0.2) Requirement already satisfied: Jpype1-py3 in d:\anaconda\lib\site-packages (0.5.5.4) Requirement already satisfied: tweepy>=3.7.0 in d:\anaconda\lib\site-packages (from konlpy==0.5.2) (3.9.0) Requirement already satisfied: lxml>=4.1.0 in d:\anaconda\lib\site-packages (from konlpy==0.5.2) (4.5.0) Requirement already satisfied: colorama in d:\anaconda\lib\site-packages (from konlpy==0.5.2) (0.4.3) Requirement already satisfied: numpy>=1.6 in d:\anaconda\lib\site-packages (from konlpy==0.5.2) (1.18.1) Requirement already satisfied: beautifulsoup4==4.6.0 in d:\anaconda\lib\site-packages (from konlpy==0.5.2) (4.6.0) Requirement already satisfied: typing-extensions; python_version < "3.8" in d:\anaconda\lib\site-packages (from jpype1) (3.7.4.1) Requirement already satisfied: requests[socks]>=2.11.1 in d:\anaconda\lib\site-packages (from tweepy>=3.7.0->konlpy==0.5.2) (2.23.0) Requirement already satisfied: requests-oauthlib>=0.7.0 in d:\anaconda\lib\site-packages (from tweepy>=3.7.0->konlpy==0.5.2) (1.3.0) Requirement already satisfied: six>=1.10.0 in d:\anaconda\lib\site-packages (from tweepy>=3.7.0->konlpy==0.5.2) (1.14.0) Requirement already satisfied: chardet<4,>=3.0.2 in d:\anaconda\lib\site-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy==0.5.2) (3.0.4) Requirement already satisfied: certifi>=2017.4.17 in d:\anaconda\lib\site-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy==0.5.2) (2020.6.20) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in d:\anaconda\lib\site-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy==0.5.2) (1.25.8) Requirement already satisfied: idna<3,>=2.5 in d:\anaconda\lib\site-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy==0.5.2) (2.9) Requirement already satisfied: PySocks!=1.5.7,>=1.5.6; extra == "socks" in d:\anaconda\lib\site-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy==0.5.2) (1.7.1) Requirement already satisfied: oauthlib>=3.0.0 in d:\anaconda\lib\site-packages (from requests-oauthlib>=0.7.0->tweepy>=3.7.0->konlpy==0.5.2) (3.1.0)

3-1. 정규 표현식 적용

1
2
3
4
5
6
7
8
# 정규 표현식 함수 정의

import re

def apply_regular_expression(text):
hangul = re.compile('[^ ㄱ-ㅣ 가-힣]') # 한글 추출 규칙: 띄어 쓰기(1 개)를 포함한 한글
result = hangul.sub('', text) # 위에 설정한 "hangul"규칙을 "text"에 적용(.sub)시킴
return result

만들어 놓은 정규 표현식을 "text"의 첫 행에 적용해서 결과 한번 확인해볼게요.

1
df['text'][0]
'여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다. 위치선정 또한 적당한 편이었고 청소나 청결상태도 좋았습니다.'

1
apply_regular_expression(df['text'][0])
'여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다 위치선정 또한 적당한 편이었고 청소나 청결상태도 좋았습니다'

정규 표현식을 적용한 후 특수 문자가 잘 제거된 것을 확인할 수 있습니다.


3-2. 한국어 형태소 분석 - 명사 단위

>> 명사 형태소 추출

참고 자료: konlpy.tag 패키지 Documentation

1
2
from konlpy.tag import Okt
from collections import Counter

명사 형태소 추출 함수 Okt() 를 이용하여 정규표현식을 적용한 “text” 첫 행 내용의 형태소를 추출해 보겠습니다.

1
apply_regular_expression(df['text'][0])
'여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다 위치선정 또한 적당한 편이었고 청소나 청결상태도 좋았습니다'

1
2
3
okt = Okt() # 명사 형태소 추출 함수
nouns = okt.nouns(apply_regular_expression(df['text'][0]))
nouns
['여행', '집중', '휴식', '제공', '호텔', '위치', '선정', '또한', '청소', '청결', '상태']

이제 이를 전체 말뭉치(corpus)에 적용해서 명사 형태소를 추출해볼게요.

1
2
3
# 말뭉치 생성
corpus = "".join(df['text'].tolist())
corpus

'여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다. 위치선정 또한 적당한 편이었고 청소나 청결상태도 좋았습니다.2일 이상 연박시 침대, 이불, 베게등 침구류 교체 및 어메니티 보강이 필요해 보입니다. 베스트 웨스턴 회원의 경우 객실 뷰와 층수 요청에 적극적으로 반영해 주시길 바랍니다.지인에소개로온 호텔 깨끗하고 좋은거같아요 처음에는 없는게 많아 많이 당황했는데 알고오시면 좋을거같아요 (세면도구와 잠옷은필수로챙기셔야해용) 그것만챙겨오시면 잘쉬었다가실수있답니당방에 딱 들어서자마자 눈이 휘둥그레질정도로 이렇게 넓은 호텔 처음 와본 것 같아요!! 다음에도 제주도 오면 꼭 여기서 지낼겁니다ㅎㅎ 1박만 머문다는게 너무 아쉽네요ㅠㅠ저녁에 맥주한잔 하는게 좋아서 렌트 안하고 뚜벅이 하기로 했는데 호텔 바로 앞에 버스정류이 있어서 너무 좋았습니다. 12시에 도착해서 가방 맡기려 했는데 일찍 정비된방이 있다며 바로 입실하고 룸도 업그레이드 해주셔서 직원분이 친절해 정말 좋았어요^^바다전망이라해서 기대했는데 영아니네요.. 전일 함덕대명콘도에서 1박했는데 그곳이 실내 분위기랑 바다전망이 훨 좋아요..손님이 없는 날이라고 가장 바다가 이쁘게 보이는 방으로 배치해 주셨다. 불편함에 대해 바로 대응 써비스 해주었고 조식도 사소한 부분까지 신경써서 아주 맛있었다. 특급 호텔은 아니지만 트랜디하고 즐거운 다양함에 대해 고민한 흔적이 였보인다. 여름에 꼭와서 수영장을 사용해 보고 싶다 ~ !엄마와 둘이 여행왔다가 가격대비 좋다고 하여 다녀왔어요 ㅎㅎ 듣던대로 깔끔했고 위치도 너무 좋았어요 주위 마트 식당들 동문시장도 가까워서 좋았고 앞에 바다가 있어서 더 좋았습니다 ㅎㅎ 또 방문의사 있어요 ~딸 둘과의 4일동안의 제주여행줌 2박 숙소로 정해진 제주 휘슬락 호텔~ 처음엔 공항과 가까운 곳으로만 생각했으나 시설도 넘 깨끗하고 직원분들도 모두 친절모드로 제주여행의 마지막을 넘넘 좋게 마무리하고 돌아가네요~~^^ 테라스에서 보이는 전경도 넘 멋지네요♡ 인근 동문재래시장도 가까워 야시장 이용도하고 너무너무 잘다녀왔어요. 다음에 또 이용할께요.제주여행 2일차!!! 호텔 휘슬락에 체크인 ㄱㄱㄱ. 뷰 기가막힙니다... 깨끗하고요~~ 주변에 갈데 많습니다. 여친과 잊지못할 추억 만들어봅니다^^ 좋은 가성비에 분위기 나쁘지않네요 추천 드립니다. 후회없으실듯!!!예전에 그랜드 호텔일 때 저희 아이 돌잔치를 여기 삼다정에서 했었더랬죠. 제주도에서는 아주 전통있는 호텔입니다. 그 후로 메종 글래드로 업그레이드 되었는데, 위치, 시설, 서비스에 비해 매우 합리적인 가격대의 만족스러운 호텔입니다. 그래서 저희는 명절에 제주도 내려오면 늘 글래드에 숙박해요. 특히 1층에 아티제와 백미당이 있어서, 여기 커피와 베이커리를 좋아하는 저희 가족에게는 플러스예요.지금까지 제주여행을 다니면서 여러호텔을 이용해보았지만, 메종 글래드에서 가장 만족스러웠습니다. 우선 공항의 접근성과 쇼핑의 편리함 그리고 조식의만족도가 최고이며 무엇보다 직원분들의 친절함이 기억에 남습니다. 앞으로 우리가족은 제주에 갈땐 메종을 찾기로했답니다.엄마랑 첫 제주도 여행인데 침구가 너무 좋았고, 직원분들도 친절하셔서 편안하게 쉬고 왔습니다. 교통도 편해서 짧은 여행이었지만 알차게 볼 수 있었도요. 3층에서 이틀 묵었었는데 정원 같은 곳이 바로 보여서 이뻤어요. 거기 돌아다니니까 수영장도 2개 있었는데 겨울이라 못써서 아쉬웠습니다 ㅠㅠ 여름에 꼭 여기 오려구요!! ㅎㅎㅎ 추천합니다~~친구가 제주도에 놀러와서 투숙을 하였는데 객실이 깔끔하고 뷰도 좋았어요. 야외 수영장이 보이는 방향이었는데 야간에는 조명을 켜서 너무 예쁘더라구요. 체크인하러 가는 그 순간조차도 벨맨에게 대접을 받았습니다. 왠만하면 실명을 거론하지 않는데 프론트에 문J.. 이름이 기억이 안나지만 체크인이 너무 친절해서 기분이 좋았습니다. 웃는 모습이 너무 선하고 밝아서 여행 첫날부터 스타트가 좋았네요. 다음에 투숙을 할 경우가 생긴다면 또 다시 이용할거에요~!!차를 좋아하는 아이들에게는 최고의 선물~~ 카운터에서 친절하게 안내해주셔서 편하게 이용하고 왔어요~~ 삼다정 디너 최고입니다. 기회가 되면 여름에 또 오고 싶네요~~직원분들은 눈만 마주쳐도 도와주려고 할 정도로 엄청 친절. 미니바 무료도 굿. 시설은 최근 지어진거라 당연 청결. 주변에 관광지도 가까운곳이 많음. 제주여행숙고소 강추~~ 내가 숙은 위치에서 찍은 야경뷰조식조타하여 일부러 저녁 많이 안 먹고 일찍 일어나서 동네 한바퀴 돌아주고 씻고 나서 2층가서 먹방 했네요. 신라호텔보다 퀄리티 좋음신제주에 위치한 매우 깨끗한 호텔입니다. 특히 조식을 추천 드립니다. 구제주에 오래된 호텔에 비할 수 없는 기분 좋은 호텔이였습니다.모녀 여행 중 제주시 1박을 위해 선택한 호텔입니다. 우선 공항에서 가깝고 오픈한 지 얼만 안 된 것 같아 예약했습니다. 호텔은 대로변에 있어 접근성이 좋고 (호텔은 5~10분거리), 더군다나 공항까지 셔틀버스 운행합니다. 데스크 직원분들 매우 친절하시고 주차안내분도 친절하셔서 첫 인상이 좋았습니다. 룸은 트윈으로 했는데 생각보다 큰 방에 퀸 사이즈가 2개여서 ㅋㅋㅋㅋ 대만족이었습니다. 스타일러가 있어서 여행 중 입었던 옷 다 돌렸습니다. 조식은 가짓수가 많지는 않으나 있어야 될 것은 다 있는 느낌? 근데 화장실이 조명이 너무 어둡고 내부인테리어도 어두워서 ㅋㅋㅋ 그 외의 호텔 분위기와 매우 이질적입니다. (이건 개인적인 취향인 것 같네요) 어메니티도 구비되어 있는데 향이 독특합니다. ㅋㅋㅋ 실망한 부분은 여행 시 산 과일을 먹으려고 나이프와 포크 부탁했는데 서비스가 안되더라고요..그리고 차와 커피 준비된 부분이 빈약합니다. (어느 부분은 특급호텔 표방인 것 같고 어떤 부분은 모텔인 것 같은 ) 하지만 결론적으로 가성비 훌륭, 접근성 훌륭, 청결도 훌륭해서 엄마와 함께 쾌적한 시간을 보냈습니다. 감사합니다.슈페리어킹룸에 하루 숙박한 후기입니다. 제주여행의 마지막날 숙박했는데요 지은지 얼마 안 된 느낌의 새 건물 이었습니다. 건물 안 인테리어는 약간 유럽 스타일이었구요 그림이나 조각들이 생각보다 많아서 놀랐어요 복도랑 객실도 그림이 전시되어 있고 전부 카펫으로 되어 있었습니다. 객실은 비슷한 등급의 다른 호텔들보다 큰 편이었고 침대는 두 명이서 자기에 충분할 정도로 정말 컸습니다. 비가 오는 날이라 비를 조금 맞았는데 객실 내에 LG 스타일러가 있어서 외투를 돌렸더니 뽀송뽀송해져서 완전 만족 합니다!! 진짜 스타일러 강추!!!! 그리고 무료셔틀 이용했는데 공항까지 한 7분 정도 걸렸습니당! 셔틀은 운행하는 시간이 정해져 있는데 미리 예약 하셔야 이용 하실 수 있어요~~ 다음에 제주도 온다면 또 이용하고 싶은 호텔이네요~^^시티뷰이지만 오름도 볼 수 있고 무엇보다도 교통이 훌륭하였다 다만 바로 도로가인 관계로 밤에 차량 소리가 다소 신경쓰였다급하게 방문했는데 방도 깔끔하고 직원분들 모두 친절하셔서 좋았습니다~ 1층 편의점도 있어서 좋았어요~ 칫솔은 챙겨야합니다 ㅎㅎ 재방문 의사 있습니다동계훈련을 신제주로 오게 되었는데̄̈, 훈련 하는동안 라마다호텔에서 편하게 잘 쉬었다̆̎ 갑니다̆̎! 가족과 연인과 함께 와도 좋을 것 같아요̆̈! 조식도 괜찮고 전체적으로 깔끔하고 편리하게 되어있네요̆̈ ◡̈⋆ 사진이 너무 많아 첨부하진 못했지만, 엘리베이터 가는̆̈ 곳 쪽에 빔으로 실시간 비행기 시간을 알려줘서 너무 편하고 신기했어요̆̈!


[P.S. 브라우저 메모리 부족으로 부분만 출력]

1
2
# 정규 표현식 적용
apply_regular_expression(corpus)

'여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다 위치선정 또한 적당한 편이었고 청소나 청결상태도 좋았습니다일 이상 연박시 침대 이불 베게등 침구류 교체 및 어메니티 보강이 필요해 보입니다 베스트 웨스턴 회원의 경우 객실 뷰와 층수 요청에 적극적으로 반영해 주시길 바랍니다지인에소개로온 호텔 깨끗하고 좋은거같아요 처음에는 없는게 많아 많이 당황했는데 알고오시면 좋을거같아요 세면도구와 잠옷은필수로챙기셔야해용 그것만챙겨오시면 잘쉬었다가실수있답니당방에 딱 들어서자마자 눈이 휘둥그레질정도로 이렇게 넓은 호텔 처음 와본 것 같아요 다음에도 제주도 오면 꼭 여기서 지낼겁니다ㅎㅎ 박만 머문다는게 너무 아쉽네요ㅠㅠ저녁에 맥주한잔 하는게 좋아서 렌트 안하고 뚜벅이 하기로 했는데 호텔 바로 앞에 버스정류이 있어서 너무 좋았습니다 시에 도착해서 가방 맡기려 했는데 일찍 정비된방이 있다며 바로 입실하고 룸도 업그레이드 해주셔서 직원분이 친절해 정말 좋았어요바다전망이라해서 기대했는데 영아니네요 전일 함덕대명콘도에서 박했는데 그곳이 실내 분위기랑 바다전망이 훨 좋아요손님이 없는 날이라고 가장 바다가 이쁘게 보이는 방으로 배치해 주셨다 불편함에 대해 바로 대응 써비스 해주었고 조식도 사소한 부분까지 신경써서 아주 맛있었다 특급 호텔은 아니지만 트랜디하고 즐거운 다양함에 대해 고민한 흔적이 였보인다 여름에 꼭와서 수영장을 사용해 보고 싶다 엄마와 둘이 여행왔다가 가격대비 좋다고 하여 다녀왔어요 ㅎㅎ 듣던대로 깔끔했고 위치도 너무 좋았어요 주위 마트 식당들 동문시장도 가까워서 좋았고 앞에 바다가 있어서 더 좋았습니다 ㅎㅎ 또 방문의사 있어요 딸 둘과의 일동안의 제주여행줌 박 숙소로 정해진 제주 휘슬락 호텔 처음엔 공항과 가까운 곳으로만 생각했으나 시설도 넘 깨끗하고 직원분들도 모두 친절모드로 제주여행의 마지막을 넘넘 좋게 마무리하고 돌아가네요 테라스에서 보이는 전경도 넘 멋지네요 인근 동문재래시장도 가까워 야시장 이용도하고 너무너무 잘다녀왔어요 다음에 또 이용할께요제주여행 일차 호텔 휘슬락에 체크인 ㄱㄱㄱ 뷰 기가막힙니다 깨끗하고요 주변에 갈데 많습니다 여친과 잊지못할 추억 만들어봅니다 좋은 가성비에 분위기 나쁘지않네요 추천 드립니다 후회없으실듯예전에 그랜드 호텔일 때 저희 아이 돌잔치를 여기 삼다정에서 했었더랬죠 제주도에서는 아주 전통있는 호텔입니다 그 후로 메종 글래드로 업그레이드 되었는데 위치 시설 서비스에 비해 매우 합리적인 가격대의 만족스러운 호텔입니다 그래서 저희는 명절에 제주도 내려오면 늘 글래드에 숙박해요 특히 층에 아티제와 백미당이 있어서 여기 커피와 베이커리를 좋아하는 저희 가족에게는 플러스예요지금까지 제주여행을 다니면서 여러호텔을 이용해보았지만 메종 글래드에서 가장 만족스러웠습니다 우선 공항의 접근성과 쇼핑의 편리함 그리고 조식의만족도가 최고이며 무엇보다 직원분들의 친절함이 기억에 남습니다 앞으로 우리가족은 제주에 갈땐 메종을 찾기로했답니다엄마랑 첫 제주도 여행인데 침구가 너무 좋았고 직원분들도 친절하셔서 편안하게 쉬고 왔습니다 교통도 편해서 짧은 여행이었지만 알차게 볼 수 있었도요 층에서 이틀 묵었었는데 정원 같은 곳이 바로 보여서 이뻤어요 거기 돌아다니니까 수영장도 개 있었는데 겨울이라 못써서 아쉬웠습니다 ㅠㅠ 여름에 꼭 여기 오려구요 ㅎㅎㅎ 추천합니다친구가 제주도에 놀러와서 투숙을 하였는데 객실이 깔끔하고 뷰도 좋았어요 야외 수영장이 보이는 방향이었는데 야간에는 조명을 켜서 너무 예쁘더라구요 체크인하러 가는 그 순간조차도 벨맨에게 대접을 받았습니다 왠만하면 실명을 거론하지 않는데 프론트에 문 이름이 기억이 안나지만 체크인이 너무 친절해서 기분이 좋았습니다 웃는 모습이 너무 선하고 밝아서 여행 첫날부터 스타트가 좋았네요 다음에 투숙을 할 경우가 생긴다면 또 다시 이용할거에요차를 좋아하는 아이들에게는 최고의 선물 카운터에서 친절하게 안내해주셔서 편하게 이용하고 왔어요 삼다정 디너 최고입니다 기회가 되면 여름에 또 오고 싶네요직원분들은 눈만 마주쳐도 도와주려고 할 정도로 엄청 친절 미니바 무료도 굿 시설은 최근 지어진거라 당연 청결 주변에 관광지도 가까운곳이 많음 제주여행숙고소 강추 내가 숙은 위치에서 찍은 야경뷰조식조타하여 일부러 저녁 많이 안 먹고 일찍 일어나서 동네 한바퀴 돌아주고 씻고 나서 층가서 먹방 했네요 신라호텔보다 퀄리티 좋음신제주에 위치한 매우 깨끗한 호텔입니다 특히 조식을 추천 드립니다 구제주에 오래된 호텔에 비할 수 없는 기분 좋은 호텔이였습니다모녀 여행 중 제주시 박을 위해 선택한 호텔입니다 우선 공항에서 가깝고 오픈한 지 얼만 안 된 것 같아 예약했습니다 호텔은 대로변에 있어 접근성이 좋고 호텔은 분거리 더군다나 공항까지 셔틀버스 운행합니다 데스크 직원분들 매우 친절하시고 주차안내분도 친절하셔서 첫 인상이 좋았습니다 룸은 트윈으로 했는데 생각보다 큰 방에 퀸 사이즈가 개여서 ㅋㅋㅋㅋ 대만족이었습니다 스타일러가 있어서 여행 중 입었던 옷 다 돌렸습니다 조식은 가짓수가 많지는 않으나 있어야 될 것은 다 있는 느낌 근데 화장실이 조명이 너무 어둡고 내부인테리어도 어두워서 ㅋㅋㅋ 그 외의 호텔 분위기와 매우 이질적입니다 이건 개인적인 취향인 것 같네요 어메니티도 구비되어 있는데 향이 독특합니다 ㅋㅋㅋ 실망한 부분은 여행 시 산 과일을 먹으려고 나이프와 포크 부탁했는데 서비스가 안되더라고요그리고 차와 커피 준비된 부분이 빈약합니다 어느 부분은 특급호텔 표방인 것 같고 어떤 부분은 모텔인 것 같은 하지만 결론적으로 가성비 훌륭 접근성 훌륭 청결도 훌륭해서 엄마와 함께 쾌적한 시간을 보냈습니다 감사합니다슈페리어킹룸에 하루 숙박한 후기입니다 제주여행의 마지막날 숙박했는데요 지은지 얼마 안 된 느낌의 새 건물 이었습니다 건물 안 인테리어는 약간 유럽 스타일이었구요 그림이나 조각들이 생각보다 많아서 놀랐어요 복도랑 객실도 그림이 전시되어 있고 전부 카펫으로 되어 있었습니다 객실은 비슷한 등급의 다른 호텔들보다 큰 편이었고 침대는 두 명이서 자기에 충분할 정도로 정말 컸습니다 비가 오는 날이라 비를 조금 맞았는데 객실 내에 스타일러가 있어서 외투를 돌렸더니 뽀송뽀송해져서 완전 만족 합니다 진짜 스타일러 강추 그리고 무료셔틀 이용했는데 공항까지 한 분 정도 걸렸습니당 셔틀은 운행하는 시간이 정해져 있는데 미리 예약 하셔야 이용 하실 수 있어요 다음에 제주도 온다면 또 이용하고 싶은 호텔이네요시티뷰이지만 오름도 볼 수 있고 무엇보다도 교통이 훌륭하였다 다만 바로 도로가인 관계로 밤에 차량 소리가 다소 신경쓰였다급하게 방문했는데 방도 깔끔하고 직원분들 모두 친절하셔서 좋았습니다 층 편의점도 있어서 좋았어요 칫솔은 챙겨야합니다 ㅎㅎ 재방문 의사 있습니다동계훈련을 신제주로 오게 되었는데 훈련 하는동안 라마다호텔에서 편하게 잘 쉬었다 갑니다 가족과 연인과 함께 와도 좋을 것 같아요 조식도 괜찮고 전체적으로 깔끔하고 편리하게 되어있네요 사진이 너무 많아 첨부하진 못했지만 엘리베이터 가는 곳 쪽에 빔으로 실시간 비행기 시간을 알려줘서 너무 편하고 신기했어요


[P.S. 브라우저 메모리 부족으로 부분만 출력]

1
2
3
# 전체 말뭉치(corpus)에서 명사 형태소 추출
nouns = okt.nouns(apply_regular_expression(corpus))
print(nouns)

['여행', '집중', '휴식', '제공', '호텔', '위치', '선정', '또한', '청소', '청결', '상태', '일', '이상', '연', '침대', '이불', '등', '침구', '류', '교체', '및', '어메니티', '보강', '베스트', '웨스턴', '회원', '경우', '객실', '뷰', '층수', '요청', '적극', '반영', '지인', '소개', '온', '호텔', '거', '처음', '당황', '세면', '도구', '잠옷', '필수', '그것', '방', '눈', '정도', '호텔', '처음', '것', '다음', '제주도', '꼭', '여기', '박만', '저녁', '맥주', '한잔', '렌트', '안', '뚜벅', '호텔', '바로', '앞', '버스', '정류', '시', '도착', '가방', '일찍', '정비', '방이', '바로', '입실', '룸', '업그레이드', '직원', '정말', '바다', '전망', '영', '전일', '함덕', '대명', '콘도', '곳', '실내', '분위기', '바다', '전망', '훨', '손님', '날', '가장', '바다', '방', '배치', '대해', '바로', '대응', '써비스', '조식', '부분', '신경', '아주', '특급', '호텔', '트랜디', '대해', '고민', '흔적', '여름', '꼭', '수영장', '사용', '보고', '엄마', '둘', '여행', '가격', '대비', '위치', '주위', '마트', '식당', '시장', '앞', '바다', '더', '또', '방문', '의사', '딸', '둘', '동안', '제주', '여행', '줌', '박', '숙소', '정해진', '제주', '휘슬', '락', '호텔', '처음', '공항', '곳', '생각', '시설', '직원', '모두', '친절', '모드', '여행', '마지막', '마무리', '테라스', '전경', '인근', '재래시장', '야시장', '이용도', '다음', '또', '이용', '제주', '여행', '일차', '호텔', '휘슬락', '체크', '뷰', '기', '주변', '여친', '추억', '가성', '비', '분위기', '추천', '후회', '예전', '그랜드', '호텔', '일', '때', '저희', '아이', '돌잔치', '여기', '다정', '했었더랬', '제주도', '아주', '전통', '호텔', '그', '후', '메종', '글래드', '업그레이드', '위치', '시설', '서비스', '매우', '합리', '가격', '대의', '호텔', '저희', '명절', '제주도', '늘', '글래드', '숙박', '층', '아티', '제', '백미', '여기', '커피', '베이커리', '저희', '가족', '플러스', '지금', '여행', '호텔', '이용', '메종', '글래드', '가장', '우선', '공항', '접근성', '쇼핑', '조식', '만족도', '최고', '무엇', '직원', '기억', '앞', '우리', '가족', '제주', '땐', '메종', '찾기', '엄마', '첫', '제주도', '여행', '침구', '직원', '쉬', '교통', '여행', '볼', '수', '도', '층', '이틀', '정원', '곳', '바로', '보', '거기', '수영장', '개', '겨울', '여름', '꼭', '여기', '추천', '친구', '제주도', '놀러와', '투숙', '객실', '뷰', '야외', '수영장', '방향', '야간', '조명', '체크', '그', '순간', '맨', '대접', '실명', '거론', '프론트', '문', '이름', '기억', '안나', '체크', '기분', '모습', '여행', '첫날', '스타트', '다음', '투숙', '경우', '또', '다시', '이용', '차', '아이', '최고', '선물', '카운터', '안내', '이용', '다정', '디너', '최고', '기회', '여름', '또', '직원', '눈', '정도', '친절', '미니바', '무료', '굿', '시설', '최근', '연', '청결', '주변', '관광지', '곳', '제주', '여행', '숙고', '소', '강추', '내', '숙', '위치', '야경', '뷰', '조식', '일부러', '저녁', '안', '일찍', '일어나서', '동네', '바퀴', '층', '먹방', '신라', '호텔', '퀄리티', '제주', '위치', '매우', '호텔', '조식', '추천', '제주', '호텔', '비', '수', '기분', '호텔', '모녀', '여행', '중', '제주시', '박', '위해', '선택', '호텔', '우선', '공항', '오픈', '얼', '안', '것', '예약', '호텔', '대로', '변', '접근성', '호텔', '분', '거리', '더군다나', '공항', '셔틀버스', '운행', '데스크', '직원', '매우', '차안', '분도', '첫', '인상', '룸', '트윈', '생각', '방', '퀸', '사이즈', '개', '만족', '스타', '여행', '중', '옷', '조식', '가짓수', '것', '느낌', '화장실', '조명', '내부', '인테리어', '그', '외', '호텔', '분위기', '매우', '질적', '이건', '개인', '취향', '것', '어메니티', '구비', '향', '부분', '여행', '시', '산', '과일', '나이프', '포크', '부탁', '서비스', '차', '커피', '준비', '부분', '부분', '특급', '호텔', '표방', '것', '부분', '모텔', '것', '결론', '가성', '비', '훌륭', '접근성', '훌륭', '청결', '엄마', '시간', '슈', '페리', '킹룸', '하루', '숙박', '후기', '여행', '마지막', '날', '숙박', '지은지', '얼마', '안', '느낌', '새', '건물', '건물', '안', '인테리어', '약간', '유럽', '스타일', '그림', '조각', '생각', '복도', '객실', '그림', '전시', '전부', '카펫', '객실', '등급', '다른', '호텔', '침대', '두', '명', '이서', '자기', '정도', '정말', '비', '날', '비', '조금', '객실', '내', '스타', '외투', '완전', '만족', '진짜', '스타', '강추', '무료', '셔틀', '이용', '공항', '분', '정도', '습', '셔틀', '운행', '시간', '미리', '예약', '이용', '수', '다음', '제주도', '또', '이용', '호텔', '시티', '뷰', '오름', '볼', '수', '무엇', '교통', '다만', '바로', '도로', '가인', '관계', '밤', '차량', '소리', '다소', '신경', '방문', '방도', '직원', '모두', '층', '편의점', '칫솔', '재', '방문', '의사', '동계', '훈련', '제주', '훈련', '동안', '라마', '호텔', '가족', '연인', '것', '조식', '전체', '사진', '첨부', '엘리베이터', '곳', '쪽', '빔', '실시간', '비행기', '시간', '공항', '택시', '미만', '택시', '비', '이동', '가능', '침구', '및', '룸', '상태', '최상', '욕실', '슬리퍼', '위생', '상태', '염려', '카펫', '염려', '설날', '조식', '떡국', '당황', '함', '떡국', '공항', '려고', '현장', '결재', '황스', '려운', '중국', '만두', '종류', '별로', '구만', '현장', '결재', '조식', '일', '메뉴', '답변', '첫', '도착', '제일', '첫', '주차', '걱정', '요', '할아버지', '안심', '객실', '컨디션', '최고', '조식', '문어', '처리', '최고', '닺', '회사', '출장', '차', '시설', '직원', '서울', '때', '이용', '다음', '또', '프론트', '방도', '간혹', '이벤트', '업그레이드', '해주시', '수영장', '및', '부대', '시설', '최고', '항상', '제주도', '때', '롯데', '롯데', '시티', '호텔', '제주', '비지니스', '호텔', '가족', '여행객', '손색', '객실', '욕조', '겸비', '사계절', '수풀', '무료', '이용', '층', '야외', '수영장', '중문', '표선등', '원거리', '여행지', '복귀', '후', '밤', '시', '수영장', '이용', '또한', '시내', '유명', '식당', '등', '방문', '아주', '일단', '공항', '분', '정도', '위치', '주차장', '지하', '층', '공간', '주차', '수', '체크', '때', '직원', '응대', '기분', '체크', '수', '다른', '문의사항', '신지', '감동', '습', '객실', '역시', '롯데', '생각', '정도', '풀', '장도', '이용', '수', '더', '옆', '락타', '룸', '샤워', '마련', '코인', '세탁실', '정말', '이용', '오션', '뷰', '멀리', '바다', '야경', '남자친구', '첫', '여행', '덕분', '여행', '습', '다음', '제주', '꼭', '방문', '이번', '제주도', '여행', '때', '롯데', '시티', '제주', '박', '숙박', '체크', '때', '프런트', '직원', '객실', '배정', '공항', '비행기', '이착륙', '객실', '객실']


[P.S. 브라우저 메모리 부족으로 부분만 출력]

1
2
# 빈도 탐색
counter = Counter(nouns)
1
counter.most_common(10)
[('호텔', 803), ('수', 498), ('것', 436), ('방', 330), ('위치', 328), ('우리', 327), ('곳', 320), ('공항', 307), ('직원', 267), ('매우', 264)]

>> 한글자 명사 제거

위 결과에서 보이듯이, 두 글자 키워드가 대부분 의미 있는 단어지만, ‘수’, ‘것’, '곳’과 같은 한 글자 키워드는 분석에 딱히 좋은 영향을 미치지 않은 것으로 보입니다. 그래서 우리는 한글자 명사를 제거해보도록 하겠습니다.

1
2
available_counter = Counter({x: counter[x] for x in counter if len(x) > 1})
available_counter.most_common(10)
[('호텔', 803), ('위치', 328), ('우리', 327), ('공항', 307), ('직원', 267), ('매우', 264), ('가격', 245), ('객실', 244), ('시설', 215), ('제주', 192)]

이제 한글자 키워드 모두 제거됐습니다. 하지만 “우리”, “매우” 와 같은 실질적인 의미가 없고 꾸민 역할을 하는 불용어들 아직 존재합니다. 한국어 불용어 사전을 정의하여 불용어도 제거해줄게요.


3-3. 불용어 사전

RANKS NL에 제공해주는 한국어 불용어 사전을 활용하겠습니다.

1
2
stopwords = pd.read_csv("https://raw.githubusercontent.com/yoonkt200/FastCampusDataset/master/korean_stopwords.txt").values.tolist()
stopwords[:10]
[['휴'], ['아이구'], ['아이쿠'], ['아이고'], ['어'], ['나'], ['우리'], ['저희'], ['따라'], ['의해']]

이 외에도 우리가 분석하고자 하는 데이터셋에 특화된 불용어들이 있습니다. 예를 들면: “제주”, “호텔”, “숙소” 등. 이런 단어들도 불용어 사전에 추가해보도록 할게요.

1
2
3
jeju_hotel_stopwords = ['제주', '제주도', '호텔', '리뷰', '숙소', '여행', '트립']
for word in jeju_hotel_stopwords:
stopwords.append(word)

3-4. Word Count

>> BoW 벡터 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.feature_extraction.text import CountVectorizer

def text_cleaning(text):
hangul = re.compile('[^ ㄱ-ㅣ 가-힣]') # 정규 표현식 처리
result = hangul.sub('', text)
okt = Okt() # 형태소 추출
nouns = okt.nouns(result)
nouns = [x for x in nouns if len(x) > 1] # 한글자 키워드 제거
nouns = [x for x in nouns if x not in stopwords] # 불용어 제거
return nouns

vect = CountVectorizer(tokenizer = lambda x: text_cleaning(x))
bow_vect = vect.fit_transform(df['text'].tolist())
word_list = vect.get_feature_names()
count_list = bow_vect.toarray().sum(axis=0)

1
2
# 단어 리스트
word_list
 ['가가', '가게', '가격', '가격표', '가구', '가급', '가기', '가까이', '가끔', '가능', '가도', '가동', '가두', '가득', '가든', '가라', '가량', '가려움', '가로', '가면', '가몬', '가무', '가물', '가미', '가방', '가버', '가성', '가세', '가스레인지', '가스렌지', '가슴', '가시', '가신', '가야', '가옥', '가요', '가용', '가운데', '가을', '가인', '가장', '가정', '가정식', '가족', '가지', '가짓수', '가차', '가치', '가품', '각각', '각오', '각자', '각종', '각층', '간격', '간곳', '간다', '간단', '간만', '간식', '간이', '간주', '간직', '간판', '간혹', '갈껄', '갈비', '갈비탕', '갈수', '갈수록', '감각', '감동', '감명', '감사', '감상', '감소', '감안', '감자', '감히', '갑인', '갑자기', '갑작스레', '강남', '강력', '강아지', '강압', '강제', '강조', '강추', '개념', '개략', '개미', '개발', '개방', '개별', '개보', '개뿔', '개선', '개수대', '개월', '개인', '개인실', '개인정보', '개조', '개층', '객수', '객실', '갤러리', '갱스터', '거기', '거나', '거두', '거론', '거르세', '거름', '거리', '거린데', '거림', '거문도', '거미', '거부', '거실', '거여', '거울', '거위', '거의', '거절', '거주', '거지', '거참', '거품', '걱정', '건가', '건강', '건너', '건너편', '건물', '건의', '건조', '건조기', '건조대', '건축', '걷기', '걸음', '걸이', '걸즈', '검사', '검색', '검정색', '검토', '것임', '겉보기', '게다가', '게스트', '게스트하우스', '게임', '게재', '겐찮은듯', '겔상', '겨우', '겨울', '겨울철', '격인', '격하', '결과', '결론', '결석', '결재', '결정', '결제', '결코', '결함', '결항', '결혼', '결혼식', '겸비', '겸용', '겹겹', '경고', '경관', '경내', '경로', '경매', '경영', '경영학', '경우', '경쟁', '경쟁력', '경찰', '경치', '경험', '계단', '계란', '계란후라이', '계산', '계속', '계정', '계획', '고가', '고간', '고객', '고급', '고기', '고기국수', '고깃배', '고내포구', '고려', '고루', '고무줄', '고문', '고민', '고봉', '고분', '고생', '고속', '고속도로', '고아', '고양이', '고여', '고오', '고요', '고유', '고작', '고장', '고정', '고층', '고통', '고트', '고함', '고해', '곡부', '곧바로', '곧장', '골드스타', '골목', '골목길', '골퍼', '골프', '골프장', '골프텔', '곰팡이', '곱슬', '곳곳', '곳곳이', '곳도', '곳임', '공간', '공감', '공개', '공공', '공공장소', '공급', '공기', '공덕', '공률', '공물', '공사', '공시', '공실이', '공연', '공연장', '공영', '공용', '공원', '공유', '공짜', '공차', '공터', '공포', '공항', '과거', '과물', '과언', '과일', '과장', '관경', '관계', '관계자', '관광', '관광객', '관광명소', '관광지', '관덕정', '관련', '관리', '관리인', '관리자', '관리직', '관음사', '관해', '광경', '광고', '광천수', '괴체', '교대', '교수', '교외', '교욱받', '교육', '교체', '교통', '교환', '교회', '구가', '구경', '구경만', '구관', '구글', '구나', '구내', '구덩이', '구도', '구두', '구둣주걱', '구들장', '구류', '구만', '구매', '구멍', '구별', '구분', '구비', '구사', '구색', '구석', '구석구석', '구성', '구식', '구암', '구역', '구역질', '구이', '구입', '구조', '구축', '국가', '국내', '국도', '국립', '국수', '국적', '국제', '국제공항', '군더더기', '군데', '군데군데', '굳럭', '굳이', '굿굿', '굿굿굿', '굿앤굿', '굿임', '권내', '권장', '권한', '귀중', '규모', '규율', '규칙', '균형', '그거', '그것', '그게', '그냥', '그네', '그녀', '그다음', '그다지', '그닥', '그대로', '그동안', '그때', '그랜드', '그레이스', '그로', '그룹', '그릇', '그린', '그림', '극복', '극악', '근래', '근무', '근본', '근육통', '근처', '근해', '글래드', '글쎄', '금고', '금늘', '금능', '금릉', '금방', '금속', '금액', '금연', '금요일', '금은', '금지', '금토일', '급상승', '급속', '기간', '기계', '기구', '기기', '기념일', '기능', '기대', '기도', '기류', '기리', '기반', '기본', '기부', '기분', '기사', '기상', '기소', '기숙사', '기술', '기술자', '기억', '기업', '기여', '기용', '기우', '기입', '기적', '기전', '기점', '기존', '기준', '기지', '기타', '기프트샵', '기호', '기회', '기후', '긴장', '길가', '길림', '길목', '길이', '김녕', '김녕해변', '김밥', '김씨', '김치', '김포공항', '까페', '깜빡', '깜짝', '깨끗', '깨끗깔끔', '께빵', '꼭대기', '꽃꺽으러', '꽃사슴', '꾸러미', '꾸밈', '꿀잠', '끝내기', '끼리', '나기', '나누기', '나니', '나라', '나름', '나머지', '나머진', '나무', '나물', '나보', '나오니', '나우', '나은', '나이', '나이트', '나이프', '나중', '나탈리', '낙후', '낚시', '난로', '난리', '난방', '난입', '난타', '날수', '날씨', '날짜', '남녀', '남성', '남아', '남자', '남자친구', '남짓', '남쪽', '남편', '낭만', '내겐', '내내', '내년', '내부', '내부시', '내시', '내야', '내외', '내용', '내의', '내인', '내일', '냄비', '냄새', '냉동', '냉장고', '너븐팡', '넓이', '네스프레소', '네이버', '년대', '년전', '녔던', '노곤', '노래', '노래방', '노력', '노리', '노블레스', '노선', '노을', '노크', '노트북', '노화', '노후', '녹물', '녹음', '녹지', '논평', '놀러와', '놀수', '놀이', '놀이기구', '놀이터', '농부가', '농장', '높이', '놨더군', '누가', '누구', '누군가', '누락', '누리', '누울', '눈앞', '뉴타운', '느낌', '는걸', '늘송', '능리', '다가', '다그', '다다미', '다라', '다락방', '다른', '다른사람', '다리미', '다만', '다미', '다발', '다섯', '다소', '다수', '다시', '다운', '다음', '다이지', '다인', '다정', '다행', '단계', '단기', '단면', '단어', '단위', '단점', '단정', '단지', '단체', '달걀', '달걀프라이', '달라', '달러', '달리', '달성', '닭머르', '담당', '담배', '담소', '담요', '답변', '당구', '당근', '당나귀', '당분간', '당시', '당신', '당일', '당황', '대가', '대가족', '대고', '대관령', '대답', '대당', '대도', '대도시', '대뜸', '대략', '대로', '대리', '대명', '대박', '대부분', '대비', '대상', '대신', '대안', '대여', '대요', '대욕', '대응', '대의', '대입', '대적', '대접', '대정', '대중', '대중교통', '대처', '대체', '대충', '대포', '대표', '대하', '대한', '대한민국', '대한항공', '대해', '대행', '대형', '대화', '대환영', '댐핑할', '더군다나', '더더', '더러', '더블', '더블베드', '더욱', '더원', '덕림사', '덕분', '덕택', '던데', '덮어놓고', '데리', '데스크', '데스크톱', '데이', '데이즈', '델문', '도구', '도달', '도대체', '도도', '도둑', '도로', '도록', '도리어', '도미', '도보', '도서관', '도시', '도시락', '도심', '도심지', '도어', '도어락', '도움', '도움말', '도일', '도정', '도중', '도착', '도처', '도청', '도쿄', '도크', '독립', '독서', '독점', '독채', '돈까스', '돌담', '돌잔치', '동계', '동광양', '동굴', '동남', '동남아', '동네', '동도', '동료', '동문', '동물', '동물원', '동반', '동부', '동북', '동생', '동선', '동시', '동안', '동영상', '동의', '동이', '동인', '동작', '동전', '동정', '동쪽', '돼지', '돼지고기', '됏다', '될껀', '될껄', '두루', '두번째', '두봉', '두부', '두엄', '두운', '두툼', '둘러보기', '둘이서', '둘째', '둥근지붕', '뒤쪽', '뒤척', '뒷골목', '뒷마당', '뒷문', '뒷쪽', '드네', '드라이기', '드라이버', '드라이브', '드라이어', '드롭', '드릴', '드타', '드하', '득시', '듭니', '듯이', '듯해', '등급', '등대', '등등', '등반', '등산', '등정후', '디귿', '디너', '디럭스', '디봇', '디셈버', '디자이너', '디자인', '디저트', '디제이', '따라서', '때로는', '때문', '떡국', '또오', '또한', '뚜벅', '뜨근뜨근', '뜨내기', '라그', '라마', '라며', '라면', '라서', '라스베가스', '라우터', '라운지', '라이센스', '라커룸', '락스', '락심이', '락커', '락타', '란딩', '랍니', '랜드', '랜트', '랜트카', '랜트하', '램프', '러닝', '러브', '럭셔리', '런가', '렀는데', '렀습니', '렀으', '레노', '레드', '레벨', '레비', '레스토랑', '레시', '레오', '레이', '레이크', '레인지', '레저', '레프트', '렌즈', '렌탈업체', '렌터', '렌터카', '렌트', '렌트카', '려고', '려운', '로고', '로그', '로만', '로맨틱', '로부터', '로비', '로서', '로션', '로얄', '로움', '로컬', '로터리', '로프트', '롯데', '롯데리아', '롱보드', '루온토', '루트', '루프', '룸메이트', '룸바닥', '룸상태', '룸서비스', '룸안', '룸키', '룸타입', '를위', '리가', '리기', '리넨', '리뉴', '리뉴얼', '리더', '리도', '리모콘', '리베라', '리베로', '리빙룸', '리셉션', '리움', '리젠시', '리조트', '리지', '리치', '리트', '리플렛', '린스', '링잉', '마누카꿀', '마늘', '마다', '마담', '마당', '마레', '마련', '마루', '마리', '마모', '마무리', '마사지', '마술', '마스코트', '마스크', '마스터', '마시기', '마안', '마운트', '마을', '마음', '마이너스', '마인드', '마일리지', '마자', '마저', '마주', '마지막', '마지막여행', '마차', '마찬가지', '마치', '마침내', '마켓', '마트', '마틸다', '막걸리', '만끽', '만난', '만날', '만남', '만다린', '만두', '만들기', '만료', '만약', '만요', '만원', '만점', '만족', '만족도', '만천원', '만큼', '만하', '만해', '만화책', '말레이시아', '말레이시아인', '말로', '말리', '말씀', '말투', '말함', '맘스', '맛사지', '맛잇엇어', '맛집', '망각', '망신', '망치', '맞은편', '맞이', '매년', '매니', '매니저', '매달', '매듭', '매력', '매번', '매우', '매운탕', '매일', '매장', '매점', '매칭', '매트', '매트리스', '매트릭스', '매하', '맥도날드', '맥도널드', '맥주', '맥주잔', '맨발', '머리', '머리카락', '머신', '머싱', '먹거리', '먹기', '먹방', '먹이', '먼저', '먼지', '멀리', '메가박스', '메뉴', '메리', '메리어트', '메시지', ...]
1
2
# 각 단어가 전체 리뷰중에 등장한 총 횟수
count_list
array([ 4, 8, 245, ..., 1, 7, 14], dtype=int64)

1
2
# 각 단어의 리뷰별 등장 횟수
bow_vect.toarray()
array([[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 2, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], dtype=int64)

1
bow_vect.shape
(1001, 3599)

1
2
3
4
# "단어" - "총 등장 횟수" Matching

word_count_dict = dict(zip(word_list, count_list))
word_count_dict
 {'가가': 4, '가게': 8, '가격': 245, '가격표': 1, '가구': 8, '가급': 1, '가기': 20, '가까이': 20, '가끔': 5, '가능': 10, '가도': 7, '가동': 2, '가두': 1, '가득': 2, '가든': 1, '가라': 3, '가량': 1, '가려움': 1, '가로': 2, '가면': 14, '가몬': 1, '가무': 1, '가물': 1, '가미': 1, '가방': 4, '가버': 1, '가성': 49, '가세': 3, '가스레인지': 1, '가스렌지': 1, '가슴': 1, '가시': 4, '가신': 3, '가야': 10, '가옥': 1, '가요': 5, '가용': 1, '가운데': 3, '가을': 4, '가인': 1, '가장': 42, '가정': 4, '가정식': 2, '가족': 94, '가지': 55, '가짓수': 3, '가차': 1, '가치': 15, '가품': 1, '각각': 7, '각오': 1, '각자': 2, '각종': 3, '각층': 1, '간격': 2, '간곳': 1, '간다': 4, '간단': 1, '간만': 1, '간식': 5, '간이': 3, '간주': 1, '간직': 1, '간판': 2, '간혹': 1, '갈껄': 1, '갈비': 1, '갈비탕': 1, '갈수': 7, '갈수록': 1, '감각': 1, '감동': 12, '감명': 1, '감사': 6, '감상': 3, '감소': 1, '감안': 5, '감자': 1, '감히': 1, '갑인': 1, '갑자기': 4, '갑작스레': 1, '강남': 1, '강력': 9, '강아지': 7, '강압': 2, '강제': 1, '강조': 1, '강추': 8, '개념': 1, '개략': 1, '개미': 1, '개발': 3, '개방': 2, '개별': 3, '개보': 1, '개뿔': 1, '개선': 4, '개수대': 1, '개월': 1, '개인': 23, '개인실': 1, '개인정보': 2, '개조': 5, '개층': 1, '객수': 1, '객실': 244, '갤러리': 2, '갱스터': 1, '거기': 24, '거나': 6, '거두': 1, '거론': 1, '거르세': 1, '거름': 2, '거리': 156, '거린데': 1, '거림': 1, '거문도': 1, '거미': 1, '거부': 4, '거실': 29, '거여': 1, '거울': 5, '거위': 1, '거의': 27, '거절': 3, '거주': 1, '거지': 1, '거참': 1, '거품': 2, '걱정': 27, '건가': 1, '건강': 2, '건너': 8, '건너편': 11, '건물': 55, '건의': 1, '건조': 2, '건조기': 3, '건조대': 2, '건축': 2, '걷기': 2, '걸음': 3, '걸이': 2, '걸즈': 1, '검사': 1, '검색': 13, '검정색': 1, '검토': 3, '것임': 3, '겉보기': 2, '게다가': 5, '게스트': 25, '게스트하우스': 30, '게임': 2, '게재': 1, '겐찮은듯': 1, '겔상': 1, '겨우': 3, '겨울': 15, '겨울철': 2, '격인': 1, '격하': 1, '결과': 2, '결론': 3, '결석': 1, '결재': 2, '결정': 12, '결제': 1, '결코': 2, '결함': 1, '결항': 2, '결혼': 1, '결혼식': 2, '겸비': 1, '겸용': 1, '겹겹': 2, '경고': 1, '경관': 3, '경내': 1, '경로': 1, '경매': 1, '경영': 2, '경영학': 1, '경우': 41, '경쟁': 1, '경쟁력': 2, '경찰': 2, '경치': 17, '경험': 26, '계단': 4, '계란': 11, '계란후라이': 1, '계산': 2, '계속': 23, '계정': 1, '계획': 13, '고가': 1, '고간': 1, '고객': 14, '고급': 8, '고기': 8, '고기국수': 1, '고깃배': 1, '고내포구': 1, '고려': 9, '고루': 1, '고무줄': 1, '고문': 2, '고민': 9, '고봉': 1, '고분': 2, '고생': 1, '고속': 2, '고속도로': 2, '고아': 1, '고양이': 3, '고여': 1, '고오': 1, '고요': 3, '고유': 2, '고작': 1, '고장': 3, '고정': 3, '고층': 2, '고통': 1, '고트': 1, '고함': 2, '고해': 1, '곡부': 1, '곧바로': 2, '곧장': 2, '골드스타': 1, '골목': 6, '골목길': 2, '골퍼': 2, '골프': 9, '골프장': 5, '골프텔': 2, '곰팡이': 14, '곱슬': 1, '곳곳': 4, '곳곳이': 1, '곳도': 8, '곳임': 2, '공간': 73, '공감': 1, '공개': 1, '공공': 2, '공공장소': 1, '공급': 2, '공기': 8, '공덕': 1, '공률': 1, '공물': 1, '공사': 12, '공시': 1, '공실이': 1, '공연': 8, '공연장': 2, '공영': 1, '공용': 8, '공원': 17, '공유': 5, '공짜': 1, '공차': 1, '공터': 1, '공포': 1, '공항': 307, '과거': 1, '과물': 2, '과언': 1, '과일': 9, '과장': 2, '관경': 1, '관계': 3, '관계자': 2, '관광': 38, '관광객': 15, '관광명소': 4, '관광지': 12, '관덕정': 4, '관련': 6, '관리': 39, '관리인': 1, '관리자': 3, '관리직': 2, '관음사': 1, '관해': 5, '광경': 2, '광고': 4, '광천수': 1, '괴체': 1, '교대': 1, '교수': 1, '교외': 1, '교욱받': 1, '교육': 5, '교체': 7, '교통': 30, '교환': 2, '교회': 2, '구가': 3, '구경': 7, '구경만': 1, '구관': 4, '구글': 2, '구나': 2, '구내': 1, '구덩이': 1, '구도': 1, '구두': 2, '구둣주걱': 1, '구들장': 1, '구류': 1, '구만': 2, '구매': 14, '구멍': 7, '구별': 1, '구분': 3, '구비': 11, '구사': 6, '구색': 2, '구석': 2, '구석구석': 5, '구성': 7, '구식': 1, '구암': 1, '구역': 3, '구역질': 2, '구이': 1, '구입': 5, '구조': 12, '구축': 1, '국가': 3, '국내': 1, '국도': 1, '국립': 1, '국수': 3, '국적': 3, '국제': 11, '국제공항': 1, '군더더기': 1, '군데': 8, '군데군데': 2, '굳럭': 1, '굳이': 7, '굿굿': 1, '굿굿굿': 1, '굿앤굿': 1, '굿임': 1, '권내': 1, '권장': 5, '권한': 2, '귀중': 1, '규모': 12, '규율': 2, '규칙': 1, '균형': 1, '그거': 3, '그것': 70, '그게': 1, '그냥': 42, '그네': 1, '그녀': 20, '그다음': 1, '그다지': 4, '그닥': 4, '그대로': 11, '그동안': 4, '그때': 3, '그랜드': 6, '그레이스': 3, '그로': 3, '그룹': 9, '그릇': 3, '그린': 1, '그림': 4, '극복': 1, '극악': 1, '근래': 1, '근무': 4, '근본': 1, '근육통': 1, '근처': 164, '근해': 1, '글래드': 3, '글쎄': 2, '금고': 2, '금늘': 1, '금능': 2, '금릉': 1, '금방': 3, '금속': 1, '금액': 8, '금연': 6, '금요일': 1, '금은': 1, '금지': 1, '금토일': 1, '급상승': 1, '급속': 1, '기간': 3, '기계': 4, '기구': 2, '기기': 4, '기념일': 1, '기능': 4, '기대': 15, '기도': 7, '기류': 3, '기리': 1, '기반': 4, '기본': 45, '기부': 1, '기분': 29, '기사': 8, '기상': 1, '기소': 1, '기숙사': 7, '기술': 3, '기술자': 1, '기억': 11, '기업': 2, '기여': 1, '기용': 1, '기우': 1, '기입': 1, '기적': 1, '기전': 1, '기점': 1, '기존': 1, '기준': 4, '기지': 1, '기타': 5, '기프트샵': 2, '기호': 1, '기회': 11, '기후': 1, '긴장': 1, '길가': 4, '길림': 1, '길목': 2, '길이': 2, '김녕': 1, '김녕해변': 1, '김밥': 1, '김씨': 1, '김치': 4, '김포공항': 1, '까페': 5, '깜빡': 1, '깜짝': 3, '깨끗': 5, '깨끗깔끔': 1, '께빵': 1, '꼭대기': 2, '꽃꺽으러': 1, '꽃사슴': 1, '꾸러미': 1, '꾸밈': 1, '꿀잠': 2, '끝내기': 1, '끼리': 18, '나기': 2, '나누기': 6, '나니': 1, '나라': 2, '나름': 13, '나머지': 6, '나머진': 1, '나무': 13, '나물': 1, '나보': 1, '나오니': 2, '나우': 1, '나은': 5, '나이': 3, '나이트': 2, '나이프': 2, '나중': 8, '나탈리': 2, '낙후': 3, '낚시': 3, '난로': 3, '난리': 3, '난방': 30, '난입': 2, '난타': 9, '날수': 1, '날씨': 12, '날짜': 1, '남녀': 1, '남성': 2, '남아': 5, '남자': 6, '남자친구': 2, '남짓': 1, '남쪽': 1, '남편': 10, '낭만': 2, '내겐': 1, '내내': 8, '내년': 1, '내부': 40, '내부시': 1, '내시': 1, '내야': 1, '내외': 2, '내용': 2, '내의': 2, '내인': 1, '내일': 2, '냄비': 1, '냄새': 58, '냉동': 1, '냉장고': 35, '너븐팡': 2, '넓이': 1, '네스프레소': 1, '네이버': 3, '년대': 2, '년전': 1, '녔던': 1, '노곤': 2, '노래': 1, '노래방': 3, '노력': 8, '노리': 1, '노블레스': 1, '노선': 2, '노을': 1, '노크': 1, '노트북': 2, '노화': 1, '노후': 6, '녹물': 1, '녹음': 4, '녹지': 1, '논평': 1, '놀러와': 2, '놀수': 1, '놀이': 3, '놀이기구': 2, '놀이터': 2, '농부가': 1, '농장': 3, '높이': 2, '놨더군': 1, '누가': 5, '누구': 5, '누군가': 4, '누락': 1, '누리': 1, '누울': 2, '눈앞': 3, '뉴타운': 1, '느낌': 49, '는걸': 2, '늘송': 3, '능리': 1, '다가': 1, '다그': 1, '다다미': 1, '다라': 1, '다락방': 1, '다른': 88, '다른사람': 1, '다리미': 2, '다만': 54, '다미': 1, '다발': 1, '다섯': 1, '다소': 21, '다수': 2, '다시': 93, '다운': 4, '다음': 102, '다이지': 1, '다인': 1, '다정': 2, '다행': 3, '단계': 4, '단기': 1, '단면': 1, '단어': 2, '단위': 2, '단점': 40, '단정': 1, '단지': 16, '단체': 19, '달걀': 3, '달걀프라이': 1, '달라': 13, '달러': 7, '달리': 6, '달성': 1, '닭머르': 1, '담당': 2, '담배': 19, '담소': 2, '담요': 1, '답변': 3, '당구': 2, '당근': 2, '당나귀': 2, '당분간': 1, '당시': 1, '당신': 21, '당일': 3, '당황': 7, '대가': 3, '대가족': 2, '대고': 1, '대관령': 1, '대답': 3, '대당': 1, '대도': 3, '대도시': 2, '대뜸': 1, '대략': 6, '대로': 8, '대리': 3, '대명': 1, '대박': 3, '대부분': 23, '대비': 64, '대상': 1, '대신': 8, '대안': 2, '대여': 3, '대요': 2, '대욕': 1, '대응': 2, '대의': 4, '대입': 1, '대적': 1, '대접': 1, '대정': 1, '대중': 9, '대중교통': 6, '대처': 2, '대체': 2, '대충': 3, '대포': 1, '대표': 4, '대하': 1, '대한': 19, '대한민국': 2, '대한항공': 1, '대해': 21, '대행': 1, '대형': 10, '대화': 11, '대환영': 1, '댐핑할': 1, '더군다나': 1, '더더': 2, '더러': 1, '더블': 29, '더블베드': 4, '더욱': 5, '더원': 1, '덕림사': 1, '덕분': 6, '덕택': 3, '던데': 1, '덮어놓고': 1, '데리': 5, '데스크': 30, '데스크톱': 1, '데이': 1, '데이즈': 1, '델문': 2, '도구': 18, '도달': 3, '도대체': 1, '도도': 1, '도둑': 1, '도로': 41, '도록': 1, '도리어': 1, '도미': 9, '도보': 35, '도서관': 1, '도시': 18, '도시락': 4, '도심': 14, '도심지': 1, '도어': 3, '도어락': 1, '도움': 51, '도움말': 1, '도일': 1, '도정': 1, '도중': 2, '도착': 69, '도처': 1, '도청': 2, '도쿄': 1, '도크': 1, '독립': 6, '독서': 1, '독점': 1, '독채': 5, '돈까스': 1, '돌담': 1, '돌잔치': 1, '동계': 1, '동광양': 1, '동굴': 1, '동남': 1, '동남아': 2, '동네': 7, '동도': 1, '동료': 2, '동문': 14, '동물': 9, '동물원': 2, '동반': 3, '동부': 2, '동북': 1, '동생': 3, '동선': 3, '동시': 7, '동안': 48, '동영상': 1, '동의': 3, '동이': 1, '동인': 2, '동작': 1, '동전': 1, '동정': 1, '동쪽': 5, '돼지': 16, '돼지고기': 4, '됏다': 1, '될껀': 1, '될껄': 1, '두루': 2, '두번째': 2, '두봉': 2, '두부': 1, '두엄': 1, '두운': 2, '두툼': 1, '둘러보기': 1, '둘이서': 3, '둘째': 5, '둥근지붕': 1, '뒤쪽': 4, '뒤척': 1, '뒷골목': 1, '뒷마당': 1, '뒷문': 1, '뒷쪽': 2, '드네': 1, '드라이기': 7, '드라이버': 1, '드라이브': 11, '드라이어': 11, '드롭': 1, '드릴': 1, '드타': 1, '드하': 2, '득시': 1, '듭니': 5, '듯이': 1, '듯해': 1, '등급': 3, '등대': 3, '등등': 8, '등반': 3, '등산': 6, '등정후': 1, '디귿': 1, '디너': 4, '디럭스': 6, '디봇': 1, '디셈버': 2, '디자이너': 1, '디자인': 11, '디저트': 1, '디제이': 2, '따라서': 4, '때로는': 1, '때문': 112, '떡국': 2, '또오': 1, '또한': 76, '뚜벅': 3, '뜨근뜨근': 1, '뜨내기': 1, '라그': 1, '라마': 4, '라며': 3, '라면': 15, '라서': 1, '라스베가스': 1, '라우터': 1, '라운지': 9, '라이센스': 1, '라커룸': 1, '락스': 2, '락심이': 1, '락커': 2, '락타': 1, '란딩': 1, '랍니': 1, '랜드': 1, '랜트': 1, '랜트카': 1, '랜트하': 1, '램프': 2, '러닝': 1, '러브': 3, '럭셔리': 5, '런가': 2, '렀는데': 1, '렀습니': 2, '렀으': 1, '레노': 1, '레드': 1, '레벨': 1, '레비': 1, '레스토랑': 64, '레시': 1, '레오': 2, '레이': 1, '레이크': 1, '레인지': 3, '레저': 1, '레프트': 1, '렌즈': 1, '렌탈업체': 1, '렌터': 1, '렌터카': 4, '렌트': 17, '렌트카': 8, '려고': 4, '려운': 1, '로고': 1, '로그': 3, '로만': 1, '로맨틱': 2, '로부터': 2, '로비': 49, '로서': 2, '로션': 1, '로얄': 1, '로움': 1, '로컬': 3, '로터리': 1, '로프트': 1, '롯데': 6, '롯데리아': 2, '롱보드': 1, '루온토': 1, '루트': 1, '루프': 17, '룸메이트': 1, '룸바닥': 1, '룸상태': 2, '룸서비스': 9, '룸안': 1, '룸키': 2, '룸타입': 1, '를위': 1, '리가': 2, '리기': 1, '리넨': 1, '리뉴': 1, '리뉴얼': 1, '리더': 1, '리도': 1, '리모콘': 3, '리베라': 2, '리베로': 1, '리빙룸': 2, '리셉션': 29, '리움': 2, '리젠시': 1, '리조트': 53, '리지': 1, '리치': 1, '리트': 1, '리플렛': 1, '린스': 2, '링잉': 1, '마누카꿀': 1, '마늘': 1, '마다': 1, '마담': 2, '마당': 2, '마레': 2, '마련': 7, '마루': 5, '마리': 11, '마모': 1, '마무리': 3, '마사지': 4, '마술': 1, '마스코트': 2, '마스크': 1, '마스터': 2, '마시기': 2, '마안': 1, '마운트': 1, '마을': 9, '마음': 31, '마이너스': 1, '마인드': 4, '마일리지': 2, '마자': 2, '마저': 1, '마주': 4, '마지막': 21, '마지막여행': 1, '마차': 1, '마찬가지': 4, '마치': 12, '마침내': 3, '마켓': 9, '마트': 14, '마틸다': 2, '막걸리': 1, '만끽': 1, '만난': 1, '만날': 1, '만남': 1, '만다린': 2, '만두': 1, '만들기': 1, '만료': 1, '만약': 6, '만요': 1, '만원': 20, '만점': 1, '만족': 12, '만족도': 1, '만천원': 1, '만큼': 2, '만하': 2, '만해': 2, '만화책': 1, '말레이시아': 1, '말레이시아인': 1, '말로': 2, '말리': 1, '말씀': 7, '말투': 3, '말함': 2, '맘스': 1, '맛사지': 1, '맛잇엇어': 1, '맛집': 25, '망각': 1, '망신': 2, '망치': 2, '맞은편': 7, '맞이': 5, '매년': 2, '매니': 1, '매니저': 3, '매달': 1, '매듭': 1, '매력': 5, '매번': 1, '매우': 265, '매운탕': 1, '매일': 36, '매장': 3, '매점': 3, '매칭': 1, '매트': 5, '매트리스': 13, '매트릭스': 1, '매하': 1, '맥도날드': 5, '맥도널드': 1, '맥주': 22, '맥주잔': 1, '맨발': 3, '머리': 7, '머리카락': 4, '머신': 3, '머싱': 1, '먹거리': 7, '먹기': 2, '먹방': 1, '먹이': 3, '먼저': 3, '먼지': 3, '멀리': 14, '메가박스': 1, '메뉴': 15, '메리': 1, '메리어트': 1, '메시지': 1, ...}

3-5. TF-IDF 적용

>> TF-IDF 변환

Bag of Words 벡터에 대해서 TF-IDF변환 진행합니다.


1
2
3
4
from sklearn.feature_extraction.text import TfidfTransformer

tfidf_vectorizer = TfidfTransformer()
tf_idf_vect = tfidf_vectorizer.fit_transform(bow_vect)
1
print(tf_idf_vect.shape)
(1001, 3599)

변환 후 1001*3599 matrix가 출력됩니다. 여기서

  • 한 행(row)은 한 리뷰를 의미하고

  • 한 열(column)은 한 단어를 의미합니다.


1
2
# 첫 번째 리뷰에서의 단어 중요도(TF-IDF 값) -- 0이 아닌 것만 출력
print(tf_idf_vect[0])
 (0, 3588)0.35673213299026796 (0, 2927)0.2582351368959594 (0, 2925)0.320251680858207 (0, 2866)0.48843555212083145 (0, 2696)0.23004450213863206 (0, 2311)0.15421663035331626 (0, 1584)0.48843555212083145 (0, 1527)0.2928089229786031 (0, 790)0.2528176728459411

1
2
3
# 첫 번째 리뷰에서 모든 단어의 중요도 -- 0인 값까지 포함
print(tf_idf_vect[0].toarray().shape)
print(tf_idf_vect[0].toarray())
(1, 3599)[[0. 0. 0. ... 0. 0. 0.]]

>> “벡터” - “단어” mapping

1
vect.vocabulary_
 {'집중': 2866, '휴식': 3588, '제공': 2696, '위치': 2311, '선정': 1584, '또한': 790, '청소': 2927, '청결': 2925, '상태': 1527, '이상': 2392, '침대': 3022, '이불': 2388, '침구': 3021, '교체': 299, '어메니티': 2013, '보강': 1296, '베스트': 1277, '웨스턴': 2299, '회원': 3564, '경우': 185, '객실': 106, '층수': 3009, '요청': 2234, '적극': 2606, '반영': 1188, '지인': 2837, '소개': 1629, '처음': 2910, '당황': 611, '세면': 1607, '도구': 675, '잠옷': 2555, '필수': 3358, '그것': 361, '정도': 2673, '다음': 578, '여기': 2074, '박만': 1171, '저녁': 2595, '맥주': 981, '한잔': 3414, '렌트': 838, '뚜벅': 791, '바로': 1159, '버스': 1247, '정류': 2676, '도착': 697, '가방': 24, '일찍': 2487, '정비': 2685, '방이': 1225, '입실': 2500, '업그레이드': 2038, '직원': 2849, '정말': 2680, '바다': 1148, '전망': 2623, '전일': 2636, '함덕': 3425, '대명': 624, '콘도': 3091, '실내': 1861, '분위기': 1384, '손님': 1659, '가장': 40, '배치': 1241, '대해': 651, '대응': 634, '써비스': 1889, '조식': 2730, '부분': 1351, '신경': 1838, '아주': 1922, '특급': 3208, '트랜디': 3191, '고민': 210, '흔적': 3593, '여름': 2082, '수영장': 1700, '사용': 1483, '보고': 1297, '엄마': 2035, '가격': 2, '대비': 627, '주위': 2769, '마트': 924, '식당': 1826, '시장': 1816, '방문': 1217, '의사': 2361, '동안': 726, '정해진': 2695, '휘슬': 3580, '공항': 269, '생각': 1539, '시설': 1809, '모두': 1028, '친절': 3017, '모드': 1029, '마지막': 917, '마무리': 900, '테라스': 3156, '전경': 2612, '인근': 2427, '재래시장': 2583, '야시장': 1979, '이용도': 2402, '이용': 2400, '일차': 2488, '휘슬락': 3581, '체크': 2940, '주변': 2761, '여친': 2094, '추억': 2975, '가성': 26, '추천': 2977, '후회': 3575, '예전': 2145, '그랜드': 372, '저희': 2605, '아이': 1918, '돌잔치': 708, '다정': 581, '했었더랬': 3470, '전통': 2642, '메종': 1004, '글래드': 387, '서비스': 1563, '매우': 969, '합리': 3428, '대의': 635, '명절': 1018, '숙박': 1721, '아티': 1928, '백미': 1243, '커피': 3061, '베이커리': 1280, '가족': 43, '플러스': 3342, '지금': 2816, '우선': 2257, '접근성': 2664, '쇼핑': 1671, '만족도': 940, '최고': 2957, '무엇': 1078, '기억': 423, '우리': 2251, '찾기': 2902, '교통': 300, '이틀': 2418, '정원': 2691, '거기': 109, '겨울': 160, '친구': 3016, '놀러와': 541, '투숙': 3185, '야외': 1981, '방향': 1235, '야간': 1976, '조명': 2726, '순간': 1723, '대접': 638, '실명': 1868, '거론': 112, '프론트': 3337, '이름': 2378, '안나': 1938, '기분': 416, '모습': 1037, '첫날': 2921, '스타트': 1761, '다시': 576, '선물': 1578, '카운터': 3032, '안내': 1939, '디너': 777, '기회': 438, '미니바': 1121, '무료': 1067, '최근': 2959, '관광지': 281, '숙고': 1719, '강추': 88, '야경': 1977, '일부러': 2475, '일어나서': 2476, '동네': 714, '바퀴': 1168, '먹방': 990, '신라': 1843, '퀄리티': 3105, '모녀': 1024, '제주시': 2711, '위해': 2313, '선택': 1586, '오픈': 2180, '예약': 2143, '대로': 622, '거리': 115, '더군다나': 657, '셔틀버스': 1627, '운행': 2271, '데스크': 670, '차안': 2880, '분도': 1374, '인상': 2438, '트윈': 3201, '사이즈': 1489, '만족': 939, '스타': 1758, '가짓수': 45, '느낌': 558, '화장실': 3538, '내부': 505, '인테리어': 2455, '질적': 2859, '이건': 2368, '개인': 100, '취향': 3005, '구비': 321, '과일': 273, '나이프': 480, '포크': 3295, '부탁': 1364, '준비': 2786, '표방': 3305, '모텔': 1046, '결론': 165, '훌륭': 3577, '시간': 1799, '슈페리어킹룸': 1737, '하루': 3376, '후기': 3570, '지은지': 2836, '얼마': 2033, '건물': 136, '약간': 1985, '유럽': 2318, '스타일': 1760, '그림': 378, '조각': 2715, '복도': 1323, '전시': 2633, '전부': 2630, '카펫': 3039, '등급': 770, '다른': 567, '이서': 2394, '자기': 2512, '조금': 2722, '외투': 2218, '완전': 2206, '진짜': 2856, '셔틀': 1626, '미리': 1127, '시티': 1821, '오름': 2162, '다만': 570, '도로': 680, '가인': 39, '관계': 276, '차량': 2876, '소리': 1638, '다소': 574, '방도': 1215, '편의점': 3273, '칫솔': 3027, '동계': 709, '훈련': 3576, '라마': 795, '연인': 2116, '전체': 2641, '사진': 1493, '첨부': 2920, '엘리베이터': 2064, '실시간': 1873, '비행기': 1440, '택시': 3151, '미만': 1128, '이동': 2374, '가능': 9, '최상': 2961, '욕실': 2235, '슬리퍼': 1791, '위생': 2304, '염려': 2123, '설날': 1590, '떡국': 788, '려고': 840, '현장': 3495, '결재': 167, '황스': 3559, '려운': 841, '중국': 2789, '만두': 932, '종류': 2744, '별로': 1293, '구만': 316, '메뉴': 996, '답변': 603, '제일': 2709, '주차': 2779, '걱정': 131, '할아버지': 3423, '안심': 1945, '컨디션': 3067, '문어': 1095, '처리': 2909, '회사': 3561, '출장': 2988, '서울': 1567, '간혹': 64, '이벤트': 2386, '해주시': 3460, '부대': 1344, '항상': 3435, '롯데': 855, '비지니스': 1434, '여행객': 2097, '손색': 1664, '욕조': 2236, '겸비': 175, '사계절': 1459, '수풀': 1715, '중문': 2794, '표선등': 3306, '원거리': 2281, '여행지': 2101, '복귀': 1322, '시내': 1805, '유명': 2323, '일단': 2462, '주차장': 2781, '지하': 2844, '공간': 246, '응대': 2356, '문의사항': 1097, '신지': 1850, '감동': 71, '역시': 2106, '장도': 2566, '락타': 807, '샤워': 1550, '마련': 896, '코인': 3089, '세탁실': 1620, '오션': 2167, '멀리': 994, '남자친구': 497, '덕분': 665, '이번': 2385, '프런트': 3331, '배정': 1239, '이착륙': 2415, '클리닝': 3120, '근무': 382, '아주머니': 1923, '인사': 2436, '코로나': 3085, '사태': 1496, '노화': 535, '벽지': 1286, '주름': 2756, '지고': 2814, '타일': 3133, '가구': 4, '코너': 3082, '곳곳이': 243, '관광객': 279, '인지': 2449, '사람': 1463, '북적': 1369, '전반': 2627, '관리': 284, '편이': 3274, '피드백': 3346, '편입': 3276, '도시': 686, '관광': 278, '특화': 3214, '지역': 2834, '근처': 385, '카페': 3034, '가기': 6, '고유': 221, '특색': 3210, '스테이': 1768, '가도': 10, '스타벅스': 1759, '번화가': 1263, '아침': 1924, '커서': 3057, '방음': 1224, '먹거리': 988, '단점': 588, '라면': 797, '오심': 2170, '이중': 2411, '혼자': 3523, '겐찮은듯': 157, '다그': 563, '도일': 694, '께빵': 456, '중국인': 2793, '타고': 3127, '눈앞': 556, '가지': 44, '힐링': 3598, '피트니스': 3354, '패키지': 3254, '미닫이': 1122, '로비': 847, '비롯': 1421, '모든': 1030, '각종': 52, '물건': 1103, '아침식사': 1926, '밥맛': 1207, '피아노': 3349, '연주': 2118, '룸타입': 867, '패밀리': 3250, '거실': 121, '한실': 3412, '서부': 1562, '수산시장': 1690, '새벽': 1534, '경매': 182, '구경': 304, '추가': 2972, '어차피': 2022, '현재': 3496, '묵고': 1090, '인터넷': 2453, '지정': 2840, '안해': 1952, '프런터': 3330, '문의': 1096, '영화': 2135, '시스템': 1810, '티브이': 3219, '채널': 2903, '몇개': 1020, '콘센트': 3092, '플러그': 3341, '와이프': 2201, '충전': 2995, '결정': 168, '달라': 594, '경험': 190, '장점': 2579, '인생': 2439, '최악': 2966, '중심': 2797, '바닷가': 1153, '비교': 1413, '편임': 3275, '한번': 3408, '예정': 2146, '휴가': 3585, '스위트룸': 1750, '유리창': 2322, '위트': 2312, '캠핑': 3050, '테이블': 3160, '세트': 1621, '텐트': 3161, '에어컨': 2054, '작은방': 2543, '매트': 975, '자리': 2520, '탑동': 3142, '공원': 263, '프리': 3338, '마켓': 923, '공연': 259, '매일': 971, '식사': 1833, '관덕정': 282, '정문': 2682, '도보': 684, '소요': 1645, '해장국': 3458, '동문': 717, '서문시장': 1560, '목관': 1047, '맞은편': 960, '슬슬': 1792, '별관': 1291, '본관': 1330, '갈수': 68, '최신': 2965, '그린': 377, '환경': 3545, '때문': 787, '별도': 1292, '대중교통': 641, '구매': 317, '심플': 1882, '비품': 1438, '트윈침대': 3205, '스탠다드': 1763, '높이': 548, '한라산': 3404, '노곤': 525, '터미널': 3152, '온돌룸': 2189, '세면대': 1608, '물이': 1114, '치약': 3013, '것임': 150, '생수': 1545, '환승': 3550, '곧바로': 231, '동광양': 710, '정류장': 2677, '시청': 1818, '스텝': 1771, '협소하': 3502, '거품': 130, '타월': 3131, '화장': 3537, '대가': 612, '거울': 123, '쇼파': 1670, '조합': 2739, '금액': 395, '주차공간': 2780, '공터': 267, '태풍': 3150, '개층': 104, '오후': 2184, '한시': 3409, '사우나': 1485, '부모님': 1349, '할머니': 3422, '모시': 1038, '계획': 197, '일로': 2464, '빠듯해': 1445, '어디': 2004, '길가': 441, '골목길': 235, '이륙': 2377, '착륙': 2887, '보이': 1310, '그냥': 363, '일반': 2469, '대욕': 633, '헬스장': 3489, '가면': 19, '고려': 206, '렌터카': 837, '입구': 2496, '반대쪽': 1182, '한정': 3416, '단체': 591, '더블': 660, '제외': 2708, '여유': 2088, '반대편': 1183, '도심': 688, '불구': 1387, '소음': 1648, '거의': 125, '세명': 1609, '트리플': 3199, '전날': 2618, '남아': 495, '자체': 2534, '당일': 610, '정보': 2683, '햇반': 3468, '장조림': 2580, '전자': 2637, '레인지': 831, '가야': 33, '세미나': 1610, '한국인': 3400, '그대로': 369, '나름': 469, '제과점': 2697, '정거장': 2670, '모기': 1022, '만해': 944, '마리': 898, '가량': 16, '방안': 1222, '에프킬라': 2058, '비치': 1435, '계속': 195, '뿌리': 1456, '잡고': 2557, '찬장': 2891, '천장': 2915, '곳곳': 242, '측은': 3008, '벌레': 1265, '기본': 414, '요금': 2223, '건너편': 135, '번호': 1262, '샐러드': 1538, '음식': 2349, '구성': 326, '전복죽': 2629, '저번': 2601, '핸드폰': 3464, '충전기': 2996, '불편': 1400, '센터': 1622, '공사': 256, '숙면': 1720, '무난': 1061, '노력': 528, '지불': 2826, '비용': 1430, '로맨틱': 845, '독립': 702, '북유럽': 1368, '유리': 2321, '커튼': 3059, '바깥': 1145, '설치': 1595, '모던': 1025, '비데': 1418, '효율': 3569, '인치': 2451, '삼성': 1512, '만끽': 927, '편안함': 3270, '여정': 2091, '바닥': 1151, '목적': 1052, '커플': 3060, '끼리': 464, '직진': 2852, '운전': 2268, '공영': 261, '애기': 1962, '무선인터넷': 1074, '갑자기': 80, '서전': 1568, '항공': 3432, '다가': 562, '가급': 5, '결제': 169, '은방': 2342, '상황': 1533, '아시': 1914, '고트': 227, '지도': 2822, '세심': 1614, '공시': 257, '시작': 1815, '맥주잔': 982, '쿠폰': 3102, '일도': 2463, '크기': 3108, '룸서비스': 864, '정신': 2690, '평가': 3277, '편의': 3272, '요즘': 2233, '여러': 2078, '직언': 2848, '블룸': 1412, '변기': 1288, '물질': 1115, '얘기': 1997, '수건': 1675, '환불': 3548, '월일': 2293, '푸른': 3313, '파도': 3223, '철썩': 2918, '풍경': 3320, '생선회': 1544, '장소': 2573, '놀이': 543, '양도': 1989, '돼지': 735, '전골': 2613, '매운탕': 970, '형편': 3512, '브런치': 1406, '뒤쪽': 751, '맛집': 956, '쭈욱': 2869, '갑인': 79, '드타': 764, '방파제': 1233, '횟집': 3567, '타운': 3129, '해산물': 3448, '규모': 356, '가까이': 7, '어르신': 2008, '깨끗': 454, '대신': 629, '작고': 2538, '수영': 1697, '아쉬움': 1912, '인도': 2430, '소독약': 1634, '스비': 1745, '홀로': 3525, '등정후': 775, '부터': 1365, '혹시': 3520, '확인': 3543, '전화': 2645, '통해': 3180, '휘트니': 3582, '운동복': 2266, '수영모': 1698, '고오': 219, '바람': 1157, '대여': 631, '여직원': 2093, '무시': 1077, '말투': 951, '원래': 2284, '제로': 2700, '운영': 2267, '일반인': 2470, '입장': 2503, '선심': 1583, '필요': 3360, '기전': 430, '대뜸': 620, '화가': 3528, '고객': 200, '플레인': 3343, '시경': 1800, '아웃': 1917, '하야': 3382, '메리어트': 998, '여럿': 2081, '이어도': 2397, '수준': 1707, '이군': 2370, '실망': 1867, '종일': 2747, '리셉션': 880, '컨시어': 3070, '태도': 3147, '유료': 2319, '사고': 1460, '학생': 3393, '선생님': 1580, '어딘': 2005, '사항': 1498, '무슨': 1075, '거지': 128, '리빙룸': 879, '하나요': 3368, '트윈룸': 3202, '무려': 1065, '게재': 156, '실물': 1869, '차이': 2881, '실화': 1879, '파우더': 3231, '곰팡이': 240, '자국': 2511, '작동': 2539, '골드스타': 233, '냉장고': 517, '절대': 2649, '레스토랑': 826, '자꾸': 2513, '정색': 2687, '살짝': 1510, '서버': 1561, '데리': 669, '가신': 32, '나머지': 470, '물기': 1105, '직접': 2851, '체계': 2931, '엉망': 2048, '소규모': 1630, '시기': 1803, '마음': 910, '리트': 886, '라그': 794, '기대': 409, '실내수영장': 1862, '수온': 1701, '스위트': 1749, '비수': 1427, '상대': 1515, '노후': 536, '정가': 2669, '무리': 1072, '할인': 3424, '행사': 3473, '참고': 2893, '포함': 3298, '마일리지': 913, '대한항공': 650, '하룻밤': 3377, '확실': 3542, '연식': 2115, '고급': 201, '원가': 2280, '서우': 1566, '해수욕장': 3453, '한눈': 3402, '창문': 2900, '겨울철': 161, '온도': 2187, '리기': 870, '방기': 1214, '동시': 725, '방식': 1221, '대략': 621, '도정': 695, '부스': 1352, '옆방': 2137, '티비': 3220, '취침': 3001, '초등학생': 2946, '양호': 1996, '한식당': 3411, '차라리': 2875, '반드시': 1184, '크게': 3107, '씨유': 1896, '델문': 674, '카페나': 3035, '해수욕': 3452, '최적': 2969, '디럭스': 778, '발코니': 1203, '모로': 1034, '트윈룸입니': 3203, '선착순': 1585, '예술': 2142, '물놀이': 1106, '모래': 1031, '피크': 3352, '시즌': 1817, '날씨': 491, '선선': 1581, '근래': 381, '편리': 3269, '코르': 3086, '기지': 434, '사양': 1481, '주체': 2782, '교회': 302, '절반': 2653, '인수': 2440, '보임': 1314, '아트': 1927, '추정': 2976, '프로': 3333, '페셔': 3264, '인력': 2432, '매트리스': 976, '나무': 472, '허리': 3482, '안감': 1934, '해변': 3447, '워낙': 2275, '가시': 31, '주말': 2757, '한국': 3397, '벚꽃': 1270, '기간': 403, '협재': 3503, '옹포': 2197, '밥집': 1209, '산책': 1505, '루프': 860, '비바람': 1425, '불어': 1396, '블로거': 1410, '물떄': 1108, '그거': 360, '위주': 2308, '풀이': 3317, '온수': 2192, '미온수': 1133, '미온': 1132, '자쿠지': 2536, '잠깐': 2551, '인피니트': 2458, '환상': 3549, '하나': 3365, '스페': 1782, '치킨': 3015, '빠에야': 1446, '스파': 1779, '구조': 333, '스파룸': 1780, '자쿠': 2535, '이용권': 2401, '하니': 3371, '사이': 1487, '시트': 1820, '정리': 2678, '삼다수': 1511, '병과': 1294, '네스프레소': 520, '캡슐': 3051, '여자': 2089, '피로': 3347, '스페인': 1784, '영업': 2132, '종료': 2743, '버거': 1245, '오른쪽': 2161, '마담': 893, '나탈리': 482, '음악': 2351, '필터': 3362, '실외수영장': 1875, '검색': 147, '옥상': 2186, '결과': 164, '대형': 653, '만큼': 942, '번잡': 1260, '개수대': 98, '이전': 2407, '아무': 1909, '리지': 884, '제한': 2714, '경치': 189, '이웃': 2403, '일몰': 2467, '실제': 1877, '리조트': 883, '홍보': 3527, '상통': 1529, '화산': 3532, '바위': 1166, '정상': 2686, '기점': 431, '스템': 1770, '잠자리': 2556, '기타': 435, '부족함': 1359, '길이': 444, '다행': 582, '중국어': 2792, '영어': 2131, '도움': 692, '해결': 3438, '목적지': 1053, '해피': 3461, '음료': 2346, '사이다': 1488, '주스': 2764, '달걀': 592, '치즈': 3014, '히터': 3597, '투어': 3187, '호스텔': 3515, '질문': 2858, '상품': 1530, '과거': 270, '게스트하우스': 154, '자고': 2510, '오기': 2150, '일이': 2479, '발전': 1201, '예상': 2141, '토스터': 3165, '이후': 2424, '소등': 1635, '불키': 1399, '조용조': 2733, '방키': 1232, '고여': 218, '남자': 496, '안전': 1946, '차로': 2878, '이내': 2373, '뷔페': 1403, '여느': 2076, '롯데리아': 856, '방만': 1216, '고정': 224, '무궁화': 1060, '수기': 1676, '사이트': 1490, '홈페이지': 3526, '마치': 921, '무척': 1088, '전기차': 2617, '건너': 134, '급속': 402, '소가': 1628, '유치원': 2333, '주택가': 2784, ...}
1
2
invert_index_vectorizer = {v: k for k, v in vect.vocabulary_.items()}
print(str(invert_index_vectorizer)[:100]+'...')
{2866: '집중', 3588: '휴식', 2696: '제공', 2311: '위치', 1584: '선정', 790: '또한', 2927: '청소', 2925: '청결', 1527...

4. 감성 분류 – Logistic Regression

이제 전처리된 리뷰 데이터를 활용하여 감성 분류 예측 모델을 만들겠습니다.

감성 분류 예측 모델이란, 이용자 리뷰의 평가 내용을 통해 이 리뷰가 긍정적인지, 부정적인지를 예측하여, 이용자의 감성을 파악하는 겁니다.

따라서, 모델의 X 값(즉, feature 값)은 이용자 리뷰의 평가 내용이 되겠고, 모델의 Y 값(즉, label 값)은 이용자의 긍/부정 감성이 되겠습니다.


4-1. 데이터셋 생성

>> Label

우리는 이용자의 리뷰를 “긍정” / “부정” 두가지 부류로 나누고자 합니다. 하지만 이러한 이용자의 감성을 대표할 수 있는 “평가 점수” 변수는 1 ~ 5의 value를 가지고 있습니다. 따라서 "평가 점수"변수 (rating: 1 ~ 5)를 이진 변수 (긍정: 1, 부정:0)으로 변환해야 합니다.


1
df.sample(10)
rating text
951 3 나는 그것이 수영장을 가지고 있기 때문에 여기에서 예약했다. 그러나 수영장에 물이 ...
47 4 시설은 좀 오래 되었지만 동문시장, 서문시장 도보 10분거리이고 공항에서도 가깝습니...
574 4 호스트는 아주 친절하고 도움이 되었습니다. 그는 우리를 픽업해서 근처에 있는 동안 ...
637 4 제주시에 있는 호텔로 깔끔한 편이었고 나름 전망도 괜찮았습니다. 주차장은 주차타워에...
113 4 루프탑 바와 수영장이 있어서 사용가능하고 깨끗하고 친절하셔서 좋은곳이었습니다. 다만...
416 3 다양한 음식과 음료를 걸어갈 수 있는 곳. 저녁 식사는 늦은 밤에 음식을 찾는 문제...
671 2 리뷰보고 기대했는데 호텔이라기 보단 모텔이나 펜션 느낌이네요 생긴지 얼마 안된걸로 ...
235 5 위치가 바로 해변 근처라, 룸에서 보이는 뷰가 너무 좋습니다. 세화해변 자체가 조용...
875 3 Jeju 섬에서 4 일째되는 주제와 같이 Jeju 공항에서 터치 다운 이후로 이동 ...
254 4 출장 때문에 제주도에 오게 됐습니다. 가성비가 좋고 전체적으로 깨끗했습니다. 난방이...

리뷰 내용와 평점을 살펴보면, 4 ~ 5점 리뷰는 대부분 긍정적이었지만, 1 ~ 3점 리뷰에서는 부정적인 평가가 좀 많이 보였습니다.
그래서 4점, 5점인 리뷰는 "긍정적인 리뷰"로 분류하여 1를 부여하고, 1 ~ 3점 리뷰는 "부정적인 리뷰"로 분류하여 0을 부여하도록 할게요.

1
df['rating'].hist()
<matplotlib.axes._subplots.AxesSubplot at 0x154887d0b08>

【실습】 Python >> Text Mining -- 감성 분류 분석 (호텔 리뷰 데이터) (1)


1
2
3
4
5
6
7
def rating_to_label(rating):
if rating > 3:
return 1
else:
return 0

df['y'] = df['rating'].apply(lambda x: rating_to_label(x))
1
df.head()
rating text y
0 4 여행에 집중할수 있게 편안한 휴식을 제공하는 호텔이었습니다. 위치선정 또한 적당한 ... 1
1 4 2일 이상 연박시 침대, 이불, 베게등 침구류 교체 및 어메니티 보강이 필요해 보입... 1
2 4 지인에소개로온 호텔 깨끗하고 좋은거같아요 처음에는 없는게 많아 많이 당황했는데 ... 1
3 5 방에 딱 들어서자마자 눈이 휘둥그레질정도로 이렇게 넓은 호텔 처음 와본 것 같아요!... 1
4 5 저녁에 맥주한잔 하는게 좋아서 렌트 안하고 뚜벅이 하기로 했는데 호텔 바로 앞에 버... 1

1
df["y"].value_counts()
1 7260 275Name: y, dtype: int64

>> Feature

모델의 Feature 변수는 리뷰에서 추출된 형태소와 그들의 중요도를 나타나는 tf_idf_vect로 대체하겠습니다.


4-2. Training set / Test set 나누기

1
2
3
4
5
from sklearn.model_selection import train_test_split

x = tf_idf_vect
y = df['y']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state=1)
1
x_train.shape, y_train.shape
((700, 3599), (700,))
1
x_test.shape, y_test.shape
((301, 3599), (301,))

4-3. 모델 학습

>> Logistic Regression 모델 학습

1
2
3
4
5
6
7
8
9
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# fit in training set
lr = LogisticRegression(random_state = 0)
lr.fit(x_train, y_train)

# predict in test set
y_pred = lr.predict(x_test)

>> 분류 결과 평가

1
2
3
4
5
6
# classification result for test set

print('accuracy: %.2f' % accuracy_score(y_test, y_pred))
print('precision: %.2f' % precision_score(y_test, y_pred))
print('recall: %.2f' % recall_score(y_test, y_pred))
print('F1: %.2f' % f1_score(y_test, y_pred))
accuracy: 0.72precision: 0.72recall: 1.00F1: 0.84

1
2
3
4
5
6
7
8
9
10
# confusion matrix

from sklearn.metrics import confusion_matrix

confu = confusion_matrix(y_true = y_test, y_pred = y_pred)

plt.figure(figsize=(4, 3))
sns.heatmap(confu, annot=True, annot_kws={'size':15}, cmap='OrRd', fmt='.10g')
plt.title('Confusion Matrix')
plt.show()

【실습】 Python >> Text Mining -- 감성 분류 분석 (호텔 리뷰 데이터) (2)

모델 평가결과를 살펴보면, 모델이 지나치게 긍정(“1”)으로만 예측하는 경향이 있습니다. 따라서 긍정 리뷰를 잘 예측하지만, 부정 리뷰에 대한 예측 정확도가 매우 낮습니다. 이는 샘플데이터의 클래스 불균형으로 인한 문제로 보입니다.
따라서, 클래스 불균형 조정을 진행하겠습니다.


4-4. 샘플링 재조정

>> 1:1 Sampling

1
df['y'].value_counts()
1 7260 275Name: y, dtype: int64

1
2
positive_random_idx = df[df['y']==1].sample(275, random_state=12).index.tolist()
negative_random_idx = df[df['y']==0].sample(275, random_state=12).index.tolist()
1
2
3
4
random_idx = positive_random_idx + negative_random_idx
x = tf_idf_vect[random_idx]
y = df['y'][random_idx]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=1)

1
x_train.shape, y_train.shape
((412, 3599), (412,))
1
x_test.shape, y_test.shape
((138, 3599), (138,))

4-5. 모델 재학습

>> 모델 학습

1
2
3
lr2 = LogisticRegression(random_state = 0)
lr2.fit(x_train, y_train)
y_pred = lr2.predict(x_test)

>> 분류 결과 평가

1
2
3
4
5
6
# classification result for test set

print('accuracy: %.2f' % accuracy_score(y_test, y_pred))
print('precision: %.2f' % precision_score(y_test, y_pred))
print('recall: %.2f' % recall_score(y_test, y_pred))
print('F1: %.2f' % f1_score(y_test, y_pred))
accuracy: 0.72precision: 0.70recall: 0.74F1: 0.72

1
2
3
4
5
6
7
8
9
10
# confusion matrix

from sklearn.metrics import confusion_matrix

confu = confusion_matrix(y_true = y_test, y_pred = y_pred)

plt.figure(figsize=(4, 3))
sns.heatmap(confu, annot=True, annot_kws={'size':15}, cmap='OrRd', fmt='.10g')
plt.title('Confusion Matrix')
plt.show()

【실습】 Python >> Text Mining -- 감성 분류 분석 (호텔 리뷰 데이터) (3)

이제 모델이 “긍정적인” 케이스와 “부정적인” 케이스를 모두 적당히 잘 맞춘 것을 확인할 수 있습니다.

5. 긍정 / 부정 키워드 분석

기계는 이처럼 리뷰 내용에 나타나는 사람의 감성을 구별할 수 있을 뿐만 아니라, 학습된 Logistic Regression 모델을 이용하여 긍/부정 키워드도 추출해낼 수 있습니다.

추출된 키워드를 통해서 이용자가 느끼는 제주호델의 장,단점을 파악할 수 있고, 이를 기반으로 앞으로 유지해야 할 좋은 서비스와 개선이 필요한 아쉬운 서비스에 대해서도 어느정도 판단할 수 있습니다.


긍 / 부정 키워드를 추출하기 위해 먼저 Logistic Regression 모델에 각 단어의 coeficient를 시각화해보겠습니다.

1
lr2.coef_
array([[ 0.28196772, 0.10796991, -0.04978601, ..., 0. , -0.18315162, 0.28434689]])

1
2
3
4
# print logistic regression's coef

plt.figure(figsize=(10, 8))
plt.bar(range(len(lr2.coef_[0])), lr2.coef_[0])
<BarContainer object of 3599 artists>

【실습】 Python >> Text Mining -- 감성 분류 분석 (호텔 리뷰 데이터) (4)


여기서 계수가 양인 경우는 단어가 긍정적인 영향을 미쳤다고 볼 수 있고, 반면에, 음인 경우는 부정적인 영향을 미쳤다고 볼 수 있습니다.

이 계수들을 크기순으로 정렬하면, 긍정 / 부정 키워드를 출력하는 지표가 되겠습니다.


먼저 "긍정 키워드"와 "부정 키워드"의 Top 5를 각각 출력해볼게요.

1
2
3
print(sorted(((value, index) for index, value in enumerate(lr2.coef_[0])), reverse = True)[:5])
print(sorted(((value, index) for index, value in enumerate(lr2.coef_[0])), reverse = True)[-5:])
# enumerate: 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환함
[(1.2644550507381787, 1217), (0.9079356150239053, 2400), (0.895609472071521, 1148), (0.8859075267474583, 2730), (0.8795111499693716, 43)][(-0.7201222787741572, 1310), (-0.7519681298547074, 3022), (-0.8672956005075485, 567), (-0.9190158099937462, 515), (-0.9945592515966041, 2143)]

이처럼 단어의 coeficient와 index가 출력이 됩니다.


이제 전체 단어가 포함한 "긍정 키워드 리스트"와 "부정 키워드 리스트"를 정의하고 출력해볼게요.

1
2
3
coef_pos_index = sorted(((value, index) for index, value in enumerate(lr2.coef_[0])), reverse = True)
coef_neg_index = sorted(((value, index) for index, value in enumerate(lr2.coef_[0])), reverse = False)
coef_pos_index
 [(1.2644550507381787, 1217), (0.9079356150239053, 2400), (0.895609472071521, 1148), (0.8859075267474583, 2730), (0.8795111499693716, 43), (0.8541915649753757, 26), (0.8362541212560809, 578), (0.7714811231976703, 2957), (0.7375280889735719, 1491), (0.7203390936359615, 956), (0.6503260268852225, 2977), (0.6488836121942877, 115), (0.6467914172687944, 910), (0.6264469987695738, 1159), (0.5943145305412955, 883), (0.5505354129422678, 2988), (0.5294632094678557, 692), (0.5240729254152497, 2455), (0.5207834696883535, 1922), (0.5153917648445299, 2361), (0.49372825531123943, 1215), (0.49360869707006777, 246), (0.4854919888814009, 680), (0.4854086392859413, 269), (0.4748702738145659, 686), (0.4703566749364605, 1194), (0.45896954031613635, 790), (0.45586600022584467, 2834), (0.45372800281293535, 19), (0.4500540795581468, 2779), (0.44412671542407905, 416), (0.4425720292652355, 1805), (0.4364684750426245, 263), (0.4308546124247834, 3267), (0.4255898116545533, 2797), (0.4212941284904679, 2680), (0.41423556597532674, 489), (0.4121691212201187, 826), (0.4118068110883225, 937), (0.402234791816506, 353), (0.39915216217204813, 136), (0.3906502087724938, 131), (0.38863745777148795, 2180), (0.38330015115324956, 322), (0.37909051494174656, 1027), (0.3776598665737952, 1926), (0.36980255314279886, 2760), (0.3609360208520378, 3034), (0.3601455791606223, 1342), (0.3511486012544648, 344), (0.35030155043520095, 3447), (0.34810767211689553, 2674), (0.3448646839750021, 3021), (0.34466834073677766, 2070), (0.3341929597049384, 1750), (0.3332295460784216, 2849), (0.3291725978477463, 3435), (0.3276653378330499, 2530), (0.3221942756247239, 1483), (0.3217689173991826, 3397), (0.32047891465181083, 2013), (0.3080484198419967, 3029), (0.3062772550220064, 939), (0.30478483149478314, 627), (0.30438930158469363, 2606), (0.3027703771200994, 3454), (0.2989615171043252, 4), (0.2960030540205178, 1991), (0.2941392017845358, 3347), (0.290078280630203, 3593), (0.28793362240859766, 1090), (0.2861006595602784, 3404), (0.28434689214226744, 3598), (0.2819677181770861, 0), (0.2818546705602182, 1809), (0.2796034993266096, 1440), (0.2783451949177126, 3410), (0.27700777474574007, 1078), (0.2764799249539472, 278), (0.2757845449039994, 2074), (0.27449374217124756, 1697), (0.27211400542938347, 860), (0.26958773489776877, 276), (0.26894024258506205, 2642), (0.2679652653240931, 451), (0.26659353628773785, 2605), (0.2642541001710917, 1073), (0.2602933330998526, 71), (0.2601225988013697, 2727), (0.25898398896658026, 395), (0.25523176043119644, 109), (0.25400402242362763, 1120), (0.25346771390562256, 2311), (0.2525923917872476, 1760), (0.252483390540294, 3549), (0.25243556295192593, 44), (0.2523758090983611, 410), (0.25096842816549325, 3286), (0.25030837769014164, 3013), (0.2478963860060586, 3064), (0.24711051623367455, 1700), (0.24639626607741794, 532), (0.24423718622136711, 2339), (0.24419509835066824, 817), (0.24268824175871553, 1646), (0.24020390663531643, 847), (0.23613168717319782, 1277), (0.2356739894439279, 3547), (0.23333780634901968, 1966), (0.2331264370168398, 1350), (0.23268102047017378, 769), (0.23262817998676638, 3166), (0.23066409348184064, 1384), (0.23010041799635683, 210), (0.22586220283294378, 1885), (0.22523607425083558, 260), (0.2222412951070305, 281), (0.22091253142370337, 68), (0.21922527479299828, 1147), (0.21868875489181047, 1465), (0.21807039000574996, 3299), (0.21807039000574996, 172), (0.2177926484819077, 3223), (0.21751093007081115, 2634), (0.2163036212275728, 1171), (0.2162361260915301, 1671), (0.21591443393848506, 1552), (0.21530945315363187, 2038), (0.21450361502341533, 385), (0.2130004456328932, 2018), (0.21283349877228466, 2752), (0.21171382727695384, 1523), (0.21156875238749653, 2906), (0.21149936066156635, 3273), (0.2107420524603348, 3062), (0.2089604714261007, 2167), (0.20857560294926117, 705), (0.20849174650373709, 751), (0.2084323782944626, 2374), (0.2083850088267226, 1421), (0.2076716418538995, 1823), (0.20734493904041118, 2837), (0.20719074367652907, 1455), (0.20632098174995006, 2421), (0.20497429689912247, 2866), (0.20497429689912247, 1584), (0.20460844733702388, 1309), (0.20460135810671237, 1721), (0.2026617971957564, 192), (0.2021896255723423, 574), (0.20076231770123473, 1122), (0.20007368092656116, 981), (0.1994615301156886, 2722), (0.1987204932053518, 1895), (0.1982476502888129, 1622), (0.19668791935266033, 1816), (0.19602558824910057, 767), (0.195808499032481, 581), (0.1954442410972148, 2551), (0.19543920090503364, 2244), (0.19535829875348126, 1249), (0.19513316286959848, 2451), (0.1932943416840944, 2561), (0.19241691136362254, 1278), (0.19188249800399276, 221), (0.19059569732190523, 341), (0.18931948208829832, 2965), (0.18863137833398097, 2225), (0.188233216963001, 1067), (0.18823116402871, 1510), (0.18591329718666444, 2556), (0.1858513716606046, 1853), (0.18475568229990585, 1553), (0.1842332027380814, 15), (0.18385370069092052, 490), (0.183698940971588, 646), (0.18352145151744345, 2709), (0.18179588928699872, 1821), (0.18141472902160485, 356), (0.18101860699904043, 3325), (0.17968533410962978, 1517), (0.17894437469027485, 1441), (0.1785803255429378, 203), (0.17749094181502081, 1291), (0.17745689661710926, 423), (0.17691919755039834, 748), (0.17681729295382825, 629), (0.17650785942100156, 2042), (0.17521436890986974, 2822), (0.17420775259072946, 3525), (0.17407554594971275, 1376), (0.17390397512207328, 1508), (0.17390397512207328, 584), (0.1735238781146927, 509), (0.1729437410073151, 2188), (0.17166919021535662, 2761), (0.1711332476240707, 1505), (0.17079932615633314, 300), (0.1706243328180457, 795), (0.16989041829422863, 1577), (0.16965179412684628, 1028), (0.16919925883678436, 2705), (0.1687459695340302, 667), (0.16815742142636886, 1625), (0.1676232210748594, 2755), (0.16757499046872387, 2274), (0.16736563458006257, 1485), (0.16735261847037675, 2476), (0.16642204341549788, 2035), (0.16595006133727253, 760), (0.16475334154520693, 1208), (0.1646740028459598, 1937), (0.16464847364532936, 690), (0.1636808432150993, 3274), (0.16348761826549618, 1676), (0.16301112079103763, 2399), (0.1629849886257, 3591), (0.1629118596848168, 3186), (0.1626689828520234, 3210), (0.16142787916860177, 1598), (0.1613522761276804, 3417), (0.1603451229219545, 3116), (0.1599203302911822, 2487), (0.15983057428397826, 589), (0.1586108439130326, 2331), (0.15849368672169892, 1647), (0.15826740340037068, 625), (0.15743176994516933, 3490), (0.1571722075528101, 3567), (0.15712518230005013, 3027), (0.15687460543471862, 3428), (0.15651108129304298, 1307), (0.15600166572103646, 1961), (0.15583305075516699, 106), (0.15577941820129187, 1617), (0.155766902206714, 3017), (0.15491622812261568, 382), (0.15485968714815496, 1528), (0.1545939535424059, 259), (0.15411614699130288, 684), (0.1535726280760412, 3293), (0.1535726280760412, 2892), (0.15341384775377642, 2726), (0.15325471176173253, 1533), (0.1529359648993235, 1983), (0.1523311300168501, 1432), (0.15231484413753682, 1030), (0.15231397485990963, 556), (0.15139635636201898, 2078), (0.1511214654825413, 1312), (0.15101670800091527, 2998), (0.14887052306393284, 3096), (0.14887052306393284, 1457), (0.1485864638932176, 2600), (0.14818094009147514, 2223), (0.14810636314705725, 1859), (0.14763883239448744, 1738), (0.14724688251552864, 2328), (0.1471683691325973, 1841), (0.14705200941823965, 2268), (0.14704245351541728, 660), (0.14646359476664114, 3297), (0.14621204479849256, 2226), (0.14615889360176976, 3350), (0.14576749911151465, 2851), (0.14545079981853645, 2275), (0.1447568799500706, 2798), (0.1444313715254008, 2022), (0.1444180222221931, 1654), (0.1444180222221931, 1548), (0.14434325571263137, 2445), (0.14412764469019354, 1396), (0.1439309933360322, 3220), (0.14364997884743677, 3272), (0.14359122893612475, 1814), (0.14339034972990414, 2983), (0.14305710787294673, 1085), (0.14276222540097244, 348), (0.14269270587505128, 996), (0.14200348649786682, 3275), (0.14175159317612532, 3189), (0.14173146008479248, 714), (0.14095242066301328, 306), (0.14092668743912232, 2678), (0.14086483039942074, 570), (0.14061627821721584, 3414), (0.14047941175558679, 387), (0.1404004427633594, 3476), (0.1404004427633594, 1112), (0.13978500519793755, 2847), (0.13978500519793755, 780), (0.13964073789423023, 665), (0.13934374266681135, 3500), (0.13829992453370865, 3161), (0.13817992752504213, 1768), (0.13745049759016625, 3511), (0.13665192952568253, 757), (0.13642162742786484, 1351), (0.1359845468368403, 271), (0.13597476793796576, 534), (0.135852916769958, 2497), (0.13574633450491594, 3009), (0.13574633450491594, 2299), (0.13574633450491594, 1296), (0.13574633450491594, 1188), (0.13549762485752148, 3571), (0.13549762485752148, 3391), (0.13549762485752148, 2640), (0.13541454362686076, 1332), (0.13519719011184664, 238), (0.13515286340239754, 2047), (0.13500163846144472, 3152), (0.1347989845038155, 2353), (0.13477156350779324, 1527), (0.13474112790096265, 1889), (0.13474112790096265, 1196), (0.13474112790096265, 462), (0.13469292571022845, 11), (0.13458956235978478, 924), (0.13442001799674802, 2069), (0.1342034640274507, 2869), (0.1341559282111133, 2145), (0.13415237816410766, 3471), (0.13415237816410766, 3406), (0.13388090777365988, 94), (0.13342324387367194, 2971), (0.1332930603370377, 3432), (0.1330404844897235, 1506), (0.13293873503860765, 3087), (0.13272932864456133, 3073), (0.13232986210850453, 2246), (0.13218242328559932, 2082), (0.13197846164836427, 3285), (0.13197846164836427, 2297), (0.13197846164836427, 1741), (0.13197846164836427, 69), (0.13179675529668713, 1549), (0.1316814762162865, 3441), (0.13154581005598, 3192), (0.1314192595003537, 1386), (0.13129169059042645, 969), (0.1311653774611966, 244), (0.13071289286611526, 3003), (0.13067314069850974, 697), (0.12989273592089953, 466), (0.1297746134602387, 411), (0.12976187780923948, 39), (0.12975779444471916, 3176), (0.12975779444471916, 3066), (0.1296539223346817, 3169), (0.1295761221334622, 2132), (0.12915915165160174, 3585), (0.12912049655247929, 3475), (0.12912049655247929, 455), (0.12897380261630323, 1053), (0.12884028806560763, 2910), (0.1283431735744972, 2344), (0.1283431735744972, 1542), (0.12780627572336126, 2207), (0.12780627572336126, 531), (0.1277445628861703, 2975), (0.12741425172305826, 669), (0.1268676275287745, 424), (0.12600280097170596, 2053), (0.1255687931546876, 1578), (0.1251082717170878, 3287), (0.12501636694175655, 3082), (0.12485375424445369, 988), (0.12485077138187695, 1247), (0.12477317035474626, 1638), (0.12470562190989118, 1234), (0.12418537178635555, 3201), (0.12412494478481371, 1572), (0.12356427400475413, 720), (0.12346465010011236, 3190), (0.1232984083336477, 3384), (0.12290996269246392, 2930), (0.12272802616213961, 3448), (0.12252951158801757, 73), (0.12243269952395211, 3105), (0.12240812373820147, 2735), (0.12169970934221791, 2781), (0.12150853668051385, 1722), (0.12148978639712985, 1301), (0.12147421457137794, 2320), (0.12147421457137794, 2289), (0.12135904501371637, 3339), (0.12135904501371637, 1602), (0.12085540050886351, 3206), (0.12085540050886351, 2067), (0.12085540050886351, 1282), (0.12085540050886351, 1170), (0.12085540050886351, 199), (0.12073634202256898, 2460), (0.12051291677661294, 2250), (0.12051291677661294, 730), (0.12036501072581905, 3263), (0.12036501072581905, 373), (0.11982407529162177, 74), (0.11941421355306232, 2814), (0.11941421355306232, 2193), (0.11909411357560733, 2028), (0.11903875427006184, 403), (0.11887476984730765, 1374), (0.11855602046019094, 912), (0.11826793727408907, 2664), (0.11797129443799506, 147), (0.11792307582322151, 1752), (0.11792307582322151, 518), (0.1177499125052935, 1838), (0.11735274081083348, 2526), (0.11728847189963591, 1299), (0.11682555059780918, 702), (0.11662484295496746, 3453), (0.11615131711727657, 777), (0.11608095184078544, 771), (0.11598871515918448, 2677), (0.11589077346213462, 1341), (0.11572533411469992, 2492), (0.11567709862499206, 2587), (0.11567709862499206, 2077), (0.11542281429727001, 2221), (0.11525735836070924, 3389), (0.11501634646006889, 2886), (0.11501634646006889, 835), (0.11449108387629879, 267), (0.11419455143266674, 41), (0.11410478259093633, 2499), (0.11410478259093633, 636), (0.11391082531008434, 1939), (0.11379525876290054, 1779), (0.11369189505531267, 3279), (0.11359623354805377, 3362), (0.11328311707861126, 1626), (0.11309515954317759, 2033), (0.11309203979609482, 1163), (0.11306723080679525, 446), (0.11300787365565511, 88), (0.11281954183130295, 2799), (0.1125643845359886, 359), (0.1125643845359886, 87), (0.11236486622722328, 1599), (0.11236486622722328, 1462), (0.11202792916061027, 1320), (0.11168083926782998, 2088), (0.1116425153114436, 801), (0.11160861926991839, 2298), (0.11095938208098642, 304), (0.11091238300534989, 773), (0.1100077175343078, 2162), (0.10976564909688623, 1790), (0.10961263739649914, 258), (0.10941413976516044, 3488), (0.10941413976516044, 2819), (0.10941413976516044, 1828), (0.10917777932688458, 723), (0.10864303256976575, 747), (0.10864303256976575, 148), (0.10852304491119706, 1106), (0.10844777870744055, 1289), (0.10844777870744055, 619), (0.10832336961288917, 2692), (0.10832336961288917, 1454), (0.10830603618528553, 84), (0.10796991064699014, 1), (0.10795721696924253, 2315), (0.10795721696924253, 425), (0.1077710568146692, 3317), (0.1077710568146692, 2663), (0.10769380388975194, 2008), (0.10720615786237517, 583), (0.10673796206207481, 888), (0.10671454696616327, 601), (0.10656205646300153, 201), (0.1064891137904478, 1554), (0.10637660107629578, 1759), (0.10634735402569995, 3408), (0.10626212376589807, 2386), (0.10623995311965392, 3319), (0.10622168812753784, 333), (0.10615533943965197, 772), (0.10595924232583608, 337), (0.10595924232583608, 272), (0.10508229441497294, 3028), (0.10485989916431773, 2462), (0.10473698952461245, 3086), (0.10473698952461245, 434), (0.10473698952461245, 381), (0.10461042411497755, 3129), (0.10461042411497755, 1233), (0.10461042411497755, 764), (0.10461042411497755, 79), (0.10445117600612656, 3513), (0.10445117600612656, 3143), (0.10445117600612656, 401), (0.1041925044133613, 1207), (0.10388289797906243, 3088), (0.10359537183826453, 2766), (0.10359537183826453, 822), (0.10357097224199376, 3528), (0.10298171781942682, 3460), (0.10261708591617978, 527), (0.10237985140859761, 1290), (0.10223721967543753, 863), (0.10222967216366273, 582), (0.10189163932285969, 903), (0.10174059857006298, 31), (0.1015489083625263, 696), (0.10152723059467353, 1012), (0.10132218984016486, 2342), (0.10132218984016486, 1914), (0.10132218984016486, 1568), (0.10132218984016486, 562), (0.10132218984016486, 257), (0.10132218984016486, 227), (0.10132218984016486, 169), (0.10132218984016486, 5), (0.10129687975732969, 2385), (0.10126776819935551, 3117), (0.10063103908292556, 284), (0.10055954160111301, 3081), (0.10031435374070032, 1260), (0.10028094106951953, 1317), (0.10027605850365232, 3072), (0.1000059209109059, 2336), (0.1000059209109059, 479), (0.09995417863737927, 1670), (0.09946866203075326, 299), (0.09937460223662734, 1955), (0.09937460223662734, 355), (0.0991931372321024, 3367), (0.0991931372321024, 3052), (0.0991931372321024, 2987), (0.0991931372321024, 614), (0.09885234039929348, 1496), (0.0985825853170792, 2753), (0.09833844719113422, 3349), (0.09833844719113422, 2118), (0.09828284940929058, 900), (0.09826909686300346, 2262), (0.09826909686300346, 1765), (0.09826909686300346, 904), (0.09826909686300346, 652), (0.09820798725090112, 2536), (0.09820798725090112, 1967), (0.0979795780346747, 2907), (0.09782691886062657, 377), (0.09760724210433858, 3516), (0.09755885308766699, 3164), (0.09755885308766699, 683), (0.09730186511202356, 3329), (0.09730186511202356, 1733), (0.09730186511202356, 1226), (0.097102913934461, 2625), (0.09610978450473183, 2087), (0.09582399417186592, 1439), (0.09577717071956568, 47), (0.09574004674208489, 2532), (0.09567949353604623, 153), (0.09563595118779827, 1248), (0.09563595118779827, 800), (0.0955218528925641, 2265), (0.0954330687710674, 1715), (0.09490960244197376, 3079), (0.09479895154722345, 3167), (0.09479895154722345, 2182), (0.09464204684604893, 2919), (0.09464204684604893, 1007), (0.09464204684604893, 421), (0.0945793543479756, 3346), (0.0945793543479756, 3214), (0.09456116933710224, 1829), (0.09452473946342346, 736), (0.09441875395888008, 3102), (0.09441875395888008, 1541), (0.09418492749174653, 52), (0.0939222882360469, 3558), (0.0939222882360469, 3419), (0.0939222882360469, 2608), (0.0939222882360469, 2598), (0.09392068680284914, 3344), (0.09392068680284914, 2173), (0.09392068680284914, 1138), (0.09392068680284914, 461), (0.09392068680284914, 34), (0.09379123891116847, 2584), (0.09353081179807116, 3259), (0.09353081179807116, 1302), (0.09353081179807116, 293), (0.09309370020530645, 2639), (0.09309370020530645, 2294), (0.09309370020530645, 2083), (0.09309370020530645, 1944), (0.09309370020530645, 162), (0.09298771310954623, 741), (0.09298771310954623, 140), (0.09292587512205373, 1929), (0.09289423937435062, 3561), (0.09274784637141024, 3307), (0.09274784637141024, 2126), (0.09274784637141024, 2025), (0.09274784637141024, 1418), (0.09254637783999758, 217), (0.09226460305753335, 3403), (0.09226460305753335, 1687), (0.09226460305753335, 1592), (0.09192383607443329, 3315), (0.09192383607443329, 875), (0.09183495854900056, 2985), (0.09183495854900056, 1596), (0.09173493202889069, 1770), (0.09173493202889069, 431), (0.09173143027976542, 2876), (0.09113344147288725, 3120), (0.09060526255265101, 3381), (0.09060526255265101, 2287), (0.09060526255265101, 1836), (0.09060526255265101, 1769), (0.09050760723810075, 326), (0.08995529378430658, 340), (0.08987429575682436, 1969), (0.08982977958803778, 1812), (0.08974209619577075, 838), (0.08963253567327513, 2169), (0.08951903081805541, 2618), (0.08947267121555101, 989), (0.08926541208781298, 1369), (0.0890462273393359, 893), (0.0890462273393359, 482), (0.0888304568052451, 1118), (0.08864375178731801, 2759), (0.08862582335907176, 3128), (0.08856874594603148, 2408), (0.08847924280717331, 3541), (0.08847924280717331, 2706), (0.08845733589313011, 1614), (0.08843074951990057, 1330), (0.08827578191477906, 2529), (0.08827578191477906, 548), (0.08811593995641924, 2768), (0.08795612661377235, 1848), (0.0878632294425667, 3204), (0.0878632294425667, 2905), (0.0877915209166029, 2732), (0.08724002705412705, 3125), (0.08681879523440901, 472), (0.0867590941431764, 1371), (0.08591449282742145, 3413), (0.08591449282742145, 1793), (0.08591449282742145, 439), (0.08569361517932625, 2429), (0.08569361517932625, 1886), (0.08564019433508445, 2981), (0.08564019433508445, 2571), (0.08564019433508445, 1852), (0.08564019433508445, 145), (0.0855146046919488, 3001), (0.08482470727509915, 107), (0.08474214619355472, 291), (0.08474214619355472, 92), (0.08464630577025285, 1353), (0.08447795462677392, 83), (0.08442221636455624, 2373), (0.08435306298004447, 3302), (0.08435306298004447, 1842), (0.08435306298004447, 885), (0.08406143202879186, 961), (0.08374180878487095, 2901), (0.08352466261109656, 1451), (0.08248922005074939, 1131), (0.08238017336779274, 2415), (0.08216565036306289, 922), (0.08170778577083812, 503), (0.08139930660843568, 749), (0.0810873859250381, 2703), (0.08099924967644831, 3375), (0.08036733484765383, 103), (0.08024334048387935, 1346), (0.08024334048387935, 1055), (0.08024334048387935, 828), (0.07995951135307515, 2913), (0.07995254170536943, 3142), (0.07975739071961907, 1238), (0.07961368503404338, 3145), (0.07961368503404338, 1102), (0.0791011342722481, 2629), (0.07909734484039603, 375), (0.07903458017917456, 960), (0.07865148217479348, 1387), (0.0779646282219197, 3122), (0.0779646282219197, 350), (0.07794818207773628, 2696), (0.07791539520575948, 2197), (0.07791539520575948, 1425), (0.07791539520575948, 1410), (0.07791539520575948, 1270), (0.07791539520575948, 1209), (0.07791539520575948, 1108), (0.07777326253628294, 2052), (0.07777326253628294, 954), (0.07777326253628294, 812), (0.07776976305397286, 435), (0.0776760937385194, 3588), (0.07766249907323657, 1286), (0.0768120675986713, 979), (0.07633605683651937, 1618), (0.07610302341355955, 1345), (0.07610302341355955, 1329), (0.07610302341355955, 938), (0.07610302341355955, 754), (0.07610302341355955, 502), (0.07493632088882671, 1281), (0.07486036923106522, 3114), (0.07486036923106522, 759), (0.07479212341391864, 3109), (0.07479212341391864, 1125), (0.07479212341391864, 711), (0.07479212341391864, 445), (0.07479212341391864, 25), (0.0744210537557175, 3470), (0.0744210537557175, 1928), (0.0744210537557175, 1280), (0.0744210537557175, 1243), (0.0744210537557175, 1018), (0.0744210537557175, 708), (0.0740577155592499, 726), (0.07358418456629864, 1743), (0.07309840122961515, 1219), (0.07303416054815363, 252), (0.07271877218739466, 3241), (0.07184102679685105, 121), (0.07182717404842677, 587), (0.07177500880745105, 2964), (0.07127209654963827, 120), (0.07087579658806266, 1316), (0.07069880693740326, 339), (0.07068023149332683, 2306), (0.07068023149332683, 253), (0.07065433840741699, 1033), (0.07058992698239872, 3555), (0.07043170609309371, 360), (0.07023970587779339, 1004), (0.06996622272883518, 3203), (0.06996622272883518, 1585), (0.06996622272883518, 1581), (0.06943213017724599, 1461), (0.06931620630006176, 1538), (0.06923101778513037, 1918), (0.06921851239026898, 2146), (0.06914996226685433, 2312), (0.06911832282266693, 206), (0.06905411184938241, 2212), (0.06879868009883609, 1498), (0.06879341064374712, 3369), (0.06829991205551972, 485), (0.06793743237297642, 3094), (0.06793743237297642, 2568), (0.06793743237297642, 2509), (0.06793743237297642, 1624), (0.06793743237297642, 1311), (0.06793743237297642, 830), (0.06793743237297642, 193), (0.06771012152570943, 896), (0.06760842116575855, 3518), (0.06728576906303034, 3478), (0.06728576906303034, 2945), (0.06728576906303034, 2592), (0.06728576906303034, 2586), (0.06728576906303034, 1111), (0.06726031274341861, 2835), (0.0668936390304386, 3283), (0.06683941035275678, 1153), (0.06670561404578652, 3300), (0.06670561404578652, 2952), (0.06670561404578652, 2949), (0.06670561404578652, 2890), (0.06670561404578652, 2481), (0.06670561404578652, 1070), (0.06616432949033017, 3503), (0.0660445367892345, 3515), (0.06603516959037964, 3352), (0.06603516959037964, 1701), (0.06594330439800165, 3537), (0.06529883585157686, 3418), (0.06529883585157686, 2650), (0.06466761703140791, 2780), (0.06451756127861434, 2546), (0.06412036684718043, 906), (0.06406825327936377, 393), (0.06389147199964199, 1562), (0.06389147199964199, 547), (0.06296277600534345, 1898), (0.06295775824880319, 1832), (0.06295775824880319, 1144), (0.06273519650642477, 2108), (0.06257557985594793, 2438), (0.06250818347087828, 2543), (0.06237266652354673, 1818), (0.062097593396214186, 2744), (0.06179423738961337, 925), (0.06141211575679981, 2260), (0.060781144623716234, 3570), (0.06066322422717442, 2844), (0.060370008276426454, 3338), (0.06029861224248649, 2784), (0.06029861224248649, 1986), (0.06029861224248649, 1543), (0.06005526613023247, 897), (0.05947175378230543, 1763), (0.05909565017478048, 1849), (0.05909352311701952, 1352), (0.058961537911610754, 3510), (0.058961537911610754, 3055), (0.058961537911610754, 2737), (0.058961537911610754, 2292), (0.058961537911610754, 1475), (0.058958973694166104, 3589), (0.058958973694166104, 2651), (0.058958973694166104, 1731), (0.058958973694166104, 474), (0.05832232735424722, 484), (0.05776314858186377, 2356), (0.057539284349787875, 2724), (0.057539284349787875, 2716), (0.057539284349787875, 2272), (0.057539284349787875, 1980), (0.057539284349787875, 1713), (0.057539284349787875, 1604), (0.057539284349787875, 1449), (0.057539284349787875, 75), (0.057539284349787875, 61), (0.05679666092137163, 997), (0.05679666092137163, 580), (0.056729924333008365, 2637), (0.056729924333008365, 831), (0.05655015464811865, 487), (0.05652766823426947, 2030), (0.05640871242395038, 735), (0.05614386926874535, 758), (0.0559063955350394, 3184), (0.0559063955350394, 3031), (0.0559063955350394, 2944), (0.0559063955350394, 2647), (0.0559063955350394, 2528), (0.0559063955350394, 2261), (0.0559063955350394, 1269), (0.0559063955350394, 1109), (0.0559063955350394, 554), (0.055648783133438656, 1407), (0.055648783133438656, 586), (0.055646362986584645, 1466), (0.05516895684450839, 2793), (0.054882824548443114, 3173), (0.054882824548443114, 2982), (0.054882824548443114, 2845), (0.054882824548443114, 2542), (0.054882824548443114, 1756), (0.054882824548443114, 899), (0.054882824548443114, 681), (0.054882824548443114, 285), (0.05486846085587583, 3026), (0.05484348857927268, 3469), (0.05484348857927268, 3465), (0.05484348857927268, 2989), (0.05484348857927268, 2879), (0.05484348857927268, 2754), (0.05484348857927268, 2406), (0.05484348857927268, 1730), (0.05484348857927268, 1667), (0.05484348857927268, 1665), (0.05484348857927268, 1615), (0.05484348857927268, 1471), (0.05484348857927268, 1191), (0.05484348857927268, 1100), (0.05484348857927268, 1079), (0.05484348857927268, 851), (0.05484348857927268, 458), (0.054487189903820656, 2204), (0.05430643890657519, 138), (0.054058095179772864, 944), (0.054022724280419834, 3212), (0.05402202766157935, 1762), (0.0533750821753445, 1695), (0.05306742820929221, 2192), (0.05276529397122469, 2809), (0.05276529397122469, 2057), (0.05276529397122469, 1691), (0.0523101884772147, 1923), (0.05215992194245664, 1550), (0.052012698561421676, 2377), (0.052012698561421676, 1984), (0.052012698561421676, 1039), (0.052012698561421676, 149), (0.05179923233388806, 3394), (0.05179923233388806, 846), (0.051762106456659567, 2863), (0.051472967058906464, 1912), (0.051217574472353734, 2778), (0.05110058750877395, 2041), (0.050966072229566624, 1630), (0.05077445418126315, 3336), (0.05077445418126315, 2656), (0.05077445418126315, 2570), (0.05077445418126315, 2522), (0.05077445418126315, 2121), (0.05077445418126315, 2045), (0.05077445418126315, 2010), (0.05077445418126315, 1726), (0.05077445418126315, 1655), (0.05077445418126315, 1509), (0.05077445418126315, 1507), (0.05077445418126315, 732), (0.05077445418126315, 524), (0.05077445418126315, 422), (0.05077445418126315, 196), (0.05077445418126315, 171), (0.05077445418126315, 99), (0.050539089094784995, 100), (0.05053664694441642, 3568), (0.050492996404728846, 2961), (0.050036275129686114, 396), (0.05003297559110967, 2029), (0.04984891386860787, 917), (0.04961138883973778, 143), (0.04958598961322054, 3056), (0.049575831047697035, 1283), (0.048727246055628254, 2248), (0.04872402143683834, 1101), (0.047921690809483164, 1603), (0.047921690809483164, 1321), (0.047921690809483164, 1017), (0.04791436558471306, 2622), (0.04791436558471306, 1241), (0.04770759660795472, 717), (0.04694083335282966, 289), (0.04677698779883914, 2757), (0.04666642228091436, 2141), (0.04647288993080121, 2484), (0.04637599875831547, 2512), (0.045897622985651414, 139), (0.045799053702209366, 1344), (0.04570679344810075, 2147), (0.04516689835379344, 1172), (0.04492238369553648, 1149), (0.04452311366966795, 3051), (0.04452311366966795, 2743), (0.04452311366966795, 2535), (0.04452311366966795, 1784), (0.04452311366966795, 1780), (0.04452311366966795, 1511), (0.04452311366966795, 1245), (0.04452311366966795, 520), (0.04431291167953588, 3124), (0.04431291167953588, 2471), (0.04431291167953588, 2230), (0.04431291167953588, 1380), (0.04379233051095153, 3250), (0.04370894283540041, 2372), (0.04342726715205229, 477), (0.04339655458297072, 1349), (0.04289303347380985, 1420), (0.04209795683366029, 2573), (0.04202158194623495, 2401), (0.04202158194623495, 1294), (0.0419602893158302, 3107), (0.04182319015766572, 3536), (0.04182319015766572, 2839), (0.04182319015766572, 2765), (0.04182319015766572, 1597), (0.04182319015766572, 475), (0.04120970047603527, 2595), (0.04118433740575306, 2043), (0.0410712841055371, 3050), (0.04099650527849089, 1442), (0.04049252050189614, 1797), (0.04024671694278536, 1938), (0.040121670241939675, 3222), (0.040121670241939675, 2395), (0.040121670241939675, 1682), (0.040121670241939675, 1195), (0.040121670241939675, 844), (0.040121670241939675, 294), (0.040056704625578095, 1482), (0.03984593632828475, 2878), (0.03939272315558761, 3076), (0.0390809923939327, 405), (0.038398821000790784, 3545), (0.03814509952790994, 1161), (0.03801064136229472, 321), (0.03786743367501903, 468), (0.037566983103707936, 2969), (0.03725182003350967, 1723), (0.037238370858689175, 2767), (0.03696154627105317, 3205), (0.03679414699666566, 864), (0.036268027377411485, 2345), (0.035970320215902754, 3057), (0.034899356647054146, 3270), (0.03454974613444602, 2350), (0.034383816197631145, 2436), ...]

마지막으로 index를 단어로 변환하여 "긍정 키워드 리스트"와 "부정 키워드 리스트"의 Top 20 단어를 출력해볼게요.

1
2
invert_index_vectorizer = {v: k for k, v in vect.vocabulary_.items()}
invert_index_vectorizer
 {2866: '집중', 3588: '휴식', 2696: '제공', 2311: '위치', 1584: '선정', 790: '또한', 2927: '청소', 2925: '청결', 1527: '상태', 2392: '이상', 3022: '침대', 2388: '이불', 3021: '침구', 299: '교체', 2013: '어메니티', 1296: '보강', 1277: '베스트', 2299: '웨스턴', 3564: '회원', 185: '경우', 106: '객실', 3009: '층수', 2234: '요청', 2606: '적극', 1188: '반영', 2837: '지인', 1629: '소개', 2910: '처음', 611: '당황', 1607: '세면', 675: '도구', 2555: '잠옷', 3358: '필수', 361: '그것', 2673: '정도', 578: '다음', 2074: '여기', 1171: '박만', 2595: '저녁', 981: '맥주', 3414: '한잔', 838: '렌트', 791: '뚜벅', 1159: '바로', 1247: '버스', 2676: '정류', 697: '도착', 24: '가방', 2487: '일찍', 2685: '정비', 1225: '방이', 2500: '입실', 2038: '업그레이드', 2849: '직원', 2680: '정말', 1148: '바다', 2623: '전망', 2636: '전일', 3425: '함덕', 624: '대명', 3091: '콘도', 1861: '실내', 1384: '분위기', 1659: '손님', 40: '가장', 1241: '배치', 651: '대해', 634: '대응', 1889: '써비스', 2730: '조식', 1351: '부분', 1838: '신경', 1922: '아주', 3208: '특급', 3191: '트랜디', 210: '고민', 3593: '흔적', 2082: '여름', 1700: '수영장', 1483: '사용', 1297: '보고', 2035: '엄마', 2: '가격', 627: '대비', 2769: '주위', 924: '마트', 1826: '식당', 1816: '시장', 1217: '방문', 2361: '의사', 726: '동안', 2695: '정해진', 3580: '휘슬', 269: '공항', 1539: '생각', 1809: '시설', 1028: '모두', 3017: '친절', 1029: '모드', 917: '마지막', 900: '마무리', 3156: '테라스', 2612: '전경', 2427: '인근', 2583: '재래시장', 1979: '야시장', 2402: '이용도', 2400: '이용', 2488: '일차', 3581: '휘슬락', 2940: '체크', 2761: '주변', 2094: '여친', 2975: '추억', 26: '가성', 2977: '추천', 3575: '후회', 2145: '예전', 372: '그랜드', 2605: '저희', 1918: '아이', 708: '돌잔치', 581: '다정', 3470: '했었더랬', 2642: '전통', 1004: '메종', 387: '글래드', 1563: '서비스', 969: '매우', 3428: '합리', 635: '대의', 1018: '명절', 1721: '숙박', 1928: '아티', 1243: '백미', 3061: '커피', 1280: '베이커리', 43: '가족', 3342: '플러스', 2816: '지금', 2257: '우선', 2664: '접근성', 1671: '쇼핑', 940: '만족도', 2957: '최고', 1078: '무엇', 423: '기억', 2251: '우리', 2902: '찾기', 300: '교통', 2418: '이틀', 2691: '정원', 109: '거기', 160: '겨울', 3016: '친구', 541: '놀러와', 3185: '투숙', 1981: '야외', 1235: '방향', 1976: '야간', 2726: '조명', 1723: '순간', 638: '대접', 1868: '실명', 112: '거론', 3337: '프론트', 2378: '이름', 1938: '안나', 416: '기분', 1037: '모습', 2921: '첫날', 1761: '스타트', 576: '다시', 1578: '선물', 3032: '카운터', 1939: '안내', 777: '디너', 438: '기회', 1121: '미니바', 1067: '무료', 2959: '최근', 281: '관광지', 1719: '숙고', 88: '강추', 1977: '야경', 2475: '일부러', 2476: '일어나서', 714: '동네', 1168: '바퀴', 990: '먹방', 1843: '신라', 3105: '퀄리티', 1024: '모녀', 2711: '제주시', 2313: '위해', 1586: '선택', 2180: '오픈', 2143: '예약', 622: '대로', 115: '거리', 657: '더군다나', 1627: '셔틀버스', 2271: '운행', 670: '데스크', 2880: '차안', 1374: '분도', 2438: '인상', 3201: '트윈', 1489: '사이즈', 939: '만족', 1758: '스타', 45: '가짓수', 558: '느낌', 3538: '화장실', 505: '내부', 2455: '인테리어', 2859: '질적', 2368: '이건', 100: '개인', 3005: '취향', 321: '구비', 273: '과일', 480: '나이프', 3295: '포크', 1364: '부탁', 2786: '준비', 3305: '표방', 1046: '모텔', 165: '결론', 3577: '훌륭', 1799: '시간', 1737: '슈페리어킹룸', 3376: '하루', 3570: '후기', 2836: '지은지', 2033: '얼마', 136: '건물', 1985: '약간', 2318: '유럽', 1760: '스타일', 378: '그림', 2715: '조각', 1323: '복도', 2633: '전시', 2630: '전부', 3039: '카펫', 770: '등급', 567: '다른', 2394: '이서', 2512: '자기', 2722: '조금', 2218: '외투', 2206: '완전', 2856: '진짜', 1626: '셔틀', 1127: '미리', 1821: '시티', 2162: '오름', 570: '다만', 680: '도로', 39: '가인', 276: '관계', 2876: '차량', 1638: '소리', 574: '다소', 1215: '방도', 3273: '편의점', 3027: '칫솔', 709: '동계', 3576: '훈련', 795: '라마', 2116: '연인', 2641: '전체', 1493: '사진', 2920: '첨부', 2064: '엘리베이터', 1873: '실시간', 1440: '비행기', 3151: '택시', 1128: '미만', 2374: '이동', 9: '가능', 2961: '최상', 2235: '욕실', 1791: '슬리퍼', 2304: '위생', 2123: '염려', 1590: '설날', 788: '떡국', 840: '려고', 3495: '현장', 167: '결재', 3559: '황스', 841: '려운', 2789: '중국', 932: '만두', 2744: '종류', 1293: '별로', 316: '구만', 996: '메뉴', 603: '답변', 2709: '제일', 2779: '주차', 131: '걱정', 3423: '할아버지', 1945: '안심', 3067: '컨디션', 1095: '문어', 2909: '처리', 3561: '회사', 2988: '출장', 1567: '서울', 64: '간혹', 2386: '이벤트', 3460: '해주시', 1344: '부대', 3435: '항상', 855: '롯데', 1434: '비지니스', 2097: '여행객', 1664: '손색', 2236: '욕조', 175: '겸비', 1459: '사계절', 1715: '수풀', 2794: '중문', 3306: '표선등', 2281: '원거리', 2101: '여행지', 1322: '복귀', 1805: '시내', 2323: '유명', 2462: '일단', 2781: '주차장', 2844: '지하', 246: '공간', 2356: '응대', 1097: '문의사항', 1850: '신지', 71: '감동', 2106: '역시', 2566: '장도', 807: '락타', 1550: '샤워', 896: '마련', 3089: '코인', 1620: '세탁실', 2167: '오션', 994: '멀리', 497: '남자친구', 665: '덕분', 2385: '이번', 3331: '프런트', 1239: '배정', 2415: '이착륙', 3120: '클리닝', 382: '근무', 1923: '아주머니', 2436: '인사', 3085: '코로나', 1496: '사태', 535: '노화', 1286: '벽지', 2756: '주름', 2814: '지고', 3133: '타일', 4: '가구', 3082: '코너', 243: '곳곳이', 279: '관광객', 2449: '인지', 1463: '사람', 1369: '북적', 2627: '전반', 284: '관리', 3274: '편이', 3346: '피드백', 3276: '편입', 686: '도시', 278: '관광', 3214: '특화', 2834: '지역', 385: '근처', 3034: '카페', 6: '가기', 221: '고유', 3210: '특색', 1768: '스테이', 10: '가도', 1759: '스타벅스', 1263: '번화가', 1924: '아침', 3057: '커서', 1224: '방음', 988: '먹거리', 588: '단점', 797: '라면', 2170: '오심', 2411: '이중', 3523: '혼자', 157: '겐찮은듯', 563: '다그', 694: '도일', 456: '께빵', 2793: '중국인', 3127: '타고', 556: '눈앞', 44: '가지', 3598: '힐링', 3354: '피트니스', 3254: '패키지', 1122: '미닫이', 847: '로비', 1421: '비롯', 1030: '모든', 52: '각종', 1103: '물건', 1926: '아침식사', 1207: '밥맛', 3349: '피아노', 2118: '연주', 867: '룸타입', 3250: '패밀리', 121: '거실', 3412: '한실', 1562: '서부', 1690: '수산시장', 1534: '새벽', 182: '경매', 304: '구경', 2972: '추가', 2022: '어차피', 3496: '현재', 1090: '묵고', 2453: '인터넷', 2840: '지정', 1952: '안해', 3330: '프런터', 1096: '문의', 2135: '영화', 1810: '시스템', 3219: '티브이', 2903: '채널', 1020: '몇개', 3092: '콘센트', 3341: '플러그', 2201: '와이프', 2995: '충전', 168: '결정', 594: '달라', 190: '경험', 2579: '장점', 2439: '인생', 2966: '최악', 2797: '중심', 1153: '바닷가', 1413: '비교', 3275: '편임', 3408: '한번', 2146: '예정', 3585: '휴가', 1750: '스위트룸', 2322: '유리창', 2312: '위트', 3050: '캠핑', 3160: '테이블', 1621: '세트', 3161: '텐트', 2054: '에어컨', 2543: '작은방', 975: '매트', 2520: '자리', 3142: '탑동', 263: '공원', 3338: '프리', 923: '마켓', 259: '공연', 971: '매일', 1833: '식사', 282: '관덕정', 2682: '정문', 684: '도보', 1645: '소요', 3458: '해장국', 717: '동문', 1560: '서문시장', 1047: '목관', 960: '맞은편', 1792: '슬슬', 1291: '별관', 1330: '본관', 68: '갈수', 2965: '최신', 377: '그린', 3545: '환경', 787: '때문', 1292: '별도', 641: '대중교통', 317: '구매', 1882: '심플', 1438: '비품', 3205: '트윈침대', 1763: '스탠다드', 548: '높이', 3404: '한라산', 525: '노곤', 3152: '터미널', 2189: '온돌룸', 1608: '세면대', 1114: '물이', 3013: '치약', 150: '것임', 1545: '생수', 3550: '환승', 231: '곧바로', 710: '동광양', 2677: '정류장', 1818: '시청', 1771: '스텝', 3502: '협소하', 130: '거품', 3131: '타월', 3537: '화장', 612: '대가', 123: '거울', 1670: '쇼파', 2739: '조합', 395: '금액', 2780: '주차공간', 267: '공터', 3150: '태풍', 104: '개층', 2184: '오후', 3409: '한시', 1485: '사우나', 1349: '부모님', 3422: '할머니', 1038: '모시', 197: '계획', 2464: '일로', 1445: '빠듯해', 2004: '어디', 441: '길가', 235: '골목길', 2377: '이륙', 2887: '착륙', 1310: '보이', 363: '그냥', 2469: '일반', 633: '대욕', 3489: '헬스장', 19: '가면', 206: '고려', 837: '렌터카', 2496: '입구', 1182: '반대쪽', 3416: '한정', 591: '단체', 660: '더블', 2708: '제외', 2088: '여유', 1183: '반대편', 688: '도심', 1387: '불구', 1648: '소음', 125: '거의', 1609: '세명', 3199: '트리플', 2618: '전날', 495: '남아', 2534: '자체', 610: '당일', 2683: '정보', 3468: '햇반', 2580: '장조림', 2637: '전자', 831: '레인지', 33: '가야', 1610: '세미나', 3400: '한국인', 369: '그대로', 469: '나름', 2697: '제과점', 2670: '정거장', 1022: '모기', 944: '만해', 898: '마리', 16: '가량', 1222: '방안', 2058: '에프킬라', 1435: '비치', 195: '계속', 1456: '뿌리', 2557: '잡고', 2891: '찬장', 2915: '천장', 242: '곳곳', 3008: '측은', 1265: '벌레', 414: '기본', 2223: '요금', 135: '건너편', 1262: '번호', 1538: '샐러드', 2349: '음식', 326: '구성', 2629: '전복죽', 2601: '저번', 3464: '핸드폰', 2996: '충전기', 1400: '불편', 1622: '센터', 256: '공사', 1720: '숙면', 1061: '무난', 528: '노력', 2826: '지불', 1430: '비용', 845: '로맨틱', 702: '독립', 1368: '북유럽', 2321: '유리', 3059: '커튼', 1145: '바깥', 1595: '설치', 1025: '모던', 1418: '비데', 3569: '효율', 2451: '인치', 1512: '삼성', 927: '만끽', 3270: '편안함', 2091: '여정', 1151: '바닥', 1052: '목적', 3060: '커플', 464: '끼리', 2852: '직진', 2268: '운전', 261: '공영', 1962: '애기', 1074: '무선인터넷', 80: '갑자기', 1568: '서전', 3432: '항공', 562: '다가', 5: '가급', 169: '결제', 2342: '은방', 1533: '상황', 1914: '아시', 227: '고트', 2822: '지도', 1614: '세심', 257: '공시', 1815: '시작', 982: '맥주잔', 3102: '쿠폰', 2463: '일도', 3108: '크기', 864: '룸서비스', 2690: '정신', 3277: '평가', 3272: '편의', 2233: '요즘', 2078: '여러', 2848: '직언', 1412: '블룸', 1288: '변기', 1115: '물질', 1997: '얘기', 1675: '수건', 3548: '환불', 2293: '월일', 3313: '푸른', 3223: '파도', 2918: '철썩', 3320: '풍경', 1544: '생선회', 2573: '장소', 543: '놀이', 1989: '양도', 735: '돼지', 2613: '전골', 970: '매운탕', 3512: '형편', 1406: '브런치', 751: '뒤쪽', 956: '맛집', 2869: '쭈욱', 79: '갑인', 764: '드타', 1233: '방파제', 3567: '횟집', 3129: '타운', 3448: '해산물', 356: '규모', 7: '가까이', 2008: '어르신', 454: '깨끗', 629: '대신', 2538: '작고', 1697: '수영', 1912: '아쉬움', 2430: '인도', 1634: '소독약', 1745: '스비', 3525: '홀로', 775: '등정후', 1365: '부터', 3520: '혹시', 3543: '확인', 2645: '전화', 3180: '통해', 3582: '휘트니', 2266: '운동복', 1698: '수영모', 219: '고오', 1157: '바람', 631: '대여', 2093: '여직원', 1077: '무시', 951: '말투', 2284: '원래', 2700: '제로', 2267: '운영', 2470: '일반인', 2503: '입장', 1583: '선심', 3360: '필요', 430: '기전', 620: '대뜸', 3528: '화가', 200: '고객', 3343: '플레인', 1800: '시경', 1917: '아웃', 3382: '하야', 998: '메리어트', 2081: '여럿', 2397: '이어도', 1707: '수준', 2370: '이군', 1867: '실망', 2747: '종일', 880: '리셉션', 3070: '컨시어', 3147: '태도', 2319: '유료', 1460: '사고', 3393: '학생', 1580: '선생님', 2005: '어딘', 1498: '사항', 1075: '무슨', 128: '거지', 879: '리빙룸', 3368: '하나요', 3202: '트윈룸', 1065: '무려', 156: '게재', 1869: '실물', 2881: '차이', 1879: '실화', 3231: '파우더', 240: '곰팡이', 2511: '자국', 2539: '작동', 233: '골드스타', 517: '냉장고', 2649: '절대', 826: '레스토랑', 2513: '자꾸', 2687: '정색', 1510: '살짝', 1561: '서버', 669: '데리', 32: '가신', 470: '나머지', 1105: '물기', 2851: '직접', 2931: '체계', 2048: '엉망', 1630: '소규모', 1803: '시기', 910: '마음', 886: '리트', 794: '라그', 409: '기대', 1862: '실내수영장', 1701: '수온', 1749: '스위트', 1427: '비수', 1515: '상대', 536: '노후', 2669: '정가', 1072: '무리', 3424: '할인', 3473: '행사', 2893: '참고', 3298: '포함', 913: '마일리지', 650: '대한항공', 3377: '하룻밤', 3542: '확실', 2115: '연식', 201: '고급', 2280: '원가', 1566: '서우', 3453: '해수욕장', 3402: '한눈', 2900: '창문', 161: '겨울철', 2187: '온도', 870: '리기', 1214: '방기', 725: '동시', 1221: '방식', 621: '대략', 695: '도정', 1352: '부스', 2137: '옆방', 3220: '티비', 3001: '취침', 2946: '초등학생', 1996: '양호', 3411: '한식당', 2875: '차라리', 1184: '반드시', 3107: '크게', 1896: '씨유', 674: '델문', 3035: '카페나', 3452: '해수욕', 2969: '최적', 778: '디럭스', 1203: '발코니', 1034: '모로', 3203: '트윈룸입니', 1585: '선착순', 2142: '예술', 1106: '물놀이', 1031: '모래', 3352: '피크', 1817: '시즌', 491: '날씨', 1581: '선선', 381: '근래', 3269: '편리', 3086: '코르', 434: '기지', 1481: '사양', 2782: '주체', 302: '교회', 2653: '절반', 2440: '인수', 1314: '보임', 1927: '아트', 2976: '추정', 3333: '프로', 3264: '페셔', 2432: '인력', 976: '매트리스', 472: '나무', 3482: '허리', 1934: '안감', 3447: '해변', 2275: '워낙', 31: '가시', 2757: '주말', 3397: '한국', 1270: '벚꽃', 403: '기간', 3503: '협재', 2197: '옹포', 1209: '밥집', 1505: '산책', 860: '루프', 1425: '비바람', 1396: '불어', 1410: '블로거', 1108: '물떄', 360: '그거', 2308: '위주', 3317: '풀이', 2192: '온수', 1133: '미온수', 1132: '미온', 2536: '자쿠지', 2551: '잠깐', 2458: '인피니트', 3549: '환상', 3365: '하나', 1782: '스페', 3015: '치킨', 1446: '빠에야', 1779: '스파', 333: '구조', 1780: '스파룸', 2535: '자쿠', 2401: '이용권', 3371: '하니', 1487: '사이', 1820: '시트', 2678: '정리', 1511: '삼다수', 1294: '병과', 520: '네스프레소', 3051: '캡슐', 2089: '여자', 3347: '피로', 1784: '스페인', 2132: '영업', 2743: '종료', 1245: '버거', 2161: '오른쪽', 893: '마담', 482: '나탈리', 2351: '음악', 3362: '필터', 1875: '실외수영장', 147: '검색', 2186: '옥상', 164: '결과', 653: '대형', 942: '만큼', 1260: '번잡', 98: '개수대', 2407: '이전', 1909: '아무', 884: '리지', 2714: '제한', 189: '경치', 2403: '이웃', 2467: '일몰', 1877: '실제', 883: '리조트', 3527: '홍보', 1529: '상통', 3532: '화산', 1166: '바위', 2686: '정상', 431: '기점', 1770: '스템', 2556: '잠자리', 435: '기타', 1359: '부족함', 444: '길이', 582: '다행', 2792: '중국어', 2131: '영어', 692: '도움', 3438: '해결', 1053: '목적지', 3461: '해피', 2346: '음료', 1488: '사이다', 2764: '주스', 592: '달걀', 3014: '치즈', 3597: '히터', 3187: '투어', 3515: '호스텔', 2858: '질문', 1530: '상품', 270: '과거', 154: '게스트하우스', 2510: '자고', 2150: '오기', 2479: '일이', 1201: '발전', 2141: '예상', 3165: '토스터', 2424: '이후', 1635: '소등', 1399: '불키', 2733: '조용조', 1232: '방키', 218: '고여', 496: '남자', 1946: '안전', 2878: '차로', 2373: '이내', 1403: '뷔페', 2076: '여느', 856: '롯데리아', 1216: '방만', 224: '고정', 1060: '무궁화', 1676: '수기', 1490: '사이트', 3526: '홈페이지', 921: '마치', 1088: '무척', 2617: '전기차', 134: '건너', 402: '급속', 1628: '소가', 2333: '유치원', 2784: '주택가', ...}

1
2
for coef in coef_pos_index[:20]:
print(invert_index_vectorizer[coef[1]], coef[0])
방문 1.2644550507381787이용 0.9079356150239053바다 0.895609472071521조식 0.8859075267474583가족 0.8795111499693716가성 0.8541915649753757다음 0.8362541212560809최고 0.7714811231976703사장 0.7375280889735719맛집 0.7203390936359615추천 0.6503260268852225거리 0.6488836121942877마음 0.6467914172687944바로 0.6264469987695738리조트 0.5943145305412955출장 0.5505354129422678도움 0.5294632094678557인테리어 0.5240729254152497아주 0.5207834696883535의사 0.5153917648445299

1
2
for coef in coef_neg_index[:20]:
print(invert_index_vectorizer[coef[1]], coef[0])
예약 -0.9945592515966041냄새 -0.9190158099937462다른 -0.8672956005075485침대 -0.7519681298547074보이 -0.7201222787741572최악 -0.7142499739127354에어컨 -0.6786616478611768별로 -0.6742178511586063찾기 -0.6584721911054098취소 -0.6464141509409321사람 -0.6451323735594592정도 -0.6240099604615805사진 -0.6089303470147718대부분 -0.5889712626646347다시 -0.5601302753897155대해 -0.5518124209379022노후 -0.5484791097700695느낌 -0.5423970967095598필요 -0.5413974621071783문제 -0.5287746123667489

키워드를 살펴보면:

  • 이용객들이 보통 제주 호텔의 바다뷰 혹은 바다 접근성, 주변 맛집 그리고 인테리어 등에 만족하는 것으로 보입니다.
  • 하지만 숙소의 냄새 그리고 침대, 에어컨 등 시설의 상태가 많이 아쉬워 보이고 개선이 필요해보입니다.
Top Articles
Latest Posts
Article information

Author: Lilliana Bartoletti

Last Updated: 01/27/2023

Views: 5769

Rating: 4.2 / 5 (53 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Lilliana Bartoletti

Birthday: 1999-11-18

Address: 58866 Tricia Spurs, North Melvinberg, HI 91346-3774

Phone: +50616620367928

Job: Real-Estate Liaison

Hobby: Graffiti, Astronomy, Handball, Magic, Origami, Fashion, Foreign language learning

Introduction: My name is Lilliana Bartoletti, I am a adventurous, pleasant, shiny, beautiful, handsome, zealous, tasty person who loves writing and wants to share my knowledge and understanding with you.