面向人文社科类专业的Python教学案例实践
2018-01-27刘文飞赵铭伟
刘文飞,赵铭伟
(大连理工大学电信学部,辽宁大连116023)
0 引言
国内大部分高校为非计算机专业开设了C语言、Java、VB等程序设计类课程,受制于学时有限和非计算机专业学生的计算机基础能力,课程主要讲授程序设计的基本知识和方法,对专业领域的问题求解涉及较少。随着大数据、数据挖掘、机器学习等概念渗透到各行各业,各专业学生使用计算机编程解决专业领域实际问题的需求日益迫切,然而现实情况是,学生学习完程序设计类课程,面对大部分专业领域的实际问题依然束手无策。在此背景下,嵩天等人提出将Python语言作为我国高校非计算机专业程序设计入门语言的建议[1]。
Python语言语法简单易读,非常接近自然语言,开发者社区有着难以置信的活跃,并且Python拥有十多万个类库支撑,这些第三方类库基本覆盖了科学计算、数据处理、图像处理、网站开发运维、机器学习、可视化等所有领域。Python这些特性简化了开发的复杂度,使得“编程”这一行为不再是那么难以学习,学生可以很容易地将“编程”作为一个工具来使用,把更多的精力投入到应用与问题的求解上。
由于各专业学生计算机基础不一样,对程序设计的应用场景不同,需求也不一样,因此需要对不同专业学生制定不同的Python教学方案。张莉等人针对MOOC受众学生差异性较大的问题提出了“多样化可扩展的Python教学体系”[2],对人文社科类学生着重基础问题的求解,对理工类学生着重高级问题的求解,对商学类学生进行专业定制培养。笔者近两年一直从事人文社科类专业的Python教学工作,分析学生使用程序设计求解专业领域问题的一般场景,设计出以电影数据为基础的Python教学案例,将程序设计知识点与实际应用场景紧密结合在一起,提升教学效果,强化学生应用能力。
1 人文社科类专业遇上Python
为了提升Python在人文社科类专业的教学效果,充分发挥Python作为解决专业领域问题辅助工具的价值,作者深入到该专业学生中间探究他们平时如何用计算机来辅助解决遇到的问题。
通过调研发现,学生在准备研究一个专业领域问题时,一般都需要先获取该问题相关的电子资料,如科技文献数据(WebofScience、EI、CNKI网站提供的数据)、专利数据、政府报告、法律条文等,这些数据大部分都需要从互联网进行持续下载获得。学生只能根据检索条件得出的结果一页页拷贝下来,或者根据网站提供的导出功能每次导出结果几十条记录。当需要检索成百上千个关键词时,这种方式的效率就显得极为低下,而且容易造成人为的数据错误。
下载得到的数据有时候并不完全满足研究问题的需要,去重和过滤是学生经常遇到的两个问题,此时Excel就成了他们的最佳选择,对于结构化比较好的数据用Excel可以实现去重和过滤,当数据不是非常规整时,Excel就无能为力了。
接下来针对不同的专业领域问题,学生会采用不同方法来对数据进行分析,常见的方法有:统计分析、内容主题分析、合作网络分析、共现分析等,学生往往会借助一些第三方软件工具,如Pajek、Citespace、Gephi等,这些工具都是国外著名大学研究人员为了方便进行人文社科类研究而设计开发的。然而这些工具模式比较固定,数据输入输出格式必须严格按照要求做,稍有差池就无法得到结果。
最后,处理分析得到的结果,第三方软件集成了一些可视化的图表,但形式有限,学生通常用Excel来做一些传统图表展示。
以上4个过程是人文社科类专业的学生解决大部分专业领域问题时的一般步骤,可以总结为:数据获取、数据处理、数据分析、结果展示,如图1所示。而这些过程主要采用人工处理以及借助一些现成的软件工具来实施的,这些方式不仅费时费力,在很多场景下数据量、准确性也无法得到保证,而且软件的形式比较固定,很多时候也无法生成想要的数据和结果。
图1 人文社科类专业学生使用程序设计解决问题的常见场景
对于上述4个过程,Python几乎都可以轻松应对,Python作为一种脚本语言,在实现爬虫和数据处理分析上有着天然的优势,借助丰富的第三方类库,也可以轻松实现多样化的可视化展示。
既然Python这么简单易学,那么是否可以像传统程序设计教学那样,教会学生Python的语法规则,针对每个过程,告诉学生怎么做,使用哪些第三方库就行了呢?
相对于理工科学生,人文社科类专业的学生逻辑思维和计算思维能力相对薄弱一些,如果直接讲授语法规则和如何使用第三方库,当学生碰见具体问题时,还将是无从下手。只有将知识点融入到案例场景中,调动学生学习的兴趣,才能让学生在案例中体会程序设计解决问题的方法途径。
文献[3]给出了大量优秀的案例,每一个案例都值得去推敲学习。然而Python教学不能把所有优秀的案例在短时间内灌输给学生,尤其对于初学者而言,过多的案例会让他们眼花缭乱,在解决问题的途径中迷失。因此针对不同专业学生,需要设计一个契合专业应用场景、精巧连贯的案例,能够贯穿学生所需要学习的知识点。
2 Python教学案例:电影圈那些事儿
根据人文社科类专业学生使用计算机解决专业领域问题的4个过程,笔者以大家司空见惯的电影数据作为场景设计了教学案例,试图通过Python程序设计来解读“电影圈的那些事儿”。整个教学案例的框架如图2所示。
2.1 电影数据爬取
互联网数据的爬取大部分都是基于Http协议,数据一般都存在于HTML网页标签内,因此在讲授如何实现爬虫前,需要给学生普及Http协议及HTML标签的基本概念,让学生知道get和put的区别,200和404等状态码以及常见的HTML标签形式及标签属性的含义。
Python不仅为初学者提供了简单易用的第三方库Requests、BeautifulSoup4(以下简称BS4),同时也提供了快速、高层次Web抓取框架Scrapy。人文社科类学生在大部分应用场景下利用Requests和BS4库就可以下载到所需要的数据。本案例利用Requests和BS4库爬取豆瓣电影上标签为“中国大陆电影”的所有电影及其演员信息,爬取分为3个阶段:爬取电影列表、爬取电影详细信息页面和爬取演员信息页面。其中爬取电影列表页的具体步骤如下:
(1)构造标签“中国大陆电影”列表页初始URL;
(2)利用Requests库获取当前URL的列表页内容;
(3)利用BS4库解析得到列表页的所有页数,判断是否还有下一页,如果有,重新构造URL,继续执行步骤(2);否则程序结束。
爬取到所有电影列表页后,可以通过BS4库解析每一个列表页中电影链接,从而再通过Requests库获取每个电影链接对应的网页内容。同样演员信息页面链接可以通过BS4库从电影的网页内容中解析得到,然后再通过Requests获取。当学生对以上过程完全掌握后,可以将爬取的3个阶段连接起来,一次性将所有电影及演员信息全部爬取下来。
图2 Python教学案例:电影圈那些事儿
2.2 电影信息处理
爬虫通过一定的规则从互联网下载数据,但无法保证下载的数据的可靠性,因此在对数据进行分析前,需要对数据进行清洗工作。在本案例中,爬取得到的电影信息页面和演员信息页面都属于HTML半结构化的形式,而且并非所有电影信息页面中都是电影,很多属于电视剧和短片类型。因此我们通过BS4库对电影和演员页面中的基本信息进行提取工作,并且通过正则表达式将非电影类的页面过滤掉(电影类页面中分享链接的属性“data-type”为“电影”)。下面代码展示了如何通过BS4库获取电影剧情简介信息。
程序代码如下:
frombs4importBeautifulSoup
defgetMovieIntro(movieHtml)
try:
soup=BeautifulSoup(movieHtml,"html.parser")
returnsoup.find_all("div",{"id":"link-report"})[0].string
except:
print("获取电影剧情简介失败")returnNone
为方便后续的数据分析,从HTML页面中提取出结构化的数据内容后,需要将其保存到外存上,方便下一次继续使用。在Python语言中,学生可以通过csv、json或者文本文件进行直接存储,csv和json作为两种被广泛应用的轻量级数据交换格式,Python提供了专门用于读写csv和json的标准库。通过短短几行代码,就可以轻松将列表、字典等类型数据直接写到外存上。在Python教学中,除了必须掌握文本文件的读写之间,至少需要学生掌握csv或者json其中一种格式的读写,同时为了应对不同文件的编码问题,需要在教学中加入字符编码的概念。本案例采用json存储解析后得到的电影和演员结构化信息。
2.3 电影数据分析和展示
2.3 .1电影相关信息统计
统计作为科学研究进行定量分析的重要手段,应作为人文社科类专业Python教学中的重要内容。在电影和演员的数据中,可以对各年份电影的数量、演员参演电影数目、导演执导电影数目、不同类型电影数目等内容进行统计。图3主要展示参演电影数目排在TOP10的演员情况。
图3 中国大陆电影演员参演电影数目TOP10名单
程序代码如下:
importjson,codecs
mCount={}
withcodecs.open("movies.json","r","utf-8")asfo:
forlineinfo:
movieInfo=json.loads(line)
fornameinmovieInfo["Starring"]:
ifname[0]inmCount:mCount[name[0]]+=1
else:
mCount[name[0]]=1
fres=sorted(mCount.items(),key=lambdad:d[1],reverse=True)
foriinrange(10):
print(fres[i])
2.3 .2电影主题分析
电影主题分析通过对电影剧情简介进行关键词分析,得出不同类型电影的主题分布。每个电影剧情简介约几百字左右,处理时需要将每个中文句子进行分词。Python提供的中文分词工具很多,包括盘古分词、Yaha分词、Jieba分词等,在面对中文的数据时,分词工具是必不可少,因此教学中需要让学生至少熟悉其中一种分词工具的使用。
本案例使用了Jieba分词,对不同类型的电影剧情简介进行分词后,分别统计了各类型电影的关键词出现次数。然后案例使用了专门进行可视化词云的工具WordCloud,程序中将每个类型电影统计得到的关键词及词频作为WordCloud的输入,WordCloud就会生成词云图形,如图4所示。
从图4中我们可以看出,同一类型下的高频关键词具有显著的关联性,而不同类型电影所使用的高频关键词差异性非常明显。利用关键词统计进行主题分析可以广泛应用于人文社科类其他类似的场景,比如:研究《红楼梦》前、后四十回用词的特点,确认是否为不同人所写;分析不同年份政府报告的主题,研究政策变化的趋势和热点等。
图4 不同类型电影主题分析
2.3 .3演员合作网络分析
科学合作对于资源共享、思想交流、知识传播、信息获取方面具有重要意义,因此人文社科类专业的学生经常需要对科技文献、专利等进行国家或者机构合作网络分析、作者合作网络分析,从中分析出一个作者或机构在合作网络中是否为核心人员,哪些团体在合作网络中影响力较大等信息。
在电影数据中,我们认为一部电影的所有主要演员中,每两个演员均有一次合作关系,这样整个华语电影中的演员合作关系就形成一张演员合作关系网。本案例中主要用到了NetworkX类库,程序读取电影的所有信息,把每部电影中演员的合作关系直接处理成NetworkX输入需要的格式,由于合作关系太多不便于进行展示,程序中处理将合作次数小于5的关系直接过滤了,调用NetworkX根据过滤后输入的数据生成的合作网络如图5所示。
图5 华语电影中演员合作网络
由于合作关系太多,NetworkX调用时通过参数控制将部分合作次数频率低的直接过滤掉,选择了其中的最大子图进行展示,从图5可以看出,古天乐、林雪、黄渤、邓超、范伟等人在合作网络中比较活跃。
3 结语
我们在大连理工大学人文和外语学院两个学院的程序设计必修课程中进行了教学实践。实践表明,该教学案例可以有效提高学生学习程序设计语言的热情,使学生快速具备运用信息技术解决专业领域问题的基本能力。未来其他的非计算机专业选择Python替代C语言将会是一个历史趋势,将学生彻底从复杂的语法学习中解脱出来。然而目前Python师资力量严重短缺,希望更多的老师加入到Python教学队伍中来,设计出更多有意思且与专业契合度高的教学案例,共同推动Python教学在全国高校内的教学改革。
[1]嵩天,黄天羽,礼欣.Python语言:程序设计课程教学改革的理想选择[J].中国大学教学,2016(2):42-47.
[2]张莉,金莹,张洁.多样化可扩展的Python教学体系探索与实践[J].计算机教育,2017(8):18-22.
[3]嵩天,黄天羽,礼欣.Python语言程序设计基础[M].2版.北京:高等教育出版社,2017.