如何基于Python实现电影知识图谱的数据爬取和预处理

您所在的位置:网站首页 Python网页爬取论文 如何基于Python实现电影知识图谱的数据爬取和预处理

如何基于Python实现电影知识图谱的数据爬取和预处理

2023-04-09 12:09| 来源: 网络整理| 查看: 265

如何基于Python实现电影知识图谱的数据爬取和预处理

你好,这篇文章咱们讨论一下关于「如何基于Python实现电影知识图谱的数据爬取和预处理」的事情…

使用Python实现电影知识图谱的数据爬取与预处理

知识图谱是一种结构化的知识表达方式,可以使得机器更好的理解人类的语言和思维,实现自然语言理解、智能推荐、搜索引擎等领域的技术革命。

在知识图谱的构建过程中,数据爬取和预处理是不可或缺的一步。本文将介绍如何使用Python进行电影知识图谱的数据爬取和预处理的具体方法和流程。

知识准备

在进行数据爬取和预处理之前,需要掌握以下知识:

Python的基本语法和库的使用。 网络爬虫的基本原理和技术。 数据预处理相关的技术和算法。 数据爬取

数据爬取是指从互联网上获取数据的过程。在电影知识图谱的构建中,我们需要获取电影的各种信息,如电影名称、导演、演员、上映时间、票房等信息。下面将介绍如何使用Python进行电影信息的数据爬取。

1. 确定目标网站

数据爬取的第一步是确定爬取的目标网站。在进行电影知识图谱爬取时,我们可以选择以下网站:

豆瓣电影:https://movie.douban.com/ 猫眼电影:https://maoyan.com/ 时光网:http://www.mtime.com/ IMDb:https://www.imdb.com/

这些网站都提供了电影相关的信息,我们可以根据自己的需要选择其中一个或者多个进行数据爬取。

2. 确定爬取的信息

在确定了目标网站之后,我们需要确定需要爬取的信息,这些信息可以根据知识图谱的构建需求进行确定。

以豆瓣电影为例,我们可以爬取以下信息:

电影名称 导演 编剧 主演 类型 制片国家/地区 语言 上映时间 片长 制作公司 官方网站 IMDb链接 评分 评价人数 简介

这些信息可以作为电影知识图谱的节点和关系进行构建。

3. 爬取数据

在确定了目标网站和爬取的信息之后,我们就可以开始进行数据爬取了。

以豆瓣电影为例,我们可以使用requests和Beautiful Soup库来获取电影信息。

import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/top250' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser')

以上代码可以获取豆瓣电影Top 250的页面源代码,并使用Beautiful Soup将其解析成树形结构。

接下来,我们可以通过分析页面的HTML结构来获取所需信息。以获取电影名称为例:

title_list = soup.find_all('div', class_='hd') for title in title_list: name = title.a.span.text print(name)

以上代码可以获取Top 250页面中的所有电影名称,并打印出来。

获取其他电影信息的方法类似,可以参照以上代码进行爬取。需要注意的是,不同网站的页面结构和信息获取方式可能有所不同。

数据预处理

数据预处理是指对爬取到的数据进行清洗、整理和加工的过程,使其适合知识图谱的构建需求。下面将介绍如何使用Python进行电影信息的数据预处理。

1. 数据清洗

数据清洗是指对爬取到的数据进行去重、去噪、纠错等处理,使其符合构建知识图谱的要求。具体需要进行哪些处理取决于爬取的数据质量和知识图谱的需求。

以豆瓣电影为例,我们可以对电影名称进行去重处理:

name_list = [] for title in title_list: name = title.a.span.text if name not in name_list: name_list.append(name) else: continue for name in name_list: print(name)

以上代码可以去除Top 250页面中的电影名称重复项,并打印出所有不重复的电影名称。

2. 数据整理

数据整理是指对爬取到的数据进行分类、筛选和整合,使其便于构建知识图谱。具体需要进行哪些处理取决于知识图谱的构建需求。

以豆瓣电影为例,我们可以将获取到的电影信息整理成一个字典:

