一. 網(wǎng)頁(yè)抓取
對(duì)于同學(xué)的創(chuàng)作進(jìn)行文本處理首先需要通過(guò)爬蟲(chóng)技術(shù)得到TXT文本。
首先從鏈接里復(fù)制所有人的鏈接如下:
觀察鏈接,發(fā)現(xiàn)一個(gè)比較麻煩的事情:每個(gè)人用的網(wǎng)站不盡相同,因此也增大了爬蟲(chóng)的難度。但大部分人用的是CSDN博客,小部分人使用簡(jiǎn)書(shū)與石墨文檔。
對(duì)網(wǎng)頁(yè)使用比例統(tǒng)計(jì)如下:
因此首先研究CSDN網(wǎng)頁(yè)爬取
csdn中目標(biāo)內(nèi)容如下:
其路徑級(jí)別分別是:
[圖片上傳失敗...(image-f40fa-1578630736864)]
初始爬下來(lái)的結(jié)果如下:
很麻煩,最開(kāi)始是動(dòng)態(tài)網(wǎng)頁(yè),很難找到它的具體工作方法,雖然花花時(shí)間也能找到。
但沒(méi)有時(shí)間了,而且我們的目標(biāo)不是網(wǎng)頁(yè)爬取。綜合考慮:觀察規(guī)律,調(diào)程序要用的時(shí)間還不如復(fù)制粘貼,復(fù)制CSDN文章用時(shí)不過(guò)30分鐘,于是CSDN的文章都來(lái)自復(fù)制粘貼
簡(jiǎn)書(shū)網(wǎng)站也同樣,最初形式是動(dòng)態(tài)網(wǎng)頁(yè),初步獲取結(jié)果是JSON文件,沒(méi)有有用信息。于是簡(jiǎn)書(shū)的內(nèi)容也都是復(fù)制粘貼。
比較友好的是石墨文檔了,雖然數(shù)量較少,爬蟲(chóng)并不能節(jié)省很多時(shí)間,但我還是做了嘗試,初步結(jié)果如下:

代碼如下:
import requests from bs4 import BeautifulSoup import re def getHTMLText(url): try:
r = requests.get(url, timeout=30)
r.raise_for_status() # 如果狀態(tài)碼不是200,產(chǎn)生異常 r.encoding = 'utf-8' # 字符編碼格式改成 utf-8 return r.text except: # 異常處理 return " error " def findHTMLText(text):
soup = BeautifulSoup(text, "html.parser") # 返回BeautifulSoup對(duì)象 return soup.find_all(string=re.compile('article')) # 結(jié)合正則表達(dá)式,實(shí)現(xiàn)字符串片段匹配 url = "https://blog.csdn.net/feit2417/article/details/85925586" text = getHTMLText(url) # 獲取html文本內(nèi)容 res = findHTMLText(text) # 匹配結(jié)果 print(res) # 打印輸出
最終結(jié)果如txts文件夾所示,爬取130份作品。這里要對(duì)數(shù)量說(shuō)明的是:
抓取時(shí)間較早,十二文藝拓展的作品上傳的不是很多。
在瀏覽信息時(shí)也發(fā)現(xiàn)一些同學(xué)由于上傳的是圖片,整體信息量很少,或者有得干脆沒(méi)有文字,只有圖片,這個(gè)對(duì)于文本分析這一項(xiàng)不是很友好。所以沒(méi)有抓取。
對(duì)于小眾網(wǎng)站,如微博,B站,有一些采取手動(dòng)復(fù)制粘貼,一部分如B站不能進(jìn)行網(wǎng)頁(yè)復(fù)制的就放棄了,但放棄的數(shù)量并不多,并不影響結(jié)果。
某位同學(xué)的作品展示,由于一些原因,不是很想將作品與人一一對(duì)應(yīng),感覺(jué)不太好。

