DOI:10.19850/j.cnki.2096-4706.2021.08.005
摘? 要:在網絡技術高速發展的背景下,信息紛亂繁雜,如何能夠獲得需要的文本信息,成了許多企業或組織關注的問題。該項目以采集的豆瓣電影評論數據為例,使用Python 語言和樸素貝葉斯等多種算法,對文本挖掘進行全流程的分析,包括對其特征及其子集進行提取,并對文本進行聚類和分類處理,同時采用交叉驗證方法對模型進行調整,從而預測有關評論的類型,并將其作為電影推薦的一個標準。
關鍵詞:文本分詞;文本向量化;詞頻矩陣;樸素貝葉斯
中圖分類號:TP391.1? ? ? ?文獻標識碼:A 文章編號: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? 引? 言
隨著信息網絡的高速發展,發表言論的平臺越來越多,其門檻也越來越低,各種海量數據實時更新,以至于言論窗口充斥著一些結構不規范的文本。個人或者組織想要從中提取具有針對性且有使用價值的信息,必須對初步獲得的文本數據進行充分的處理。由于文本是人類使用的自然語言,具有非結構化的特征,計算機識別起來會具有一定的機械性和局限性,這使得在進行處理和分析文本的操作過程中會遇到更多的困難,所以在處理文本時不能簡單地使用傳統的數據處理方式[1]。文本挖掘是針對文本的一種分析處理算法,雖然近幾年個人或者企業對其的需求有所上升,但是文本挖掘仍存在著一些問題,因其發展歷史相比較于傳統的數據挖掘方式的歷史較短,且方法不夠成熟,所以并沒有被廣泛使用,而且人們對于文本挖掘使用領域的認知也比較單一[2]。評論是諸多平臺,例如美食、購物、住宿等平臺獲得產品反饋、提高服務質量的一大依據,也是消費者獲得相關信息的重要途徑。但是對平臺來說,不是所有的評論都具有分析價值,比如一些產品有成百上千條評論,其中會有很多和所提供服務或者產品毫不相干的評論;當然對消費者來說,也不是所看到的評論就代表著產品的品質,因為很多人可能只會看前面幾十條評論就對產品或者服務的好壞下結論。文本挖掘很重要的一個意義就是可以深入人力所不能及的范圍,細微地處理無用的信息、系統地分析評論的趨勢,從而為平臺和消費者提供更精確的信息。此項目以預測豆瓣網站電影的評論類別為例,對評論這種分布不均勻、多樣化的文本進行處理和分析,目的是對文本挖掘在網絡評論分析方面的作用、文本挖掘的相關方法和意義進行更加具體的闡釋和展示,此項目的基本流程是數據采集、情感分析、數據預處理、文本特征提取、模型建立和模型輸出。
1? 相關技術
1.1? 爬蟲技術
調用了requests庫進行初步的文本收集,這種方式在處理Cookies、登錄驗證、代理設置等操作方面都更加簡單高效,使用比較廣泛,更重要的是也能夠滿足項目所需。
爬蟲技術核心代碼為:
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://未爬取網址.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:\\好評\\好評-{}.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:\\差評\\差評-{}.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? 中文分詞技術
不同于英文每一個單詞具有明確的劃分標準,中國的漢字博大精深、歷史悠久。一個詞語或者一句話在不同的語境里有多種切分方式,并且隨著網絡用詞的不斷更新,許多具有現時意義的詞語并不能為計算機所識別。jieba庫是Python自帶的第三方庫,不僅支持簡繁體中文,而且可以自定義詞典以便提高分詞的準確性。由于爬取下來的文本中會存在一些對文本研究意義不大的停用詞,所以項目選擇調用jieba庫對停用詞進行過濾。分詞技術代碼為:
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? 文本向量化技術
由于計算機比較擅于處理電子表格、數據庫這樣的結構化數據,但是文本是人類的語言,所以將非結構化的文本轉變成結構化的數據是非常必要的。通常有兩種方式:一是計算出詞頻,二是計算出TF-IDF。將文本轉化為結構化數據以方便計算機進行識別,這里用到了向量化方法,即CountVectorizer()函數的調用。
2? 數據采集及探索
2.1? 數據規模及比例
項目選取了十部電影的評論進行數據爬取,為了保證好評和差評比例大致相同從而獲得更有代表性的數據,電影名稱是依靠主觀想法選擇的。項目采集了共4 777條豆瓣網站電影評論,將爬取的數據以txt文本的形式存儲在好評和差評兩個本地文件夾中,其中好評數據有2 831條,差評數據有1 946條,兩者數據分布比例約為3:2。在建立模型過程中,選取好評和差評各500條作為訓練集,另外從訓練集中選取好評和差評各50條作為測試集。
2.2? 數據情感分析
運用SnowNLP情感分析類庫,對評論數據進行初步探索,即預測輸入句子屬于正面和負面的概率。并盡量去除一些異常評論、無效無關評論和重復評論,例如不符合一般規律的評分高的負面評論,以此降低劣質文本的作用效果,提升文本數據的質量,以提高文本挖掘的信噪比[3]。該方法內部運用貝葉斯模型,實現輸入數據,返回0~1的小數,越接近1證明該評論越積極,相反,越接近0證明該評論越消極,因為數據量足夠,所以可以取接近極端值的數據:正面取大于0.99的數據,負面取小于0.2的數據。
3? 數據預處理
3.1? 分詞處理
此項目就是基于jieba庫并使用精確模式返回一個列表,即使用jieba.lcut()將文本進行分詞處理。由于jieba庫自帶的分詞庫不是特別完善,此項目根據實際所需自定義了分詞庫,以便能夠得到更加準確的分詞結果。
3.2? 去停用詞
為了降低特征維度,提高文本分類算法的效率,此項目同樣調用jieba庫,并利用for循環語句在停用詞列表中查找,以此過濾沒有意義的停用詞。停用詞庫也是基于項目所需,結合了目前廣泛使用的停用詞表。除此之外,去停用詞還能夠節約計算資源,并且更加準確地反映文本的主要內容。
4? 文本特征提取
4.1? 詞云特征分析可視化
詞云展示所使用的函數方法是wordcloud(),詞云不僅能夠形象的將文本的主要內容進行呈現,清晰明了地展示出在一個測試集里面最為重要的關鍵詞,同時也可以檢驗停用詞的處理環節是否完善,因為如果不完善,詞云中會不可避免地出現一些無意義的單個詞。從選取的詞云圖中也可以看出導演、劇情、主演和故事真實程度對觀看者的評價產生很重要的影響,這也正對應著詞頻中出現次數最多的幾個詞語。測試集的詞云展示如圖1所示。
4.2? 向量化處理方法
在樸素貝葉斯模型下,分別使用TfIdfVectorizer()方法和CountVectorizer()方法進行向量化處理,最終選擇準確率較高的CountVectorizer()向量化處理方法,也就是構建一個計算出詞頻的方法,并生成詞頻矩陣,同時也將所有的詞裝入詞袋,詞袋模型不考慮文本的詞序、語言、句法等信息,而將文本簡單地看成詞匯的集合,且每個詞匯相互獨立,這一模型在文本挖掘領域廣泛使用[4]。
5? 分類模型建立
5.1? 樸素貝葉斯模型
模型建立的算法通常使用K近鄰算法、樸素貝葉斯和決策樹模型。由于樸素貝葉斯算法的邏輯比較簡單且算法比較穩定,當數據呈現不同的特點時,其分類性能的差異性比較小,在本項目中采用了這一算法進行模型建立。
5.2? K-折交叉驗證
利用for循環,將參數依次賦值并對每一個結果求平均值,最終確定K值取5時為最佳參數,使用交叉驗證得到的訓練集的準確率(四舍五入保留三位小數)分別為0.950、0.955、0.941、0.909、0.905。從以上數據可以看出準確率相差不大,其平均值約為0.932。
分類模型及測試實現方式:
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? 模型輸出和評價
如圖2所示,模型輸出是對準確率和參數之間的關系進行可視化展示,可以更加清楚地檢驗所選取參數的可信度[5]。
本項目通過import matplotlib.pyplot as plt方法生成min_df的值在1~16范圍內分別對應的準確率,而且根據高斯樸素貝葉斯符合正態分布可以判斷,準確率會在某一點達到最大值,從圖2可以看出當min_df參數是8的時候準確率達到最大值,此參數代表此時模型最佳,而準確率則代表在最佳模型下得到的是已給數據的最佳分數,這是評估模型的一種度量標準。
7? 結? 論
本次項目是基于豆瓣電影評論對文本挖掘的整個流程進行闡釋,對文本進行了爬取、分詞、文本向量化等一系列操作。項目還需要進一步地完善。首先因文本挖掘的技術手段不如數據挖掘成熟,其次就是在不同的項目中適用的方法和模型也是不同的,比如當改變算法或者參數的時候,會導致準確率發生變化,所以在處理這個項目的時候,需要注意的是,對于運用哪種方法和建立哪種模型必須進行充分的思考和實驗,從而得出比較科學的支撐依據。當然就本項目來說,也存在和其他文本挖掘項目相同的問題——分詞庫和停用詞庫不完善,所以文本挖掘這一領域仍需要大量的探索和實踐,未來的研究中應該更加關注數據本身的質量和真實性并完善詞典的構建。通過這個項目可以看出文本挖掘在網絡評價分析方面發揮了很重要的作用,目前有很多組織或企業通過文本挖掘來提取相關產品的客戶反饋,并提高自身的產品質量和服務水平。盡管這種方式還沒有很完善,但是當其得到更加廣泛的推廣后,其中包含的技術也一定會越來越完善。相信當這種方式走向成熟時,其會廣泛地應用于更多的領域,例如商品貿易、新聞出版、醫療和教育等等,那么我們的生活也會獲得更多的便利。
參考文獻:
[1] 張公讓,鮑超,王曉玉,等.基于評論數據的文本語義挖掘與情感分析 [J].情報科學,2021,39(5):53-61.
[2] 王繼成,潘金貴,張福炎.Web文本挖掘技術研究 [J].計算機研究與發展,2000(5):513-520.
[3] 張驍,周霞,王亞丹.中國科技服務業政策的量化與演變——基于扎根理論和文本挖掘分析 [J].中國科技論壇,2018(6):6-13.
[4] 袁桂霞,周先春.基于多媒體信息檢索的有監督詞袋模型 [J].計算機工程與設計,2018,39(9):2873-2878.
[5] 程斌,高圣國.基于細粒度情感的文本挖掘及可視化分析 [J].應用數學進展,2021,10(1):128-136.
作者簡介:王睿(2000.09—),女,漢族,安徽亳州人,本科在讀,研究方向:大數據算法。
收稿日期:2021-03-13