赞
踩
最近和舍友看完了去年大火的电视剧【人民的名义】,看完觉得里面的人物关系很有意思,决定对其分析分析,也顺便测试一下早前使用过的一些模型(例如word2vec)效果是否能达到预期。
1.获取数据
进行分析之前首先需要获取剧情的文本,因为没有看过小说,为了尽量接近自己和大部分人所熟悉的剧情,这里爬取从百度百科上的每一集的剧情,针对已更新的剧情文本进行分析。利用python的urllib2(python3.3后改为urllib.request)和BeautifulSoup包可以很快的爬下剧情文本,保存为rmdmy.txt文档,顺便将出现的人物名字也一起爬下来,后面进行预处理和分析中涉及到的分词、实体属性对齐和社交网络分析等都将会用到。
# -*- coding: utf-8 -*-
"""
@author: wangyao
"""
#改变默认工作路径
import os
os.chdir(r"C:\Users\wangyao\Desktop\人民的名义")
##爬取百度百科剧情
import urllib.request
from bs4 import BeautifulSoup
import re
import pandas as pd
url = "https://baike.baidu.com/item/%E4%BA%BA%E6%B0%91%E7%9A%84%E5%90%8D%E4%B9%89/17545218"
import sys
import importlib
importlib.reload(sys)
response = urllib.request.urlopen(url)
con = response.read()
#使用beautifulsoup中的html解析器
cont = BeautifulSoup(con,"html.parser")
content = cont.find_all('ul',{'id':'dramaSerialList'})
content = str(content)
##去掉HTML标签
content1 = re.sub(r']+>','',content)
f = open('rmdmy.txt','w',encoding= 'utf-8') #直接用open打开会报错,需要指定编码方式
f.write(content1)
f.close()
#爬取名字
f = open('rmdmy_name.txt','a',encoding= 'utf-8')
name_content = cont.find_all("dl",attrs={"class": "info"})
for i in name_content:
name_d = i.get_text().strip().split(u'\n')[0]
name = name_d.split(u'\xa0')[2]
#加decode()byte和str才能相加
f.write(name.encode('utf-8').decode()+'\n')
f.close()
文本文件如下所示:
rmdmy.txt
rmdmy_name.txt
2.文本预处理
将剧情爬下来后需要对文本进行预处理,主要包括分句、分词、去掉一些特殊符号和停用词、实体对齐和属性对齐等。如果一个人可能在剧中有不同的名字,这时候就需要进行统一。为了尽量正确的切分一些固定名称,需要导入自定义词典,主要包含一些人名、地名和组织名称等(例如这里需要加入侯亮平,汉东省,汉东大学,山水集团,大风厂等等)。此外,在提取文本特征时需要去掉一些停用词,以提高分析的准确度。经过一系列处理后得到比较干净的文本分词结果,然后就可以在此基础上进行深入的分析。
#文本预处理
import jieba
jieba.load_userdict('rmdmy_dict.txt')#自定义词典
stopword = [line.strip() for line in open('StopwordsCN.txt',encoding= 'utf-8').readlines()] #简体中文停用词
fr = open('rmdmy.txt','r',encoding= 'utf-8')
con = [fr.readlines()]
'''
分词,并去掉特殊字符、词语
'''
fw = open('rmdmy_content.txt','w',encoding= 'utf-8')
for i in con[0]:
#if len(i.decode('utf-8'))<=10:
if len(i)<=10:
pass
else:
w1 = i.split(&
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。