二. 語(yǔ)料處理
如博客http://m.itdecent.cn/p/b87e01374a65中所言,對(duì)于獲取到的文本信息,進(jìn)行數(shù)據(jù)預(yù)處理是比較重要的一項(xiàng)工作,對(duì)此,我根據(jù)NLP庫(kù)所支持的功能以及本次統(tǒng)計(jì)的目標(biāo),做出基本數(shù)據(jù)處理如下:
1. 語(yǔ)料清洗
對(duì)于爬取的網(wǎng)頁(yè)信息,刪除一些冗余的廣告,標(biāo)識(shí)符,文字等是比較重要的一步,這些多余的文字會(huì)對(duì)文本分析產(chǎn)生噪聲影響。但爬蟲(chóng)技術(shù)本身就簡(jiǎn)省了很多冗余的信息,它僅僅挑選出文本內(nèi)容,問(wèn)題反而是由于缺少了標(biāo)題,一些重要的信息被隱去,標(biāo)題對(duì)于文本內(nèi)容有很大的指導(dǎo)性。所幸,鏈接里部分人給出了標(biāo)題,減輕一些工作。
第二個(gè)問(wèn)題就是由于圖片的爬取帶來(lái)的多余空格,多余標(biāo)記,CSDN的復(fù)制粘貼會(huì)自動(dòng)有一些話,圖片會(huì)帶來(lái)較多的空格等問(wèn)題

代碼如下:(sortTxt.py)
<pre style="text-indent:18.0pt;background:#2B2B2B">if __name__=="__main__":
sourcePath="C:\\Users\\spark\\Desktop\\新建文件夾/" sinkPath="C:\\Users\\spark\\Desktop\\新建文件夾/txts/" file=open(sourcePath+"ex.txt","r",encoding='utf-8')
fileIndex=110 content="" while 1:
line=file.readline() if not line:break
if line=="pp\n":
file_w=open(sinkPath+str(fileIndex)+".txt","w",encoding='utf-8')
file_w.write(content)
file_w.close()
content="" fileIndex+=1 else: if line=="\n": continue
if line.find("版權(quán)聲明")!= -1: continue
if line.find("原文鏈接")!= -1:
continue content+=line
file.close()</pre>
2. 詞性標(biāo)注
文本分析中,一些連接詞,,語(yǔ)氣助詞等沒(méi)有什么意義:如“的”,“了”等,但會(huì)出現(xiàn)很多次,并且一些名詞,動(dòng)詞包含了重要信息:名詞表現(xiàn)了文本內(nèi)容的對(duì)象,而動(dòng)詞則會(huì)體現(xiàn)一些情感傾向。除此之外,博客中也提到,雖然對(duì)于簡(jiǎn)單的NLP庫(kù)處理,詞性標(biāo)注的作用并不多,但是在人工智能中用于知識(shí)表示與推理,詞性標(biāo)注與總結(jié)則會(huì)很有用。因此我做了初步嘗試如下:

對(duì)于相同的此行進(jìn)行歸類(lèi),形成詞匯庫(kù),結(jié)果如文件夾Paticiple所示。
如下圖:總結(jié)了量詞,連詞,名詞,動(dòng)詞,副詞,標(biāo)點(diǎn)還有一些TAG不是很能看懂,但由于跟本次實(shí)驗(yàn)?zāi)繕?biāo)無(wú)關(guān),因此不做深究。

