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