劉文飛,趙銘偉
(大連理工大學電信學部,遼寧大連116023)
國內(nèi)大部分高校為非計算機專業(yè)開設(shè)了C語言、Java、VB等程序設(shè)計類課程,受制于學時有限和非計算機專業(yè)學生的計算機基礎(chǔ)能力,課程主要講授程序設(shè)計的基本知識和方法,對專業(yè)領(lǐng)域的問題求解涉及較少。隨著大數(shù)據(jù)、數(shù)據(jù)挖掘、機器學習等概念滲透到各行各業(yè),各專業(yè)學生使用計算機編程解決專業(yè)領(lǐng)域?qū)嶋H問題的需求日益迫切,然而現(xiàn)實情況是,學生學習完程序設(shè)計類課程,面對大部分專業(yè)領(lǐng)域的實際問題依然束手無策。在此背景下,嵩天等人提出將Python語言作為我國高校非計算機專業(yè)程序設(shè)計入門語言的建議[1]。
Python語言語法簡單易讀,非常接近自然語言,開發(fā)者社區(qū)有著難以置信的活躍,并且Python擁有十多萬個類庫支撐,這些第三方類庫基本覆蓋了科學計算、數(shù)據(jù)處理、圖像處理、網(wǎng)站開發(fā)運維、機器學習、可視化等所有領(lǐng)域。Python這些特性簡化了開發(fā)的復雜度,使得“編程”這一行為不再是那么難以學習,學生可以很容易地將“編程”作為一個工具來使用,把更多的精力投入到應(yīng)用與問題的求解上。
由于各專業(yè)學生計算機基礎(chǔ)不一樣,對程序設(shè)計的應(yīng)用場景不同,需求也不一樣,因此需要對不同專業(yè)學生制定不同的Python教學方案。張莉等人針對MOOC受眾學生差異性較大的問題提出了“多樣化可擴展的Python教學體系”[2],對人文社科類學生著重基礎(chǔ)問題的求解,對理工類學生著重高級問題的求解,對商學類學生進行專業(yè)定制培養(yǎng)。筆者近兩年一直從事人文社科類專業(yè)的Python教學工作,分析學生使用程序設(shè)計求解專業(yè)領(lǐng)域問題的一般場景,設(shè)計出以電影數(shù)據(jù)為基礎(chǔ)的Python教學案例,將程序設(shè)計知識點與實際應(yīng)用場景緊密結(jié)合在一起,提升教學效果,強化學生應(yīng)用能力。
為了提升Python在人文社科類專業(yè)的教學效果,充分發(fā)揮Python作為解決專業(yè)領(lǐng)域問題輔助工具的價值,作者深入到該專業(yè)學生中間探究他們平時如何用計算機來輔助解決遇到的問題。
通過調(diào)研發(fā)現(xiàn),學生在準備研究一個專業(yè)領(lǐng)域問題時,一般都需要先獲取該問題相關(guān)的電子資料,如科技文獻數(shù)據(jù)(WebofScience、EI、CNKI網(wǎng)站提供的數(shù)據(jù))、專利數(shù)據(jù)、政府報告、法律條文等,這些數(shù)據(jù)大部分都需要從互聯(lián)網(wǎng)進行持續(xù)下載獲得。學生只能根據(jù)檢索條件得出的結(jié)果一頁頁拷貝下來,或者根據(jù)網(wǎng)站提供的導出功能每次導出結(jié)果幾十條記錄。當需要檢索成百上千個關(guān)鍵詞時,這種方式的效率就顯得極為低下,而且容易造成人為的數(shù)據(jù)錯誤。
下載得到的數(shù)據(jù)有時候并不完全滿足研究問題的需要,去重和過濾是學生經(jīng)常遇到的兩個問題,此時Excel就成了他們的最佳選擇,對于結(jié)構(gòu)化比較好的數(shù)據(jù)用Excel可以實現(xiàn)去重和過濾,當數(shù)據(jù)不是非常規(guī)整時,Excel就無能為力了。
接下來針對不同的專業(yè)領(lǐng)域問題,學生會采用不同方法來對數(shù)據(jù)進行分析,常見的方法有:統(tǒng)計分析、內(nèi)容主題分析、合作網(wǎng)絡(luò)分析、共現(xiàn)分析等,學生往往會借助一些第三方軟件工具,如Pajek、Citespace、Gephi等,這些工具都是國外著名大學研究人員為了方便進行人文社科類研究而設(shè)計開發(fā)的。然而這些工具模式比較固定,數(shù)據(jù)輸入輸出格式必須嚴格按照要求做,稍有差池就無法得到結(jié)果。
最后,處理分析得到的結(jié)果,第三方軟件集成了一些可視化的圖表,但形式有限,學生通常用Excel來做一些傳統(tǒng)圖表展示。
以上4個過程是人文社科類專業(yè)的學生解決大部分專業(yè)領(lǐng)域問題時的一般步驟,可以總結(jié)為:數(shù)據(jù)獲取、數(shù)據(jù)處理、數(shù)據(jù)分析、結(jié)果展示,如圖1所示。而這些過程主要采用人工處理以及借助一些現(xiàn)成的軟件工具來實施的,這些方式不僅費時費力,在很多場景下數(shù)據(jù)量、準確性也無法得到保證,而且軟件的形式比較固定,很多時候也無法生成想要的數(shù)據(jù)和結(jié)果。
圖1 人文社科類專業(yè)學生使用程序設(shè)計解決問題的常見場景
對于上述4個過程,Python幾乎都可以輕松應(yīng)對,Python作為一種腳本語言,在實現(xiàn)爬蟲和數(shù)據(jù)處理分析上有著天然的優(yōu)勢,借助豐富的第三方類庫,也可以輕松實現(xiàn)多樣化的可視化展示。
既然Python這么簡單易學,那么是否可以像傳統(tǒng)程序設(shè)計教學那樣,教會學生Python的語法規(guī)則,針對每個過程,告訴學生怎么做,使用哪些第三方庫就行了呢?
相對于理工科學生,人文社科類專業(yè)的學生邏輯思維和計算思維能力相對薄弱一些,如果直接講授語法規(guī)則和如何使用第三方庫,當學生碰見具體問題時,還將是無從下手。只有將知識點融入到案例場景中,調(diào)動學生學習的興趣,才能讓學生在案例中體會程序設(shè)計解決問題的方法途徑。
文獻[3]給出了大量優(yōu)秀的案例,每一個案例都值得去推敲學習。然而Python教學不能把所有優(yōu)秀的案例在短時間內(nèi)灌輸給學生,尤其對于初學者而言,過多的案例會讓他們眼花繚亂,在解決問題的途徑中迷失。因此針對不同專業(yè)學生,需要設(shè)計一個契合專業(yè)應(yīng)用場景、精巧連貫的案例,能夠貫穿學生所需要學習的知識點。
根據(jù)人文社科類專業(yè)學生使用計算機解決專業(yè)領(lǐng)域問題的4個過程,筆者以大家司空見慣的電影數(shù)據(jù)作為場景設(shè)計了教學案例,試圖通過Python程序設(shè)計來解讀“電影圈的那些事兒”。整個教學案例的框架如圖2所示。
互聯(lián)網(wǎng)數(shù)據(jù)的爬取大部分都是基于Http協(xié)議,數(shù)據(jù)一般都存在于HTML網(wǎng)頁標簽內(nèi),因此在講授如何實現(xiàn)爬蟲前,需要給學生普及Http協(xié)議及HTML標簽的基本概念,讓學生知道get和put的區(qū)別,200和404等狀態(tài)碼以及常見的HTML標簽形式及標簽屬性的含義。
Python不僅為初學者提供了簡單易用的第三方庫Requests、BeautifulSoup4(以下簡稱BS4),同時也提供了快速、高層次Web抓取框架Scrapy。人文社科類學生在大部分應(yīng)用場景下利用Requests和BS4庫就可以下載到所需要的數(shù)據(jù)。本案例利用Requests和BS4庫爬取豆瓣電影上標簽為“中國大陸電影”的所有電影及其演員信息,爬取分為3個階段:爬取電影列表、爬取電影詳細信息頁面和爬取演員信息頁面。其中爬取電影列表頁的具體步驟如下:
(1)構(gòu)造標簽“中國大陸電影”列表頁初始URL;
(2)利用Requests庫獲取當前URL的列表頁內(nèi)容;
(3)利用BS4庫解析得到列表頁的所有頁數(shù),判斷是否還有下一頁,如果有,重新構(gòu)造URL,繼續(xù)執(zhí)行步驟(2);否則程序結(jié)束。
爬取到所有電影列表頁后,可以通過BS4庫解析每一個列表頁中電影鏈接,從而再通過Requests庫獲取每個電影鏈接對應(yīng)的網(wǎng)頁內(nèi)容。同樣演員信息頁面鏈接可以通過BS4庫從電影的網(wǎng)頁內(nèi)容中解析得到,然后再通過Requests獲取。當學生對以上過程完全掌握后,可以將爬取的3個階段連接起來,一次性將所有電影及演員信息全部爬取下來。
圖2 Python教學案例:電影圈那些事兒
爬蟲通過一定的規(guī)則從互聯(lián)網(wǎng)下載數(shù)據(jù),但無法保證下載的數(shù)據(jù)的可靠性,因此在對數(shù)據(jù)進行分析前,需要對數(shù)據(jù)進行清洗工作。在本案例中,爬取得到的電影信息頁面和演員信息頁面都屬于HTML半結(jié)構(gòu)化的形式,而且并非所有電影信息頁面中都是電影,很多屬于電視劇和短片類型。因此我們通過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
為方便后續(xù)的數(shù)據(jù)分析,從HTML頁面中提取出結(jié)構(gòu)化的數(shù)據(jù)內(nèi)容后,需要將其保存到外存上,方便下一次繼續(xù)使用。在Python語言中,學生可以通過csv、json或者文本文件進行直接存儲,csv和json作為兩種被廣泛應(yīng)用的輕量級數(shù)據(jù)交換格式,Python提供了專門用于讀寫csv和json的標準庫。通過短短幾行代碼,就可以輕松將列表、字典等類型數(shù)據(jù)直接寫到外存上。在Python教學中,除了必須掌握文本文件的讀寫之間,至少需要學生掌握csv或者json其中一種格式的讀寫,同時為了應(yīng)對不同文件的編碼問題,需要在教學中加入字符編碼的概念。本案例采用json存儲解析后得到的電影和演員結(jié)構(gòu)化信息。
統(tǒng)計作為科學研究進行定量分析的重要手段,應(yīng)作為人文社科類專業(yè)Python教學中的重要內(nèi)容。在電影和演員的數(shù)據(jù)中,可以對各年份電影的數(shù)量、演員參演電影數(shù)目、導演執(zhí)導電影數(shù)目、不同類型電影數(shù)目等內(nèi)容進行統(tǒng)計。圖3主要展示參演電影數(shù)目排在TOP10的演員情況。
圖3 中國大陸電影演員參演電影數(shù)目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])
電影主題分析通過對電影劇情簡介進行關(guān)鍵詞分析,得出不同類型電影的主題分布。每個電影劇情簡介約幾百字左右,處理時需要將每個中文句子進行分詞。Python提供的中文分詞工具很多,包括盤古分詞、Yaha分詞、Jieba分詞等,在面對中文的數(shù)據(jù)時,分詞工具是必不可少,因此教學中需要讓學生至少熟悉其中一種分詞工具的使用。
本案例使用了Jieba分詞,對不同類型的電影劇情簡介進行分詞后,分別統(tǒng)計了各類型電影的關(guān)鍵詞出現(xiàn)次數(shù)。然后案例使用了專門進行可視化詞云的工具WordCloud,程序中將每個類型電影統(tǒng)計得到的關(guān)鍵詞及詞頻作為WordCloud的輸入,WordCloud就會生成詞云圖形,如圖4所示。
從圖4中我們可以看出,同一類型下的高頻關(guān)鍵詞具有顯著的關(guān)聯(lián)性,而不同類型電影所使用的高頻關(guān)鍵詞差異性非常明顯。利用關(guān)鍵詞統(tǒng)計進行主題分析可以廣泛應(yīng)用于人文社科類其他類似的場景,比如:研究《紅樓夢》前、后四十回用詞的特點,確認是否為不同人所寫;分析不同年份政府報告的主題,研究政策變化的趨勢和熱點等。
圖4 不同類型電影主題分析
科學合作對于資源共享、思想交流、知識傳播、信息獲取方面具有重要意義,因此人文社科類專業(yè)的學生經(jīng)常需要對科技文獻、專利等進行國家或者機構(gòu)合作網(wǎng)絡(luò)分析、作者合作網(wǎng)絡(luò)分析,從中分析出一個作者或機構(gòu)在合作網(wǎng)絡(luò)中是否為核心人員,哪些團體在合作網(wǎng)絡(luò)中影響力較大等信息。
在電影數(shù)據(jù)中,我們認為一部電影的所有主要演員中,每兩個演員均有一次合作關(guān)系,這樣整個華語電影中的演員合作關(guān)系就形成一張演員合作關(guān)系網(wǎng)。本案例中主要用到了NetworkX類庫,程序讀取電影的所有信息,把每部電影中演員的合作關(guān)系直接處理成NetworkX輸入需要的格式,由于合作關(guān)系太多不便于進行展示,程序中處理將合作次數(shù)小于5的關(guān)系直接過濾了,調(diào)用NetworkX根據(jù)過濾后輸入的數(shù)據(jù)生成的合作網(wǎng)絡(luò)如圖5所示。
圖5 華語電影中演員合作網(wǎng)絡(luò)
由于合作關(guān)系太多,NetworkX調(diào)用時通過參數(shù)控制將部分合作次數(shù)頻率低的直接過濾掉,選擇了其中的最大子圖進行展示,從圖5可以看出,古天樂、林雪、黃渤、鄧超、范偉等人在合作網(wǎng)絡(luò)中比較活躍。
我們在大連理工大學人文和外語學院兩個學院的程序設(shè)計必修課程中進行了教學實踐。實踐表明,該教學案例可以有效提高學生學習程序設(shè)計語言的熱情,使學生快速具備運用信息技術(shù)解決專業(yè)領(lǐng)域問題的基本能力。未來其他的非計算機專業(yè)選擇Python替代C語言將會是一個歷史趨勢,將學生徹底從復雜的語法學習中解脫出來。然而目前Python師資力量嚴重短缺,希望更多的老師加入到Python教學隊伍中來,設(shè)計出更多有意思且與專業(yè)契合度高的教學案例,共同推動Python教學在全國高校內(nèi)的教學改革。
[1]嵩天,黃天羽,禮欣.Python語言:程序設(shè)計課程教學改革的理想選擇[J].中國大學教學,2016(2):42-47.
[2]張莉,金瑩,張潔.多樣化可擴展的Python教學體系探索與實踐[J].計算機教育,2017(8):18-22.
[3]嵩天,黃天羽,禮欣.Python語言程序設(shè)計基礎(chǔ)[M].2版.北京:高等教育出版社,2017.