【数据分析实战】数据分析及可视化实战:豆瓣电影数据分析

坚强是说给别人听的谎言 提交于 2020-02-21 18:39:04

本次数据:

来源豆瓣电影
40万条短评
50条以上评论电影1100多部

数据储存在sqlite数据库里
左侧点开Tables,可以看到有三张表
双击comment
在右侧点击数据标签可以查看
在这里插入图片描述
观察每行都有哪些数据

ID: 序号 TIME: 时间 MOVIEID: 豆瓣电影ID RATING: 该评论打分
CONTENT: 评论内容 CREATOR: 评论者 ADD_TIME:添加时间

“结巴”中文分词
https://github.com/fxsjy/jieba
• 支持三种分词模式: • 精确模式,试图将句子最精确地切开,适合文本分析; • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常
快,但是不能解决歧义; • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召
回率,适合用于搜索引擎分词。 • 支持繁体分词 • 支持自定义词典 • MIT 授权协议
安装:

pip install jieba
pip3 install jieba
import sqlite3
import pandas as pd
import jieba
from pyecharts.faker import Faker 
from pyecharts.charts import WordCloud
from pyecharts import options as opts
import math


#导入sqlite3和pandas,jiebad 词云图
#
FILTER_WORDS = ["知道",'电影',"片子","这么",'那么','怎么','是','的','这个','那个','什么','一部','这部','没有','觉得','认为',"\n",'....']
#建立过滤词列表   需要根据实际情况来调整过滤词列表 具体内容具体判断


def get_movie_id_list(min_comment_count):            #id
	movie_list = comment_data["MOVIEID"].value_counts()
	movie_list = movie_list[movie_list>min_comment_count]

	return movie_list.index

def get_comment_kw_counts(movie_id,count):     #汇总为一个函数,可以设置电影ID和要获取的评论数量
	comment_list = comment_data[comment_data["MOVIEID"]==movie_id]["CONTENT"]
	comment_str_all = ""
	for comment in comment_list:
		comment_str_all+=comment + "\n"
	seg_list =list(jieba.cut(comment_str_all))
	keywords_count = pd.Series(seg_list) 
	keywords_count = keywords_count[keywords_count.str.len()>1]
	keywords_count = keywords_count[~keywords_count.str.contains("|".join(FILTER_WORDS))]
	keywords_count = keywords_count.value_counts()[:count]

	return keywords_count

def get_movie_name_and_score(movie_id):
	movie_link = 'https://movie.douban.com/subject/{}/'.format(movie_id)
	#movie_data = pd.read_excel("douban_movie_data.xlsx")
	search_result = movie_data[movie_data["链接"]==movie_link].iloc[0]  #表格中包含重复的数 据,按照第一个筛选
	movie_name = search_result['电影名']
	movie_score = search_result['评分']

	return(movie_name,movie_score)



conn = sqlite3.connect("douban_comment_data.db")
comment_data = pd.read_sql_query("select*from comment;",conn)
movie_data = pd.read_excel("douban_movie_data.xlsx")
#连接数据库并读取表格 ‘select * from comment;‘是SQL语句表示从comment表格选取所有数据

#movie_list = comment_data["MOVIEID"].value_counts()
#movie_list = movie_list[movie_list>100]
#print(movie_list)
#print(movie_list.count())
#统计各个电影的评论数 筛选评论数大于100的电影

#print(get_movie_id_list(1000)
#
'''movie_id = "1292052"
comment_list = comment_data[comment_data["MOVIEID"]==movie_id]["CONTENT"]#根据ID筛选评论
#print(comment_list)

comment_str_all = ""
for comment in comment_list:
	comment_str_all+=comment + "\n"   #整合全部评论为一个字符串,以换行隔开

seg_list =list(jieba.cut(comment_str_all)) #获取分词后的列表
#print(seg_list)
keywords_count = pd.Series(seg_list)       #转换成Pandas的Series类型数据
#print(keywords_count)
keywords_count = keywords_count[keywords_count.str.len()>1] 
#利用str.len()筛选字符串长度 对于一个储存了字符串的Series数据
#可以使用.str.len()来获取各个字符串数据的长度


keywords_count = keywords_count[~keywords_count.str.contains("|".join(FILTER_WORDS))] 
#利用str. contains()筛选数据 .str.contains()里填一个字符串或者正则表达式
#反向选择不包含过滤词列表中词语的数据 表示取反 列表中True的变成False 列表中False的变成True
#print("|".join(FILTER_WORDS))    #re 知道|电影|片子|这么|那么|怎么|是|的|这个|那个|什么|一部|这部|没有|觉得|认为|

keywords_count = keywords_count.value_counts()[:30] #统计各个关键词的出现次数
print(keywords_count)'''

'''movie_id = "1292052"
keywords_counts = get_comment_keywords_counts(movie_id,30)

wordcloud = WordCloud()
wordcloud.add("",keywords_counts.index,keywords_counts.values,
	word_size_range=[20,100]
	
	)

wordcloud.render()'''

'''#根据电影ID在douban_movie_data找出电影名和评分
movie_link = 'https://movie.douban.com/subject/{}/'.fromat(movie_id)
movie_data = pd.read_excel("douban_movie_data.xlsx")
search_result = movie_data[movie_data["链接"]==movie_link].iloc[0]  #表格中包含重复的数 据,按照第一个筛选
movie_name = search_result['电影名']
movie_score = search_result['评分']'''

#movie_name,movie_id = get_movie_name_and_score("1292052")
#print(f'{movie_name} is {movie_id}')


#收集各个得分区域电影的TOP30关键ci
kw_list_by_score = [[]for i in range(10)]            #创建两个列表,储存关键词和出现次数  每个列表都含有十个列表
kw_counts_list_by_score = [[] for i in range(10)]

movie_id_list = get_movie_id_list(300)
for movie_id in movie_id_list:
	word_list = get_comment_kw_counts(movie_id,30)
	movie_name,movie_score = get_movie_name_and_score(movie_id)

	print(word_list) 

	try:
		kw_list_by_score[math.floor(movie_score)].extend(word_list.index)  #3.9 3.3 3
		kw_counts_list_by_score[math.floor(movie_score)].extend(word_list.values)
		

	except:
		print(movie_id)


'''print(kw_counts_list_by_score)
print(kw_list_by_score)'''

for i in range(10):                                 #每次创建一个DataFrame数据 保存该得分区间的TOP30关键词和出现总次数
	if kw_list_by_score[i]: 
		kw30_with_counts = pd.DataFrame({
				"kw":kw_list_by_score[i],
				"counts":kw_counts_list_by_score[i]

			})

		#print(kw30_with_counts)

		kw30_with_counts = kw30_with_counts.groupby("kw").sum()  #重复统计
		kw30_with_counts = kw30_with_counts.sort_values(by="counts",ascending=False)[:30]   #排序
		counts_sum = kw30_with_counts["counts"].sum()                               #统计关键词的总出现次数,并算出百分比 并储存为文件
		kw30_with_counts["percentage"] = kw30_with_counts["counts"]/counts_sum      #计算占比
		kw30_with_counts.to_csv("{}_movie_keywords.csv".format(i))
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!