info_dict = {} for title in title_list: name = title.a.span.text info = title.parent.find('div', class_='bd') info_list = info.p.text.split('\n') director = info_list[1].strip().split(' ')[1:] screenwriter = info_list[2].strip().split(' ')[1:] actor = info_list[3].strip().split(' ')[1:] genre = info_list[4].strip().split(' / ')[1:] country = info_list[5].strip().split(' / ')[1:] language = info_list[6].strip().split(' / ')[1:] release_date = info_list[7].strip().split(' / ')[1:] runtime = info_list[8].strip().split(' / ')[1:] company = info_list[9].strip().split(' / ')[1:] official_website = info_list[10].strip().split(' / ')[1:] imdb_link = info_list[11].strip().split(' / ')[1:] score = info.find('span', class_='rating_num').text num_reviews = info.find('div', class_='star').find_all('span')[3].text[:-3] introduction = info.find('span', class_='inq').text info_dict[name] = { 'director': director, 'screenwriter': screenwriter, 'actor': actor, 'genre': genre, 'country': country, 'language': language, 'release_date': release_date, 'runtime': runtime, 'company': company, 'official_website': official_website, 'imdb_link': imdb_link, 'score': score, 'num_reviews': num_reviews, 'introduction': introduction } print(info_dict)

以上代码可以将Top 250页面中获取到的电影信息整理成一个字典,以便后续的知识图谱构建。

3. 数据加工

数据加工是指对爬取到的数据进行补充、扩展和计算,使其更加完整和丰富。具体需要进行哪些处理取决于知识图谱的构建需求和所使用的算法。

以豆瓣电影为例,我们可以计算电影的评价指数:

for name in info_dict.keys(): num_reviews = int(info_dict[name]['num_reviews'].replace(',', '')) score = float(info_dict[name]['score']) rating_index = round(num_reviews artical cgpt2md_gpt.sh cgpt2md.sh _content1.txt _content.txt current_url.txt log nohup.out online pic.txt seo topic_gpt.txt topic.txt upload-markdown-to-wordpress.py urls score, 2) info_dict[name]['rating_index'] = rating_index print(info_dict)

以上代码可以计算每部电影的评价指数,并将其作为一个新的属性加入到电影信息字典中。

总结

本文介绍了如何使用Python对电影信息进行数据爬取和预处理,构建电影知识图谱的过程需要多方面的知识,如数据库的使用、自然语言处理和图数据库的应用等,本文只是对电影知识图谱构建的一个初步尝试。

总之,掌握数据爬取和预处理的基本技能是构建知识图谱的必要准备,希望本文能够对读者有所帮助。

大家都在看: 深度学习之语义分割、实例分割(FCN、Mask RCNN理论篇)

背景:最近在学习深度学习中分割相关的知识点,看了一些论文,这里挑出了两篇经典的并且有代表性的论文,写一篇博客记录一下读后感,供自己回忆,供有需要的人参考~

1、FCN(语义分割中的”典型”) 一、概述:

FCN(Fully Convolutional Networks)是Jonathan Long等人在2015年CVPR中提出的首个端对端的针对像素级预测的全卷积网络,也是深度学习用于语义分割领域的开山之作。FCN将传统的CNN网络后面的全连接层换成了卷积层,同时,使用转置卷积进行上采样,将最终的输出还原为原图像大小。

论文:Fully Convolutional Networks for Semantic Segmentation

二、算法流程:

如何基于Python实现电影知识图谱的数据爬取和预处理

FCN总体算法步骤可以分为两步:1、全卷积部分:首先对输入的图片采用VGG16 Backbone提取特征(最后三层没有用FC)而是改用了3个卷积,分别是Cov2d 7×7、Conv2d 1×1、Conv2d 1×1,这也就是全卷积中的”全”字的由来,采用Conv2d代替了最后三层的FC。

注:7 * 7 * 512直接Flatten的后是20558,则丧失了高度和宽度信息,而改用7 * 7的卷积最终得到的参数是一样的,并且保留了高度和宽度信息

2、反卷积部分:拿到步骤1的输出,作为本步骤的输入,然后采用转置卷积(ConvTranspose2d)进行上采样,比如上采样32倍,此时图片还原到了原图的大小,输出的shape为hwnum_cls,那么此时num_cls就是要分类的类别数+背景=21类,那么就拿到了相当于21个通道的高度为h宽度为w的图片,那么图片中的每一个像素点在21个通道中的最大值就是该点预测的像素所属于的类别,并且这个图片最终可以以热力图的形式展现出来。