代碼如下:
<pre style="margin-bottom:12.0pt;text-indent:18.0pt;background:#2B2B2B">from snownlp import SnowNLP import os def FindLoc(labels,tag): for i in range(len(labels)): if labels[i]==tag: return i return len(labels) if __name__=="__main__":
sourcePath="C:\\Users\\spark\\Desktop\\新建文件夾/txts/" sinkPath="C:\\Users\\spark\\Desktop\\新建文件夾\\processing\\Pariciple/" for roots, dirs, files in os.walk(sourcePath):#獲取結(jié)點(diǎn) for filename in files:
file=open(sourcePath+filename,'r',encoding="utf-8")
content = file.read()
content = SnowNLP(content)
tags = [x for x in content.tags]
lists = []
label = [] for tag in tags:
loc = FindLoc(label, tag[1]) if loc == len(label):
label.append(tag[1])
lists.append([])
lists[loc].append(tag[0])
file_w=open(sinkPath+filename,'w',encoding="utf-8") for i in range(len(lists)):
file_w.write(label[i])
file_w.write(": ") for each in lists[i]:
file_w.write(each)
file_w.write(" ")
file_w.write("\n")
file_w.close()
file.close()</pre>
3. 斷句
斷句同樣有助于對(duì)文本內(nèi)容的整理,雖然中文的竹式結(jié)構(gòu)斷句的作用不是很大,但是對(duì)于英語(yǔ),斷句能夠清晰有力的摘取到一個(gè)句子的主謂賓,有利于對(duì)句意的了解與分析。而且,對(duì)于基于全文的詞匯統(tǒng)計(jì)與情感分析與基于句子的分析效果是不一樣的,一段話可能欲揚(yáng)先抑,因此會(huì)出現(xiàn)某些句子的情感傾向于負(fù)面,某些傾向于正面。
斷句階段里,對(duì)每一個(gè)同學(xué)的文本進(jìn)行斷句分析,并將結(jié)果寫(xiě)入Sentence文件夾中,在后面的情感分析和信息量統(tǒng)計(jì)中將會(huì)用到。

代碼如下:(3_sentence.py)
<pre style="text-indent:18.0pt;background:#2B2B2B">from snownlp import SnowNLP import os def FindLoc(labels,tag): for i in range(len(labels)): if labels[i]==tag: return i return len(labels) if __name__=="__main__":
sourcePath="C:\\Users\\spark\\Desktop\\新建文件夾/txts/" sinkPath="C:\\Users\\spark\\Desktop\\新建文件夾\\processing\\sentences/" for roots, dirs, files in os.walk(sourcePath):#獲取結(jié)點(diǎn) for filename in files:
file=open(sourcePath+filename,'r',encoding="utf-8")
content = file.read()
content = SnowNLP(content)
sentences=content.sentences # sentences=SnowNLP(sentences)
# print(sentences.tf)
# print(sentences.idf) file_w = open(sinkPath + filename, 'w', encoding="utf-8") for each in sentences:
file_w.write(each)
file_w.write("\n")
file_w.close()
file.close()</pre>
4. 信息量統(tǒng)計(jì)
同樣有一點(diǎn)值得好奇的是:大家的作業(yè)含金量如何?
并且,主觀評(píng)價(jià)又與機(jī)器評(píng)價(jià)的差距在哪里?
因此,信息評(píng)價(jià)也是很有趣的一部分。博文中有用到IDF與TF評(píng)價(jià)標(biāo)準(zhǔn)。前者是統(tǒng)計(jì)詞匯出現(xiàn)的頻率,而后者則表示文檔中詞匯的重要性。
下面是做的基于斷句的IDF TF檢驗(yàn):

效果并不是想象中那樣。原因是基于斷句的數(shù)量統(tǒng)計(jì),對(duì)象是斷句,其實(shí)、應(yīng)該在斷句基礎(chǔ)上再次分詞,使得整個(gè)文本根據(jù)斷句形成一條一條的內(nèi)容,每一條內(nèi)容中有詞匯。
作出改動(dòng)后效果如下:
基于斷句的分詞:

結(jié)果:idf.txt

代碼如下:
<pre style="margin-bottom:12.0pt;text-indent:18.0pt;background:#2B2B2B">from snownlp import SnowNLP import os import numpy as np def FindLoc(labels,tag): for i in range(len(labels)): if labels[i]==tag: return i return len(labels) if __name__=="__main__":
sourcePath="C:\\Users\\spark\\Desktop\\新建文件夾/processing/sentences/" sinkPath="C:\\Users\\spark\\Desktop\\新建文件夾\\processing\\TFIDF/" file_w = open(sinkPath + "idfs.txt", 'w', encoding="utf-8") for roots, dirs, files in os.walk(sourcePath):#獲取結(jié)點(diǎn) for filename in files:
file=open(sourcePath+filename,'r',encoding="utf-8")
content=[] while 1:
line=file.readline() if not line:break line=SnowNLP(line)
content.append(line.words)
content = SnowNLP(content)
tf=content.tf
idf=content.idf
res=sorted(idf.items(),key=lambda d:d[1],reverse=True)
v=list(idf.values())
meanValue=np.mean(v)
file_w.write(str(meanValue))
file_w.write("\t") for each in res: if each[1]>meanValue:
file_w.write(each[0])
file_w.write("\n")
file.close()
file_w.close() </pre>
5. 情感分析
NLP庫(kù)中有趣的還有情感分析功能,博文中也提到根據(jù)詞匯庫(kù)可以自己判斷情感傾向。因此,設(shè)想同學(xué)創(chuàng)作作品進(jìn)行情感分析,尤其可以根據(jù)十二個(gè)一的情感傾向統(tǒng)計(jì),從而獲得人們對(duì)于十二個(gè)一的大致整體印象。這會(huì)很有趣。
但結(jié)果是這樣的:(sentiments.txt)

