科赛——【文本情感分类模型搭建 | 练习赛】(咸鱼的划水之路~Score:0.813)

本文主要是介绍科赛——【文本情感分类模型搭建 | 练习赛】(咸鱼的划水之路~Score:0.813),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据分析

先来观察下数据,训练集和测试集分别存储在当前目录下的train.csv和test.csv中

train_data = pd.read_csv('train.csv', lineterminator='\n')
test_data = pd.read_csv('test.csv', lineterminator='\n')
train_data.head(10)

输出:

数据处理

乍一看这个评论是什么鬼……咸鱼不懂,就只能直接使用jieba对其进行分词。

当然了,一些明显无意义的词我们还是应该对其进行删除,如数字、标点符号等等(具体哪些我是在后面统计词频时发现的)。

还有,注意到review字段的内容首字母都是大写的,中间也可能出现首字母大写的词语,所以构造词袋时,要将这些单词统一转换成小写,以免重复计算,像我这样的咸鱼,就干脆直接都统一转换成小写存入set进行去重。

#构建词袋
def getBagsOfWord(data):#使用python内置对象set,通过其或、差运算进行添加、删除词汇vocabSet = set()for rec in data['review']:#对每一条review进行jieba分词,并且统一小写化存入,空串返回NonevocabSet |= set(list(map(lambda x:x.strip().lower() if len(x.strip().lower()) > 0 else None, jieba.cut(rec))))#删除空串vocabSet.remove(None)#删除指定的字符集vocabSet -= set(rmSignal)#删除数字vocabSet = filter(lambda x:not x.isdigit(), vocabSet)return vocabSet#要删除的字符集
rmSignal = ['.', '?', '!', ':', '-', '+', '/', '"', ',']    #构建训练集的词袋
vocabList = list(getBagsOfWord(train_data))#list(getBagsOfWord(train_data) | getBagsOfWord(test_data))#输出词袋长度,以及前10个词汇
print(len(vocabList), vocabList[:10])

输出:

这里只统计了训练集的词袋,共有17582个,从词袋的部分内容我们可以看到,表情也被保留做词袋的内容了(咸鱼不懂怎么删除QAQ)。

然后我们再统计下词频,类似“的”,“地”,“得”等这些没有情感影响但经常使用的词,可以很容易的得出,当然,一些符号也会被统计出来。

#根据词袋计算词频
def getCountWords(data, vocabList):cntWords = [0] * len(vocabList)for rec in data['review']:sentence = list(map(lambda x:x.strip().lower() if len(x.strip().lower()) > 0 else None, jieba.cut(rec)))for wd in sentence:if wd in vocabList:cntWords[vocabList.index(wd)] += 1cntWords = [(cntWords[i], vocabList[i]) for i in range(len(vocabList))]return cntWordscntWords = getCountWords(train_data, vocabList)#将词频列表按词频大小排序
cntWords = sorted(cntWords, key=lambda x:x[0])

当然,这里可以使用TF-IDF计算出最重要的词汇(效果可能会好很多,而且更加简单粗暴!)

同时sklearn中,也封装好了一个可以获取关键词的接口CountVectorizer,具体用法这里不再介绍。

from sklearn.feature_extraction.text import CountVectorizer

使用matplotlib进行可视化分析,这里使用的条形统计图。

注意matplotlib可能会中文乱码,需要设置下字体参数。

#绘制出现次数最高的前topK个词语
def plotTopFrequeceWord(cntWords, topK=10):cntWords = sorted(cntWords, key=lambda x:x[0])[-topK:]print(cntWords)plt.bar(list(range(topK)), [x[0] for x in cntWords], align = 'center',color='steelblue', alpha = 0.8)plt.ylabel('词频')plt.xlabel('词语')plt.title('出现最多的前%s个词'%(topK))plt.xticks(list(range(topK)), [x[1] for x in cntWords])# 为每个条形图添加数值标签for x,y in enumerate(cntWords):plt.text(x, y[0], '%s' %(y[0]), ha='center')# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = FalseplotTopFrequeceWord(cntWords, 20)

输出:

