本次数据:
来源豆瓣电影
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))