陳麗萍,吳其林,李小榮
(巢湖學院 信息工程學院, 安徽 巢湖 238000)
我國大數據產業發展迅猛。為適應相關領域對技術人員所具備大數據分析知識體系要求,各大高校相關專業也相繼開設了大數據分析技術相關課程。文章以網絡新聞分析為例,設計了一個基于互聯網大數據分析案例,詳細闡述了使用大數據處理技術進行數據分析的完整過程。大數據分析過程通常包括數據獲取、數據預處理、數據挖掘模型、算法執行與分析、數據分析結果輸出及可視化等步驟。
數據獲取主要利用網絡爬蟲。網絡爬蟲是一個在海量互聯網信息中獲取有效Web頁面的程序[1]。首先由Web服務器連接器發出連接請求,與指定的Web服務器建立連接后,向服務器發送URL頁面請求命令,服務器返回對應的頁面內容。接著由網頁解析器對頁面解析,提取所包含的URL;對URL過濾并存儲符合要求的URL。同時根據已設定的爬行策略,依次對每個URL對應頁面爬行;重復這個過程直到滿足爬行的結束條件即可獲取所需的Web網頁數據。然后對獲取的Web網頁數據解析和提取。解析、提取時先對Web頁面的版式類型識別,每種版式提取的頁面目標信息都不相同,也就是要提取的數據信息位置具有不同的特征。新聞頁面提取目標是標題和正文部分。目前主要有3大類Web頁面信息內容解析提取方法,分別是:基于匹配的信息抽取方法;基于HTML結構的信息抽取方法;基于統計的抽取方法[2]。3種方法各有優缺點。最后將提取的目標內容數據保存入庫,可以保存在txt文本格式、數據庫(如:MYSQL、MOngDB)中。
數據結構化處理是數據分析挖掘前提。文章主要針對中文文本類型信息結構化處理,包括詞匯切分、去除停用詞等。詞匯切分對于分析中文文本類型數據來說尤其關鍵。目前有兩個成熟的分詞方法是基于詞典的分詞和基于統計的分詞。停用詞是沒有實際檢索意義的詞。如“這個、的”等。目前常見的停用詞表有哈爾濱工業大學停用詞表等。
LDA(Latent Dirichlet Allocation)是一種文檔主題生成模型,目的是從文本中發現隱含的語義,相比空間向量模型增加了概率信息[3]。LDA模型包含3層結構,文檔集(大小為D)、主題集(大小為K)、詞語集(大小為N)。α是主題分布θd的先驗分布,η是主題k中詞語分布βk的先驗分布,Zd,n是文檔d中詞語的所屬主題,Wd,n為對應的詞語。LDA模型認為一篇文檔的建立過程,就是首先確定多個主題,然后確定每個主題下的不同詞語,最終構成一篇文檔。LDA的使用就是文檔建立過程的逆過程,根據一個文檔,抽取其主題以及主題所對應的詞語。
作為文本訓練數據經過預處理得到計算機識別的數學表示模型,接下來使用分類方法進行模型訓練,得到一個可以準確預測未知文本類型的模型。基于機器學習的文本分類方法日益成熟。支持向量機(SVM)是其中一種經典的解決文本分類較好的方法。SVM的目標是尋找區分不同類樣本的超平面,使邊際最大。對于二分類問題,以線性劃分超平面為例說明。給定訓練樣本集:
D={(x1,y1),(x2,y2),…,(xn,yn)}
yi∈{-1,+1}
(1)
定義分類超平面方程為:ωTx+b=0
(2)
保證每個樣本都被正確分類,對于正樣本有:
ωTx+b≥0
(3)
對于負樣本有:ωTx+b<0
(4)
由于正樣本的類別標簽為+1,負樣本的類別標簽為-1,可統一寫成:yi(ωTxi+b)≥0
(5)

(6)