這樣精確的1.0總讓人懷疑是不是出錯(cuò)了,然而對(duì)比例子與自己的方法,并沒(méi)有什么BUG,
我試圖給自己結(jié)論如下:
1. 調(diào)庫(kù)的函數(shù)本來(lái)就不是十分精確
2. 對(duì)于十二個(gè)一,作業(yè)中的情感傾向本來(lái)就比較模糊,偏向正面。
代碼如sentiments.py所示
6. 摘要
摘要就很有意思了,對(duì)于大量文本的摘要有利于信息提煉,形成詞云也很不錯(cuò)嘛
結(jié)果如下:sammary.txt
要說(shuō)明一下的是摘要,情感判斷與信息量統(tǒng)計(jì)是以一個(gè)人為單位統(tǒng)計(jì)所有人的結(jié)果。

代碼如下:points.py
<pre style="margin-bottom:12.0pt;text-indent:18.0pt;background:#2B2B2B">from snownlp import SnowNLP import os def FindLoc(labels,tag): for i in range(len(labels)): if labels[i]==tag: return i return len(labels) if __name__=="__main__":
sourcePath="C:\\Users\\spark\\Desktop\\新建文件夾/txts/" sinkPath="C:\\Users\\spark\\Desktop\\新建文件夾\\processing\\" file_w = open(sinkPath + "summery.txt", 'w', encoding="utf-8") for roots, dirs, files in os.walk(sourcePath):#獲取結(jié)點(diǎn) for filename in files:
file=open(sourcePath+filename,'r',encoding="utf-8")
content = file.read()
content = SnowNLP(content)
summary=content.summary(limit=3) for each in summary:
file_w.write(each)
file_w.write("\n")
file.close()
file_w.close()</pre>
7.生成詞云
詞云的制作往往能有效,直觀得展現(xiàn)文本的重要信息
對(duì)所有人的摘要進(jìn)行詞云可視化:

有用的關(guān)鍵詞有“喜歡”,“不會(huì)”,“團(tuán)隊(duì)”等,反映了同學(xué)對(duì)十二個(gè)一創(chuàng)作內(nèi)容多用團(tuán)隊(duì),有情感傾向。但同時(shí)也有很多繁雜的信息,因此對(duì)部分單個(gè)人的作品做出慈詞云分析如下:
1.txt 關(guān)鍵詞:殺手,任務(wù) 2.txt 關(guān)鍵詞:魔法,人類(lèi)


三. 結(jié)果分析
信息量可視化:

情感判斷可視化:

詞云:

總結(jié):
總結(jié)這次實(shí)驗(yàn)效果并沒(méi)有達(dá)到理想中對(duì)十二個(gè)一進(jìn)行分析,原因有二:
- 題目很雜,十二個(gè)一的標(biāo)定很不清楚。因?yàn)轭}目也同時(shí)設(shè)置了大五人格測(cè)試,角色幻想(4個(gè))以及12個(gè)一,因此很難拿對(duì)應(yīng)是那個(gè)題目,即使題目又單拎出來(lái),但也不容易分類(lèi),而且對(duì)于十二個(gè)一大家的編號(hào)又不盡相同,順序不一,難以歸類(lèi)。除非人工去做,靠機(jī)器就得判斷圖像,判斷語(yǔ)義,這個(gè)難度與工作量過(guò)高。
NLP庫(kù)的效果也不是十分好