注:FCN-16s和FCN-8s还采用了跳级结构,其实就是不同层的预测结果结合起来,有点类似于特征融合的意思。(其中-16s和-8s)表示的意思是将步骤1的输出大小上采样16倍和8倍;转置卷积不是卷积的逆运算,也是一种卷积。

三、FCN-32s框架:

如何基于Python实现电影知识图谱的数据爬取和预处理 四、FCN读后感:

创新点:1、把全连接层改用了卷积层,这样就可以使用任意尺寸的输入。2、采用了反卷积(转置卷积)进行上采样,这样就可以更合理的还原图片为原来的大小。3、结合不同深度层次的跳级结构,融合不同层的特征,使得预测结果更加精准。

不足之处:1、通过比对输出结果和ground truth,可以发现得到的结果还不够精细,对细节不够敏感。2、未考虑像素与像素之间的关系,缺乏空间一致性等。

参考博客如下,感谢~

博客1

五、损失计算:

损失计算:Cross Entropy Loss,对每个pixel做cross entropy loss

2、Mask R-CNN(实例分割中的”典型”) 一、概述:

Mask R-CNN是2017年何大神等人在ICCV中提出的用在实例分割中的论文,此外作者中还有R-CNN系列的大神Ross Girshick,Mask R-CNN不仅仅是可以用在实例分割中,还可以做目标检测以及人体关键点检测任务,可谓是集大成者,同时也是2D实例分割中的”典型”。

论文:Mask R-CNN

二、算法流程:

如何基于Python实现电影知识图谱的数据爬取和预处理

Mask R-CNN总体算法步骤可以分为两步(或是说两个分支):1、Faster R-CNN分支:这个分支基本上就是Faster R-CNN一样的处理方式,即先把图像输入到网络得到相应的特征图,然后使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵。将每个特征矩阵通过RoIAlign缩放到7×7大小的特征图,接着将特征图拉平然后通过一系列的全连接层分别预测class和回归box。

注:Faster R-CNN中拿到特征矩阵之后做的是RoI pooling,而这里因为要考虑到丢失在实例分割中可能小部分像素的舍去便会对最终的结果产生明显的影响,也即RoI pooling可能会带来图像shape取整导致的定位不准确问题(文中称为misalignment问题)。

2、Mask分支:拿到步骤1前期处理得到的特征矩阵之后,开始使用RoIAlign操作把每个特征矩阵缩放到14×14大小的特征图,然后经过卷积进行更深层的特征提取,此时shape不变,然后通过转置卷积ConvTranspose2d 2×2, s2, p0之后,得到shape为28x28x256的图像,然后经过一个1×1的卷积改变通道数为num_cls,于是最后得到的便是28x28xnum_cls的Mask图像,其中对于输入的这个候选框,会给出这个框属于不同类别的28×28的Mask,然后和原图中对应位置进行贴合,就可以得到实例分割的结果图了。

注:训练网络的时候输入Mask分支的图像是由RPN提供的,即Proposals,但在预测的时候输入Mask分支的图像是由Fast R-CNN提供的,个人感觉这样操作有点类似于在训练的时候进行数据增强的意思。

三、Mask R-CNN框架:

1) Faster R-CNN分支:

Faster R-CNN框架

2) Mask分支:

如何基于Python实现电影知识图谱的数据爬取和预处理

注:该分支的输入HxWx256就是Faster R-CNN中的RPN结果给出的众多候选框投影到特征图中的特征矩阵。

四、Mask R-CNN读后感:

创新点:1、用RoIAlign替换了Faster R-CNN中的RoI pooling,并且RoIAlign中用到了双线性插值,在实例分割中的效果显著。2、Mask分支很巧妙的和Faster R-CNN这个分支并联起来。3、Mask分支中采用了FPN结构

看完不得不说何大神YYDS

五、损失计算:

Mask R-CNN的损失就是在Faster R-CNN的基础上加上了Mask分支上的损失,即:

如何基于Python实现电影知识图谱的数据爬取和预处理

其中Mask分支的损失就是二值交叉熵损失(Binary Cross Entropy)。

参考博客如下,感谢:

博客1、博客2、博客3

Original: https://blog.csdn.net/qq_53527856/article/details/124757950Author: QianZ423Title: 深度学习之语义分割、实例分割(FCN、Mask RCNN理论篇)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/444979/

转载文章受原作者版权保护。转载请注明原作者出处!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3