当前位置:   article > 正文

gephi和python_python+nlp+Gephi 分析电视剧【人民的名义】

python从百度爬取电视剧分析社会关系网络

最近和舍友看完了去年大火的电视剧【人民的名义】,看完觉得里面的人物关系很有意思,决定对其分析分析,也顺便测试一下早前使用过的一些模型(例如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(&

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/140777
推荐阅读
相关标签
  

闽ICP备14008679号