既然有了词汇表,那么接下来我们所要处理的评论,就都应该转换成其对应的词向量,便于后面的计算。

#将语句转换成指定词汇表的词向量
def word2Vec(vocabList, ip):recVec = [0] * len(vocabList)ip = jieba.cut(ip)for word in ip:word = word.strip().lower()#不在词汇表的不处理if word not in vocabList:continue#前期进行测试,所有输出了不在词汇表的单词if word in vocabList:recVec[vocabList.index(word)] = 1else:print("{0} is not in vocabList!".format(word))return recVec

然后将从csv文件读取到的数据,通过word2Vec函数,将每条评论转换成对应的词向量,最终转换成矩阵,以便于运算。

#将dataFrame数据变成矩阵
def makeDataMat(data, vocabList):data_mat = []for rec, label in zip(data['review'], data['label']):data_mat.append(word2Vec(vocabList, rec) + [label])return np.mat(data_mat, dtype=np.double)#训练集
train_mat = makeDataMat(train_data, vocabList)#测试集
test_mat = makeDataMat(test_data, vocabList)#观察矩阵参数
print(train_mat.shape, test_mat.shape)#观察矩阵稀疏情况
print("sparsity of train_mat is {0}%\n".format(100. - np.sum(train_mat[:100, :] / train_mat.shape[1])))
print("sparsity of train_mat is {0}%\n".format(100. - np.sum(test_mat[:10, :] / test_mat.shape[1])))

输出:

构建模型

朴素贝叶斯是可以作为一个简单又好用的垃圾分类器,算法思想挺简单的,这里不再介绍原理,大家可以去百度搜搜。

#训练二分类朴素贝叶斯,返回3个参数
#p0Vect表示在类别0中,各个词汇出现的概率向量
#p1Vect表示在类别1中,各个词汇出现的概率向量
#pAbusive表示训练集中,类别1的概率#trainMatrix表示训练集的词汇矩阵
#trainCategory表示各个样本的类别
def trainNB0(trainMatrix, trainCategory):numTrainDocs = len(trainMatrix)numWords = trainMatrix.shape[1]#二分类问题,可直接对类别向量进行求和,即类别1的个数pAbusive = sum(trainCategory) / numTrainDocsp0Num = np.ones(numWords).reshape(1, -1)p1Num = np.ones(numWords).reshape(1, -1)#为避免计算概率时,分母为0,p0Denom = 2.p1Denom = 2.for i in range(numTrainDocs):if trainCategory[i] == 1:p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])#将频率转换成概率p1Vect = p1Num / p1Denomp0Vect = p0Num / p0Denomreturn p0Vect, p1Vect, pAbusivep0Vect, p1Vect, pAbusive = trainNB0(train_mat[:, :-1], train_mat[:, -1])

数据预测

这里因为在把词向量中每个元素相乘时,可能会导致结果很小,所以这里可以对最终的概率表达式进行求对数,这样就可以化乘为加。

但同样的,最后我们需要的是一个概率,所以我计算出数据为类别1的概率以及0的概率后,计算类别1的概率所占的比值,作为最终结果。

#预测数据
#vec2Classify表示待预测的数据
#p0Vec, p1Vec, pClass1分别对应着之前朴素贝叶斯模型的参数def predictNB(vec2Classify, p0Vec, p1Vec, pClass1):p1 = np.sum(vec2Classify * p1Vec) + np.log(pClass1)p0 = np.sum(vec2Classify * p0Vec) + np.log(1-pClass1)#因为概率是小于1的,取对数后,结果小于0,所以为正类的概率要用1减去类别1的占比return p1 / (p1 + p0) if p1 > 0 else 1-p1 / (p1 + p0)

至此,所以技术问题已经解决,提交后score为0.81415231,咸鱼水平有限,大佬们勿喷。

看到一些大佬的高分策略,都是使用了一些框架,咳咳,我还是抓紧时间补补吧QAQ。

数据集和代码可以访问咸鱼的Github

 

 

这篇关于科赛——【文本情感分类模型搭建 | 练习赛】(咸鱼的划水之路~Score:0.813)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/382749

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境