DOI:10.19850/j.cnki.2096-4706.2021.08.005
摘? 要:在網(wǎng)絡(luò)技術(shù)高速發(fā)展的背景下,信息紛亂繁雜,如何能夠獲得需要的文本信息,成了許多企業(yè)或組織關(guān)注的問題。該項(xiàng)目以采集的豆瓣電影評(píng)論數(shù)據(jù)為例,使用Python 語言和樸素貝葉斯等多種算法,對(duì)文本挖掘進(jìn)行全流程的分析,包括對(duì)其特征及其子集進(jìn)行提取,并對(duì)文本進(jìn)行聚類和分類處理,同時(shí)采用交叉驗(yàn)證方法對(duì)模型進(jìn)行調(diào)整,從而預(yù)測有關(guān)評(píng)論的類型,并將其作為電影推薦的一個(gè)標(biāo)準(zhǔn)。
關(guān)鍵詞:文本分詞;文本向量化;詞頻矩陣;樸素貝葉斯
中圖分類號(hào):TP391.1? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2021)08-0017-04
Classification and Analysis of Network Comments Based on Text Mining Algorithm
——Take Douban Film Review as an Example
WANG Rui
(Jincheng College of Sichuan University,Chengdu? 611731,China)
Abstract:Under the background of the rapid development of network technology,information is messy and complicated,and how to obtain the required text information has become a concern for many enterprises or organizations. Taking the collected Douban film review data as an example,this project uses Python language,Naive Bayes and other algorithms to analyze the whole process of text mining,including extracting its features and subsets,clustering and classifying the text,and adjusting the model by cross validation method,so as to predict the types of relevant reviews,and take it as a standard for film recommendation.
Keywords:text segmentation;text vectorization;word frequency matrix;Naive Bayes
0? 引? 言
隨著信息網(wǎng)絡(luò)的高速發(fā)展,發(fā)表言論的平臺(tái)越來越多,其門檻也越來越低,各種海量數(shù)據(jù)實(shí)時(shí)更新,以至于言論窗口充斥著一些結(jié)構(gòu)不規(guī)范的文本。個(gè)人或者組織想要從中提取具有針對(duì)性且有使用價(jià)值的信息,必須對(duì)初步獲得的文本數(shù)據(jù)進(jìn)行充分的處理。由于文本是人類使用的自然語言,具有非結(jié)構(gòu)化的特征,計(jì)算機(jī)識(shí)別起來會(huì)具有一定的機(jī)械性和局限性,這使得在進(jìn)行處理和分析文本的操作過程中會(huì)遇到更多的困難,所以在處理文本時(shí)不能簡單地使用傳統(tǒng)的數(shù)據(jù)處理方式[1]。文本挖掘是針對(duì)文本的一種分析處理算法,雖然近幾年個(gè)人或者企業(yè)對(duì)其的需求有所上升,但是文本挖掘仍存在著一些問題,因其發(fā)展歷史相比較于傳統(tǒng)的數(shù)據(jù)挖掘方式的歷史較短,且方法不夠成熟,所以并沒有被廣泛使用,而且人們對(duì)于文本挖掘使用領(lǐng)域的認(rèn)知也比較單一[2]。評(píng)論是諸多平臺(tái),例如美食、購物、住宿等平臺(tái)獲得產(chǎn)品反饋、提高服務(wù)質(zhì)量的一大依據(jù),也是消費(fèi)者獲得相關(guān)信息的重要途徑。但是對(duì)平臺(tái)來說,不是所有的評(píng)論都具有分析價(jià)值,比如一些產(chǎn)品有成百上千條評(píng)論,其中會(huì)有很多和所提供服務(wù)或者產(chǎn)品毫不相干的評(píng)論;當(dāng)然對(duì)消費(fèi)者來說,也不是所看到的評(píng)論就代表著產(chǎn)品的品質(zhì),因?yàn)楹芏嗳丝赡苤粫?huì)看前面幾十條評(píng)論就對(duì)產(chǎn)品或者服務(wù)的好壞下結(jié)論。文本挖掘很重要的一個(gè)意義就是可以深入人力所不能及的范圍,細(xì)微地處理無用的信息、系統(tǒng)地分析評(píng)論的趨勢,從而為平臺(tái)和消費(fèi)者提供更精確的信息。此項(xiàng)目以預(yù)測豆瓣網(wǎng)站電影的評(píng)論類別為例,對(duì)評(píng)論這種分布不均勻、多樣化的文本進(jìn)行處理和分析,目的是對(duì)文本挖掘在網(wǎng)絡(luò)評(píng)論分析方面的作用、文本挖掘的相關(guān)方法和意義進(jìn)行更加具體的闡釋和展示,此項(xiàng)目的基本流程是數(shù)據(jù)采集、情感分析、數(shù)據(jù)預(yù)處理、文本特征提取、模型建立和模型輸出。
1? 相關(guān)技術(shù)
1.1? 爬蟲技術(shù)
調(diào)用了requests庫進(jìn)行初步的文本收集,這種方式在處理Cookies、登錄驗(yàn)證、代理設(shè)置等操作方面都更加簡單高效,使用比較廣泛,更重要的是也能夠滿足項(xiàng)目所需。
爬蟲技術(shù)核心代碼為:
def get_html(url):
session = requests.session()
ua = UserAgent().random
headers={'Cookie':,
'User-Agent':ua,
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Referer':'https://movie.douban.com/subject/30378158/'
}
rqg=requests.get(url,headers=headers)
rqg.encoding=chardet.detect(rqg.content)['encoding']
html=rqg.content.decode('utf-8')
return html,ua
def get_movie_comments(comments_url,count_g,count_b):
lis = []
ret,ua = get_html(comments_url)
time.sleep(random.random())
try:
ret = json.loads(ret)['html']
except:
with open('F://未爬取網(wǎng)址.txt','a',encoding='utf-8')as k:
k.write(comments_url+','+ua+'\n')
pass
rat = re.findall('class="allstar.*? rating" title="(.*?)">', ret, re.S)
comment = re.findall('(.*?)',ret,re.S)
comment = [x.strip() for x in comment]
ret = list(zip(rat,comment))
for ele in ret:
rate = ele[0]
if rate=='力薦' or rate=='推薦':
f1 = open('F:\\好評(píng)\\好評(píng)-{}.txt'.format(count_g), 'w', encoding='utf-8')
f1.write(ele[1])
f1.close()
count_g=count_g+1
elif rate=='較差' or rate=='很差':
f3 = open('F:\\差評(píng)\\差評(píng)-{}.txt'.format(count_b), 'w', encoding='utf-8')
f3.write(ele[1])
f3.close()
count_b=count_b+1
return count_g,count_b
1.2? 中文分詞技術(shù)
不同于英文每一個(gè)單詞具有明確的劃分標(biāo)準(zhǔn),中國的漢字博大精深、歷史悠久。一個(gè)詞語或者一句話在不同的語境里有多種切分方式,并且隨著網(wǎng)絡(luò)用詞的不斷更新,許多具有現(xiàn)時(shí)意義的詞語并不能為計(jì)算機(jī)所識(shí)別。jieba庫是Python自帶的第三方庫,不僅支持簡繁體中文,而且可以自定義詞典以便提高分詞的準(zhǔn)確性。由于爬取下來的文本中會(huì)存在一些對(duì)文本研究意義不大的停用詞,所以項(xiàng)目選擇調(diào)用jieba庫對(duì)停用詞進(jìn)行過濾。分詞技術(shù)代碼為:
import jieba
def get_word(data):
ret=[]
for i in data:
a=jieba.lcut(i)
ret.append("".join(a))
return ret
def get_custom_stopword(stop_word_file):
with open(stop_word_file,encoding="utf-8") as f:
stop_word = f.read()
stop_word_list = stop_word.split("\n")
custom_stopword = [i for i in stop_word_list]
return custom_stopword
1.3? 文本向量化技術(shù)
由于計(jì)算機(jī)比較擅于處理電子表格、數(shù)據(jù)庫這樣的結(jié)構(gòu)化數(shù)據(jù),但是文本是人類的語言,所以將非結(jié)構(gòu)化的文本轉(zhuǎn)變成結(jié)構(gòu)化的數(shù)據(jù)是非常必要的。通常有兩種方式:一是計(jì)算出詞頻,二是計(jì)算出TF-IDF。將文本轉(zhuǎn)化為結(jié)構(gòu)化數(shù)據(jù)以方便計(jì)算機(jī)進(jìn)行識(shí)別,這里用到了向量化方法,即CountVectorizer()函數(shù)的調(diào)用。
2? 數(shù)據(jù)采集及探索
2.1? 數(shù)據(jù)規(guī)模及比例
項(xiàng)目選取了十部電影的評(píng)論進(jìn)行數(shù)據(jù)爬取,為了保證好評(píng)和差評(píng)比例大致相同從而獲得更有代表性的數(shù)據(jù),電影名稱是依靠主觀想法選擇的。項(xiàng)目采集了共4 777條豆瓣網(wǎng)站電影評(píng)論,將爬取的數(shù)據(jù)以txt文本的形式存儲(chǔ)在好評(píng)和差評(píng)兩個(gè)本地文件夾中,其中好評(píng)數(shù)據(jù)有2 831條,差評(píng)數(shù)據(jù)有1 946條,兩者數(shù)據(jù)分布比例約為3:2。在建立模型過程中,選取好評(píng)和差評(píng)各500條作為訓(xùn)練集,另外從訓(xùn)練集中選取好評(píng)和差評(píng)各50條作為測試集。
2.2? 數(shù)據(jù)情感分析
運(yùn)用SnowNLP情感分析類庫,對(duì)評(píng)論數(shù)據(jù)進(jìn)行初步探索,即預(yù)測輸入句子屬于正面和負(fù)面的概率。并盡量去除一些異常評(píng)論、無效無關(guān)評(píng)論和重復(fù)評(píng)論,例如不符合一般規(guī)律的評(píng)分高的負(fù)面評(píng)論,以此降低劣質(zhì)文本的作用效果,提升文本數(shù)據(jù)的質(zhì)量,以提高文本挖掘的信噪比[3]。該方法內(nèi)部運(yùn)用貝葉斯模型,實(shí)現(xiàn)輸入數(shù)據(jù),返回0~1的小數(shù),越接近1證明該評(píng)論越積極,相反,越接近0證明該評(píng)論越消極,因?yàn)閿?shù)據(jù)量足夠,所以可以取接近極端值的數(shù)據(jù):正面取大于0.99的數(shù)據(jù),負(fù)面取小于0.2的數(shù)據(jù)。
3? 數(shù)據(jù)預(yù)處理
3.1? 分詞處理
此項(xiàng)目就是基于jieba庫并使用精確模式返回一個(gè)列表,即使用jieba.lcut()將文本進(jìn)行分詞處理。由于jieba庫自帶的分詞庫不是特別完善,此項(xiàng)目根據(jù)實(shí)際所需自定義了分詞庫,以便能夠得到更加準(zhǔn)確的分詞結(jié)果。
3.2? 去停用詞
為了降低特征維度,提高文本分類算法的效率,此項(xiàng)目同樣調(diào)用jieba庫,并利用for循環(huán)語句在停用詞列表中查找,以此過濾沒有意義的停用詞。停用詞庫也是基于項(xiàng)目所需,結(jié)合了目前廣泛使用的停用詞表。除此之外,去停用詞還能夠節(jié)約計(jì)算資源,并且更加準(zhǔn)確地反映文本的主要內(nèi)容。
4? 文本特征提取
4.1? 詞云特征分析可視化
詞云展示所使用的函數(shù)方法是wordcloud(),詞云不僅能夠形象的將文本的主要內(nèi)容進(jìn)行呈現(xiàn),清晰明了地展示出在一個(gè)測試集里面最為重要的關(guān)鍵詞,同時(shí)也可以檢驗(yàn)停用詞的處理環(huán)節(jié)是否完善,因?yàn)槿绻煌晟?,詞云中會(huì)不可避免地出現(xiàn)一些無意義的單個(gè)詞。從選取的詞云圖中也可以看出導(dǎo)演、劇情、主演和故事真實(shí)程度對(duì)觀看者的評(píng)價(jià)產(chǎn)生很重要的影響,這也正對(duì)應(yīng)著詞頻中出現(xiàn)次數(shù)最多的幾個(gè)詞語。測試集的詞云展示如圖1所示。
4.2? 向量化處理方法
在樸素貝葉斯模型下,分別使用TfIdfVectorizer()方法和CountVectorizer()方法進(jìn)行向量化處理,最終選擇準(zhǔn)確率較高的CountVectorizer()向量化處理方法,也就是構(gòu)建一個(gè)計(jì)算出詞頻的方法,并生成詞頻矩陣,同時(shí)也將所有的詞裝入詞袋,詞袋模型不考慮文本的詞序、語言、句法等信息,而將文本簡單地看成詞匯的集合,且每個(gè)詞匯相互獨(dú)立,這一模型在文本挖掘領(lǐng)域廣泛使用[4]。
5? 分類模型建立
5.1? 樸素貝葉斯模型
模型建立的算法通常使用K近鄰算法、樸素貝葉斯和決策樹模型。由于樸素貝葉斯算法的邏輯比較簡單且算法比較穩(wěn)定,當(dāng)數(shù)據(jù)呈現(xiàn)不同的特點(diǎn)時(shí),其分類性能的差異性比較小,在本項(xiàng)目中采用了這一算法進(jìn)行模型建立。
5.2? K-折交叉驗(yàn)證
利用for循環(huán),將參數(shù)依次賦值并對(duì)每一個(gè)結(jié)果求平均值,最終確定K值取5時(shí)為最佳參數(shù),使用交叉驗(yàn)證得到的訓(xùn)練集的準(zhǔn)確率(四舍五入保留三位小數(shù))分別為0.950、0.955、0.941、0.909、0.905。從以上數(shù)據(jù)可以看出準(zhǔn)確率相差不大,其平均值約為0.932。
分類模型及測試實(shí)現(xiàn)方式:
from sklearn.naive_bayes import GaussianNB
from sklearn.feature_extraction.text import CountVectorizer
k_rangemin = range(1,16)
k_scores = []
max_df=0.8
for min_df in k_rangemin:
cv = CountVectorizer(max_df = max_df,
min_df = min_df,
stop_words=frozenset(stopwords))
X_zong=(x_train+x_test)
cv_zong=cv.fit_transform(X_zong)
cv_train=cv.fit_transform(x_train)
cv_test=cv.transform(x_test)
#? ? ?print(cv.get_feature_names())
#? ? ?print(cv_train.toarray())
X=cv_train.toarray()
X_zong1=cv_zong.toarray()
y=[0]*500+[1]*500
X_test=cv_test.toarray()
y_test=[0]*50+[1]*50
clf = GaussianNB()
clf.fit(X,y)
Y_pred=clf.predict(X_test)
print(Y_pred)
score=clf.score(X_test,y_test)
print(score)
Y_tag=[0]*500+[1]*500+[0]*50+[1]*50
clf.fit(X_zong1,Y_tag)
scores = cross_val_score(clf, X_zong1, Y_tag, cv = 5, scoring = 'accuracy')
k_scores.append(scores.mean())
print(scores)
6? 模型輸出和評(píng)價(jià)
如圖2所示,模型輸出是對(duì)準(zhǔn)確率和參數(shù)之間的關(guān)系進(jìn)行可視化展示,可以更加清楚地檢驗(yàn)所選取參數(shù)的可信度[5]。
本項(xiàng)目通過import matplotlib.pyplot as plt方法生成min_df的值在1~16范圍內(nèi)分別對(duì)應(yīng)的準(zhǔn)確率,而且根據(jù)高斯樸素貝葉斯符合正態(tài)分布可以判斷,準(zhǔn)確率會(huì)在某一點(diǎn)達(dá)到最大值,從圖2可以看出當(dāng)min_df參數(shù)是8的時(shí)候準(zhǔn)確率達(dá)到最大值,此參數(shù)代表此時(shí)模型最佳,而準(zhǔn)確率則代表在最佳模型下得到的是已給數(shù)據(jù)的最佳分?jǐn)?shù),這是評(píng)估模型的一種度量標(biāo)準(zhǔn)。
7? 結(jié)? 論
本次項(xiàng)目是基于豆瓣電影評(píng)論對(duì)文本挖掘的整個(gè)流程進(jìn)行闡釋,對(duì)文本進(jìn)行了爬取、分詞、文本向量化等一系列操作。項(xiàng)目還需要進(jìn)一步地完善。首先因文本挖掘的技術(shù)手段不如數(shù)據(jù)挖掘成熟,其次就是在不同的項(xiàng)目中適用的方法和模型也是不同的,比如當(dāng)改變算法或者參數(shù)的時(shí)候,會(huì)導(dǎo)致準(zhǔn)確率發(fā)生變化,所以在處理這個(gè)項(xiàng)目的時(shí)候,需要注意的是,對(duì)于運(yùn)用哪種方法和建立哪種模型必須進(jìn)行充分的思考和實(shí)驗(yàn),從而得出比較科學(xué)的支撐依據(jù)。當(dāng)然就本項(xiàng)目來說,也存在和其他文本挖掘項(xiàng)目相同的問題——分詞庫和停用詞庫不完善,所以文本挖掘這一領(lǐng)域仍需要大量的探索和實(shí)踐,未來的研究中應(yīng)該更加關(guān)注數(shù)據(jù)本身的質(zhì)量和真實(shí)性并完善詞典的構(gòu)建。通過這個(gè)項(xiàng)目可以看出文本挖掘在網(wǎng)絡(luò)評(píng)價(jià)分析方面發(fā)揮了很重要的作用,目前有很多組織或企業(yè)通過文本挖掘來提取相關(guān)產(chǎn)品的客戶反饋,并提高自身的產(chǎn)品質(zhì)量和服務(wù)水平。盡管這種方式還沒有很完善,但是當(dāng)其得到更加廣泛的推廣后,其中包含的技術(shù)也一定會(huì)越來越完善。相信當(dāng)這種方式走向成熟時(shí),其會(huì)廣泛地應(yīng)用于更多的領(lǐng)域,例如商品貿(mào)易、新聞出版、醫(yī)療和教育等等,那么我們的生活也會(huì)獲得更多的便利。
參考文獻(xiàn):
[1] 張公讓,鮑超,王曉玉,等.基于評(píng)論數(shù)據(jù)的文本語義挖掘與情感分析 [J].情報(bào)科學(xué),2021,39(5):53-61.
[2] 王繼成,潘金貴,張福炎.Web文本挖掘技術(shù)研究 [J].計(jì)算機(jī)研究與發(fā)展,2000(5):513-520.
[3] 張驍,周霞,王亞丹.中國科技服務(wù)業(yè)政策的量化與演變——基于扎根理論和文本挖掘分析 [J].中國科技論壇,2018(6):6-13.
[4] 袁桂霞,周先春.基于多媒體信息檢索的有監(jiān)督詞袋模型 [J].計(jì)算機(jī)工程與設(shè)計(jì),2018,39(9):2873-2878.
[5] 程斌,高圣國.基于細(xì)粒度情感的文本挖掘及可視化分析 [J].應(yīng)用數(shù)學(xué)進(jìn)展,2021,10(1):128-136.
作者簡介:王睿(2000.09—),女,漢族,安徽亳州人,本科在讀,研究方向:大數(shù)據(jù)算法。
收稿日期:2021-03-13