评价一部电影除了评分、票房之外,小编觉得影评也是一项重要的指标,所以我们就用豆瓣电影上对《后来的我们》影评进行分析。
看了这篇文章,你能get到的技能如下:
1.使用Python爬取数据。
2.使用Java进行中文分词,并统计词语频数。
巧妇难为无米之炊,下面我们就使用Python爬取豆瓣电影上对《后来的我们》的影评。此次使用到的Python库有request、BeautifulSoup、UserAgent。
requests库的主要作用:根据链接地址得到HTML页面的源代码。
BeautifulSoup库的主要作用:解析HTML文档,使用户方便提取所需内容。
UserAgent库的主要作用:用于生成随机的User-agent。
通过对豆瓣电影的分析,我们知道影评的链接格式为https://movie.douban.com/subject/26683723/comments?start={影评起始条数}&limit=20&sort=new_score&status=P&percent_type=,并且影评起始条数的值也是有规律的,以0开始,每次加20即可。
再分析HTML页面的源代码,我们知道每一条影评信息存放在一个名为comment的div标签下,在此div标签下有名为comment-time的span标签,存放此影评的发表时间,有一个p标签存放具体的影评文字。我们都可以通过BeautifulSoup库获相应标签下的内容。
我们把每一个页面的所有影评信息存放在本地创建的txt文件中。爬取影评的Python代码如下。
""" 采集豆瓣上《后来的我们》影评 """ import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup import time #从指定url下载HTML网页 def get_page(url, options={}): ua = UserAgent() base_headers = { 'User-Agent': ua.random } headers = dict(base_headers, **options) try: r = requests.get(url, headers=headers) if r.status_code == 200: r.encoding=r.apparent_encoding return r.text except ConnectionError: return None start = 0 while start <= 200: time.sleep(5) fileName = "E:\\闲时程序代码\\python\\后来的我们\\影评\\douban" + str(start) + ".txt" f = open(fileName, "w",encoding='utf-8') comments = [] #要写入的影评字符串列表 url = "https://movie.douban.com/subject/26683723/comments?start=" + str(start) + "&limit=20&sort=new_score&status=P&percent_type=" text = get_page(url) if text is not None: soup = BeautifulSoup(text, 'html.parser') commentDivs = soup.find_all('div', 'comment') for each in commentDivs: commentinfo = each.find('span','comment-info') commenttime = str(commentinfo.find('span','comment-time ')['title']) content = "" for i, string in enumerate(each.find('p')): if i == 0: content = string content = content.replace("\n",",") content.encode(encoding='utf-8',errors="ignore") comments.append(commenttime + " \t" + content + "\n") f.writelines(comments) print(str(start) + " :成功") else: print(str(start) + " :失败") start += 20
爬取成功后,在本地文件中有如下txt文件。
其中douban0.txt文件下内容如下。
有了影评数据,我们就可以进一步的进行分析了。我们对所有的影评文字进行一个中文分词处理。其中要用到的第三方jar包有 ansj_seg.jar nlp-lang.jar。
ansj_seg.jar的主要作用:对中文字符串进行词意分词。
nlp-lang.jar的主要作用:对分词提供支持。
进行分词的Java代码如下。
package ChineseSplit; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.ansj.domain.Result; import org.ansj.splitWord.analysis.ToAnalysis; /** * 对《后来的我们》影评进行中文分词处理 * @author liuchen * */ public class Main { public static void main(String[] args) throws IOException { String str = ""; //存放所有影评字符 String filepath = "E:\\闲时程序代码\\python\\后来的我们\\影评"; File file = new File(filepath); String[] filelist = file.list(); for (int i = 0; i < filelist.length; i++) { InputStreamReader isr = new InputStreamReader(new FileInputStream(filepath + "\\" + filelist[i]), "utf-8"); BufferedReader br = new BufferedReader(isr); String s = null; while((s = br.readLine())!=null){ str += s.trim().split("\t")[1]; } br.close(); } Result r = ToAnalysis.parse(str); //返回分词结果 String[] words = r.toStringWithOutNature("\t").split("\t"); //输出没有词性的分词结果 以制表符分开 Map<String, Integer> map = new HashMap<String, Integer>(); //使用HashMap统计词语次数 for(int i=0; i<words.length;i++){ if(map.containsKey(words[i])){ map.put(words[i], map.get(words[i])+1); }else{ map.put(words[i], 1); } } for (Entry<String, Integer> entry : map.entrySet()) { //输出分词结果 System.out.println(entry); } } }
对分词结果进行人工去除标点符号、人称代词等,小编将能反映电影情节的词语的出现次数进行降序排序,结果如下。
将影评文字做成的词云图如下所示。
通过上面的分析,小编个人觉得《后来的我们》虽然已经取得了10亿票房,但它的口碑并不好,可能真的存在“炒作”的现象。小伙伴们有什么看法,可以在下方留言。
喜欢我的文章请关注微信公众号:追梦程序员。