NLP處理

一. 網(wǎng)頁(yè)抓取

對(duì)于同學(xué)的創(chuàng)作進(jìn)行文本處理首先需要通過(guò)爬蟲(chóng)技術(shù)得到TXT文本。

首先從鏈接里復(fù)制所有人的鏈接如下:

1.PNG

觀察鏈接,發(fā)現(xiàn)一個(gè)比較麻煩的事情:每個(gè)人用的網(wǎng)站不盡相同,因此也增大了爬蟲(chóng)的難度。但大部分人用的是CSDN博客,小部分人使用簡(jiǎn)書(shū)與石墨文檔。

對(duì)網(wǎng)頁(yè)使用比例統(tǒng)計(jì)如下:

2.PNG

因此首先研究CSDN網(wǎng)頁(yè)爬取

csdn中目標(biāo)內(nèi)容如下:

3.PNG

其路徑級(jí)別分別是:
[圖片上傳失敗...(image-f40fa-1578630736864)]

5.PNG
6.PNG

初始爬下來(lái)的結(jié)果如下:


7.PNG

很麻煩,最開(kāi)始是動(dòng)態(tài)網(wǎng)頁(yè),很難找到它的具體工作方法,雖然花花時(shí)間也能找到。

8.PNG

但沒(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é)果如下:

9.png

代碼如下:

  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ō)明的是:

  1. 抓取時(shí)間較早,十二文藝拓展的作品上傳的不是很多。

  2. 在瀏覽信息時(shí)也發(fā)現(xiàn)一些同學(xué)由于上傳的是圖片,整體信息量很少,或者有得干脆沒(méi)有文字,只有圖片,這個(gè)對(duì)于文本分析這一項(xiàng)不是很友好。所以沒(méi)有抓取。

  3. 對(duì)于小眾網(wǎng)站,如微博,B站,有一些采取手動(dòng)復(fù)制粘貼,一部分如B站不能進(jìn)行網(wǎng)頁(yè)復(fù)制的就放棄了,但放棄的數(shù)量并不多,并不影響結(jié)果。

某位同學(xué)的作品展示,由于一些原因,不是很想將作品與人一一對(duì)應(yīng),感覺(jué)不太好。

10.png

二. 語(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)題

11.png

代碼如下:(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ì)很有用。因此我做了初步嘗試如下:


12.png

對(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),因此不做深究。

13.png

代碼如下:

<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ì)用到。

14.png

代碼如下:(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):

15.png

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

作出改動(dòng)后效果如下:

基于斷句的分詞:

16.png

結(jié)果:idf.txt

17.png

代碼如下:

<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)

18.png

這樣精確的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é)果。


19.png

代碼如下: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)行詞云可視化:


20.png

有用的關(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)

21.png
22.png

三. 結(jié)果分析

信息量可視化:

23.png

情感判斷可視化:

24.png

詞云:

26.png

總結(jié):

總結(jié)這次實(shí)驗(yàn)效果并沒(méi)有達(dá)到理想中對(duì)十二個(gè)一進(jìn)行分析,原因有二:

  1. 題目很雜,十二個(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ù)的效果也不是十分好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容