當找不到能將兩類數據分開的超平面時,SVM將數據映射到高維空間中,映射時用到核函數。在SVM中常用的核函數有線性核、高斯核和sigmoid核等。對于多分類問題,支持向量機用二分類器的組合來處理[4]。文章對新聞文本分類就是使用SVM進行的文本多分類。
輸出結果可視化盡可能讓輸出結果清晰。比如可以使用詞云圖,分類結果數據評價圖、表等。
文章以Python3.6為工具進行新聞文本數據的獲取、預處理、數據分析及可視化。
實驗環境為:操作系統:Windows10;處理器:雙核,2.53GHz;內存:4GB
Python版本:3.6.
Python環境:Python IDLE或jupyter notebook。
Python工具包:beautifulsoup,gensim,jieba,sklearn,Pandas,Matplotlib,Scrapy,re,os,numpy等。
第三方庫文件:requests、WordCloud等。
文章利用requests、re與BeautifulSoup,從新浪網爬取新聞,并將獲取的內容以txt格式保存到本地指定的目錄中。
1.爬取頁面。首先通過requests的get方法從給定的新聞網頁鏈接開始爬取網頁。通過分析網址,發現每頁的網址變化是通過….index_1..n值來調整實現的。所以可通過設置循環來實現網頁自動翻頁進行網頁爬取。本案例設置爬取了前20個頁面,實現代碼為:for n in range(1,20):str=requests.get("http://roll.news.sina.com.cn/news/gnxw/gdxw1/index_"+str(n)+".shtml")
str.encoding=′gb2312′
接著,提取每個頁面中包含的各條新聞鏈接。由于超鏈接通常模式固定,提取并過濾超鏈接時,采用了正則表達式匹配的方法。經過分析每條新聞的鏈接字符格式,如:http://news.sina.com.cn/o/2018-11-06/doc-ihmutuea7351575.shtml。設計正則表達式。使用Python的re模塊的findall()函數,在爬取的頁面文本中找到正則表達式所匹配成功的所有字符串,這些字符串就是在本案例中需要的目標新聞頁面網址。實現代碼為:
soup=BeautifulSoup(str.text, ′lxml′)
article=soup.select(′div#article > p′)
pro_str=′′
for i in range(len(article)-1):
pro_str += article[i].text
newstext += pro_str + ′ ′
最后使用Python的os將提取的新聞正文部分內容寫入allnewscontent.txt文件保存。實現代碼:
f=open("allnewscontent.txt","wb")
f.write(newstext.encode("utf-8"))
f.close( )
allnewscontent.txt文件內容就是所獲取到的新聞內容數據。
對獲取到的新聞內容數據進行預處理。首先讀取新聞內容數據,使用Python的函數readlines(),實現代碼:
contentfile=input(“輸入文本文件名(allnewscontent.txt):”)
f=open(contentfile, "r",encoding="utf-8")
lines=f.readlines()
f.close()
使用LDA模型進行訓練,最終根據事先指定生成主題的數量,生成新聞內容的多個主題及對應主題關鍵詞。本案例使用Python的gensim訓練LDA模型來進行新聞內容的主題分析。主要實現代碼:
num_topics=int(input(“話題數:”)) //設置主題數量
dictionary=Dictionary(segtexts)
dictionary.filter_extremes(2,1.0,keep_n=800) //詞典過濾,保留1000個
corpus=[dictionary.doc2bow(text) for text in segtexts]
LdaModel(corpus,id2word=dictionary, num_topics=num_topics)
使用詞云圖將反映主題的關鍵詞可視化。根據詞云圖中詞語顯示的大小,就很容易看出新聞內容表達的主題。本案例使用WordCloud制作詞云圖,每個圖設置顯示20個詞語。主要實現代碼:
wc=WordCloud(collocations=False, font_path=font, width=2800, height=2800, max_words=20,margin=2)
得到如圖1所示的詞云圖。

圖1 詞云圖
從已獲取的新聞頁面中,隨機抽取了足夠數量的網頁,經過人工實際分析,事實證明中國與美國發展經濟問題、中國的疫苗問題、中國臺灣相關工作問題確實是當時新聞主題下的主要事件。因此,通過這個主題關鍵詞的展示,人們在一兩分鐘內就可捕獲到任意某個時間段內的社會新聞熱點。
1.分類模型訓練。本案例使用TF-IDF將新聞文本轉換成計算機能夠處理的向量;使用SVM算法進行模型訓練,得到分類模型svm。具體實現使用Python的sklearn包中的svm。
分類模型訓練主要實現代碼:
from sklearn import svm
from sklearn.feature_extraction.text import TfidfVectorizer
/* 訓練svm分類器*/
def train_svm(train_data, dictionary,train_tags):
……….
v=TfidfVectorizer()
tdata=v.fit_transform(traindata)
print(tdata)
svc=svm.SVC(kernel=′rbf′,gamma=′scale′)
svc.fit(tdata,train_tags)
return svc
…………………
svm=train_svm(corpus,dictionary,label)
2.利用訓練好的分類模型對測試集中的新聞進行分類預測。首先讀取測試集中的新聞文本數據,然后對其進行預處理;最后用已經訓練好的模型svm進行預測分類。分類的主要實現代碼:
for i in range(len(test_tags)):
test_X=tdata[i]
r=svm.predict(test_X) //此處test_X為特征集
testresult.append(r[0])
if r[0]=test_tags[i]:
correct+=1
3.最后對算法分類的結果進行性能評估,通過計算查全率(recall)、查準率(precision)、f1-score值、宏平均(macro avg)來展示分類結果的好壞。本案例使用sklearn的confusion_matrix和classification_report實現此功能。
主要實現代碼:
cm=confusion_matrix(test_tags,testresult)
print(cm)
target_names=[′class 0′,′class 1′,′class 2′]
print(classification_report(test_tags,testresult, target_names=target_names))
本案例詮釋了大數據分析的整個過程。通過互聯網大數據環境下新聞主題分析和分類的研究實現,使學生掌握如何使用處理技術從大量無序的網絡數據中獲取有用信息。該案例結合人們平時常用的新浪網,具有一定的深度和綜合性,學生通過案例的學習和實踐,可以加深對所學理論知識的理解,并促使其能在實際中正確使用。