当前位置: 首页 > 后端技术 > Python

《少年的你》短评情感分析——机器学习的逻辑回归

时间:2023-03-26 11:26:23 Python

背景介绍《少年的你》这部国产青春剧影响力挺大的,票房14亿。从票房来看,这部电影是在中国大陆制作的。这部剧比较成功,演员:易烊千玺+周冬雨,当然会造成一些流量效果,但是很多演员对这部电影的剧情和演技评价都不错,包括自己的妹妹,也很喜欢很多;同时,也引发了抄袭东野圭吾的《白夜行》和《嫌疑人X的献身》的热议,引发了众多原著粉丝的不满。下面我们用逻辑回归(LogisticRegression)对《少年的你》的一些短评进行情感分析,看看已经看过电影的人对这部电影的评价。获取数据数据来自豆瓣电影——《少年的你》虽然图中获取了220200条短评论,我只爬到了600条,但是在小数据集样本足够的情况下,爬取过程并不困难,所以我不会过多概述处理数据所需要的库和工具importpandasaspdimportjiebaimportre工具:jupyternotebook数据整理数据读取数据内容如下图:name,shortcomment,evaluation由于爬取的短评论内容分为500个样本和100个样本,所以需要先将两个数据整合成一个数据集,使用pandas的merge方法进入评分栏。数据还是列表格式,可观察性比较差。很容易推断出10-50分为五个级别,也就是我们在网页上为了分析方便,可以写一个函数把rating分成五个级别从1到5defrating(e):if'50'ine:return5elif'40'ine:return4elif'30'ine:return3elif'20'ine:return2else:return1data['new_rating']=data['rating'].map(rating)data.head()运行后数据如下图,那么问题又来了,只有好评和差评,但是如果有五个怎么办收视率?可以先删除三星级,因为这些评级多为中性评级,然后将四星和五星评级设置为正面,用1表示;然后将一星和二星评级定位为负面,用-1表示new_data=data[data['new_rating']!=3]new_data['sentiment']=new_data['new_rating']。apply(lambdax:+1ifx>3else-1)只剩下557个new_data样本,说明有43个,正负评论比例约为3.5:1。可以看出,喜欢这部电影的人还是很多的,但是样本也存在样本不均衡的问题,会影响到后期的建模。如何判断短评好坏?我喜欢你,我讨厌你,你喜欢你讨厌,你能不能根据一句话中的一些词来判断,所以接下来就是用jieba库对每一条短评论进行分词。在分割之前,我们可以先分析文本,会有很多对情感分析没有影响的内容,比如数字和字母,所以分词的时候可以去掉#分词defcut_word(text):text=jieba.cut(str(text),cut_all=False)return''.join(text)new_data['new_short']=new_data['short'].apply(cut_word)#removingnumbersdefremove_num(new_short):returnre.sub(r'\d+','',new_short)#removinglettersdefremove_word(new_short):returnre.sub(r'[a-z]+','',new_short)new_data['new_short']=new_data['new_short'].apply(remove_num)new_data['new_short']=new_data['new_short'].apply(remove_word)分词效果如下文中可以看到一些带有个人情感的词,比如无私奉献、虚伪等。逻辑回归建模所需fromsklearn.model_selectionimporttrain_test_splitfromsklearn.feature_extraction.textimportCountVectorizerfromsklearn.linear_modelimportLogisticRegressionimportnumpyasnpfrompandasimportDataFrame第一步分析建模需要将分析的数据分成训练集和测试集train_data,test_data=train_test_split(new_data,train_size=0.8,random_state=0)#textextractiontransfer=CountVectorizer()train_word=transfer.fit_transform(train_data['new_short'])test_word=transfer.transform(test_data['new_short'])#稀疏矩阵print('new_data:\n',train_word.toarray())#特征值print('feature_name:\n',transfer.get_feature_names())第二步后的词segmentation提取文本的特征值可以生成对应的稀疏矩阵,得到稀疏矩阵对应的特征值。第三步,使用逻辑回归建模,即对训练集中的特征值和目标值进行拟合,生成模型x_train,x_test,y_train,y_test=train_test_split(new_data['new_short'],new_data['sentiment'],train_size=0.8,random_state=0)x_train=train_wordx_test=test_wordmodel=LogisticRegression()model.fit(x_train,y_train)y_predict=model.predict(x_test)print('布尔比较:\n',y_predict==y_test)score=model.score(x_test,y_test)print('modelaccuracy:\n',score)得到预测结果和模型的准确率如下。该模型的准确率为85.7%。造型效果一般。我们可以从测试集中的文本中选取一些例子进行验证,看看情感分析是否正确。example=test_data[50:55]example[['short','new_rating','sentiment']]如果想观察完整的短评,可以写一个迭代器将短评完整输出。但是,我们可以在图中看到这些简短注释的语义。例如,第三个涉及剽窃。因此,如果sentiment为-1??,predict_proba可以通过逻辑回归得到一个正面评价的概率,即概率越接近1,说明这条短评越有可能是正面评价。同样,短评为差评的概率接近于0possibility=model。predict_proba(test_word)[:,1]test_data.loc[:,'possibility']=possibilitytest_data.head()得到下图数据后,可以通过index五个最好和最差的五个短评同样是迭代的,你可以查看完整的短评。可以看到前5个好评写的比较多,比较走心。他们大多在谈论这部电影所反映的社会问题——校园霸凌;而前5差评则指出这部电影是抄袭,引起了很多人的不满。至于一些表扬,是正面的词,可以影响评价中承载的情绪(bullyingprotectscampusbullyingviolence)——这些词是描述电影背景的词。判断好坏的区别(抄袭)——这个词出现了67次,情绪为-1的短评只有122篇。通过分析,我们也可以知道,有抄袭的评价有很大概率是差评。总结一部票房可以是一部14亿的电影,无论是演员阵容还是背景题材,肯定有其独到之处,但绝对抄袭的电影注定不是好电影。做出判断;但可以肯定的是,任何人的知识产权都是不可侵犯的!公众号《奶糖猫》后台回复“你是少年”,可获取源码和数据参考,谢谢支持。