基于多项贝叶斯的三分类的情感分析实现

写在前面

本实验报告是一篇很水的水课的期末大作业,代码、数据集均为原创,意在用最少的代码和最简单的数据集完成老师留下的题目,仅供交流学习使用,禁止直接洗稿嗷!!!

目录

写在前面

一、实验目的

二、实验手段和方法

三、实验内容

四、实验总结


 

一、实验目的

情感分析是自然语言处理领域中的一项重要任务,其目的是通过分析文本中的语义与情感信息,判断出其中表达的情绪情感倾向。三分类的情感分析在实际应用中具有广泛的应用价值。

三分类的情感分析可以用于企业对自己的产品、服务等品牌形象进行监测和评估。通过对消费者的评论和反馈进行情感分析,企业可以了解到消费者对于自己的品牌形象的整体评价以及不同方面的优劣势,从而为企业的营销策略提供宝贵的参考。三分类的情感分析可以用于舆情监测与管理。政府部门、媒体等单位可以通过对社会大众的言论、评论等进行情感分析,了解群众的情感倾向和态度,为公共政策的制定和应对突发事件等提供有效的参考。三分类的情感分析也可以用于客户服务管理。通过对消费者的投诉、反馈等请求进行情感分析,企业可以快速了解到消费者的需求和问题,并采取相应的措施进行问题解决,提升客户满意度。

三分类的情感分析在商业、政治、社会等领域都具有重要的应用价值。本项目的实验目的就是通过构建并优化情感分析模型,实现快速准确地对文本情感进行分类,为各行业提供更加精细化、智能化的处理和解决方案,从而带来更高效、更便捷的服务与体验。

二、实验手段和方法

本次实验实现的是在网购场景下对用户评价进行情感分析的模拟

在训练阶段我们主要使用了Python中的一些常用的机器学习库和技术,包括pandas、sklearn、joblib等。其中,pandas是一种处理数据的工具,可以读取CSV等格式的数据文件,并进行数据预处理和清洗;sklearn则提供了丰富的机器学习模型和算法,如朴素贝叶斯、支持向量机、随机森林等,以及数据预处理和模型评估等功能;joblib则是一个可用于在内存中缓存Python函数调用结果的工具。

数据集sentiment_data.csv方面为了防止和其他同学撞车,我直接在网络上找了240多条包括积极、消极、中性情感的英文商品评价,用"0" 表示正面情感,"1" 表示负面情感,"2" 表示中性情感

保存好训练出的模型后就可以进行使用,对需要判断情绪的语料进行分析判断了。

三、实验内容

1.训练模型

import pandas as pd

from sklearn.pipeline import Pipeline

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score

from sklearn.naive_bayes import MultinomialNB

from joblib import dump, load



# 读入数据

data = pd.read_csv('sentiment_data.csv')



# 划分数据集

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(data['text'], data['label'], test_size=0.2, random_state=42)



# 定义管道

pipeline = Pipeline([

    ('tfidf', TfidfVectorizer(stop_words='english')),

    ('clf', MultinomialNB())

])



# 定义参数空间

params = {

    'tfidf__max_df': [0.8, 0.9],

    'tfidf__ngram_range': [(1, 1), (1, 2)],

    'clf__alpha': [0.1, 0.5, 1.0],

}



# 使用GridSearchCV进行参数选择

grid_search = GridSearchCV(pipeline, params, cv=5, n_jobs=-1, verbose=1)

grid_search.fit(X_train, y_train)



# 测试模型

y_pred = grid_search.predict(X_test)



# 计算准确率

accuracy = accuracy_score(y_test, y_pred)

print('Accuracy:', accuracy)

# 输出最佳参数

print('Best params:', grid_search.best_params_)

# 将训练好的模型保存为model.pkl文件

dump(grid_search.best_estimator_, 'model.pkl', compress=1)

这段代码使用了pandas、sklearn和joblib等Python库,首先读取了一个CSV格式的情感数据集,然后将其分为训练集和测试集。接着,使用sklearn中的Pipeline创建了一个文本分类管道,其中包括TfidfVectorizer(基于TF-IDF的文本向量化工具)和MultinomialNB(多项式朴素贝叶斯分类器)等模块。通过定义参数空间,并使用GridSearchCV(网格搜索交叉验证)寻找最优的模型参数组合,进一步优化了模型性能。最后,使用joblib库中的dump方法将训练好的模型保存至磁盘中,以备后续使用。

运行结果如下:

 

这输出中的"Fitting 5 folds for each of 12 candidates, totalling 60 fits"表示使用了网格搜索和交叉验证的方式,对12组超参数进行了训练和评估,并将数据集划分成了5份,每次使用其中4份训练模型,1份评估模型的性能,重复5次。这样就得到了60个模型,以便寻找在给定参数空间中性能最佳的模型。

"Accuracy: 0.88"表示通过测试集对训练好的模型进行验证并计算了准确率。具体来说,这里的准确率为88%,即用训练好的模型对测试集进行预测时,有88%的样本被正确分类。因此,可以认为这个模型的性能比较好。

"Best params: {'clf__alpha': 0.5, 'tfidf__max_df': 0.8, 'tfidf__ngram_range': (1, 1)}"则表示找到了在给定参数空间内性能最佳的模型所使用的超参数组合。具体来说,这里的最佳超参数为:'clf__alpha'为0.5(多项式朴素贝叶斯分类器的平滑指数),'tfidf__max_df'为0.8(TF-IDF向量化时忽略文档频率大于0.8的特征),'tfidf__ngram_range'为(1, 1)(向量化时只考虑单个词语的出现频率)。这些超参数可以在构建模型时使用,以获得更好的分类性能。

运行结束后,会将效果最好的模型保存下来,文件名为model.pkl.

2.数据集

为防止和其他同学撞车,本次实验的数据集并不是来源于各大下载网站的主流数据集,而是我找的240多条真实网购评价,并且这些评价均用"0" 表示正面情感,"1" 表示负面情感,"2" 表示中性情感。这样的数据集可以满足本次学习目的的实验需要,也让我理解了数据集内部的奥秘,相同的方法我们可以自己构建实现其他场景下分析的数据集了。

 

3.模型的实际应用

在搞好数据集,写好训练代码,完成了训练后,我们终于得到了新鲜出炉的数据集,接下来就是对数据集的实际应用环节了

首先,首先调用joblib库中的load()函数加载已经训练好的模型,然后定义了一个文本预处理的函数,用于去除标点符号、特殊字符,转换成小写等操作。接着定义了一个情感分类的函数,该函数首先使用文本预处理函数对输入的文本进行预处理,然后使用训练好的模型对文本进行情感分类,最终返回相应的情感类别。在测试代码中,调用情感分类函数对输入的一段文本进行情感分类,并输出相应的结果。

import joblib

import re



# 加载训练好的模型

model = joblib.load('model.pkl')



# 定义文本预处理函数

def preprocess_text(text):

    # 将所有字母转为小写

    text = text.lower()

    # 去除标点符号和特殊字符

    text = re.sub(r'[^\w\s]', '', text)

    # 去除多余空格

    text = re.sub(r'\s+', ' ', text).strip()

    return text



# 定义情感分类函数

def classify_sentiment(model, text):

    # 对输入文本进行预处理

    text = preprocess_text(text)

    # 使用训练好的模型对处理后的文本进行分类

    label = model.predict([text])[0]

    # 根据分类结果返回情感类别

    if label == 0:

        return "Positive"

    elif label == 1:

        return "Negative"

    else:

        return "Neutral"



# 测试代码

if __name__ == "__main__":

    # 需要测试的文本

    text = "I hated it."

    # 对文本进行情感分类

    label = classify_sentiment(model, text)

    # 输出分类结果

    if label == "Positive":

        print(f"待检测的文本'{text}' 是一个积极的评论!")

    elif label == "Negative":

        print(f"待检测的文本'{text}' 是一个消极的评论!")

    else:

        print(f"待检测的文本'{text}' 是一个中性的评论!")

如图所示,我们顺利地实现了对文本的情感分类,能够将输入的文本自动分类为积极、消极或中性等三种情感类别。这样的分类器在实际应用中有着广泛的辅助价值,能够帮助用户迅速了解大量文本数据所表达的情感倾向,从而更好地判断和决策。

在训练模型的过程中,需要进行大量的数据预处理、特征选取、模型调优等操作,这些都需要精心设计和耐心实验。同时,还需要充分考虑到文本数据的特殊性质,如文本长度、语言风格、语义多样性等,以及数据集的规模、质量、分布等因素,才能够获得高效且准确的分类器。对于一些复杂结构、深层次表达的文本,可能需要进一步的优化和改进。因此,我们需要不断地优化这个训练模型,提高它的准确率让它更好地服务于各种应用场景。

四、实验总结

通过本次实验,我学习并掌握了文本分类中的多项式朴素贝叶斯算法,并使用sklearn库中的pipeline、TfidfVectorizer和GridSearchCV等功能来构建和优化文本情感分类模型。在实验中,我首先采用pandas库读入数据,然后使用train_test_split函数将数据集划分为训练集和测试集,接着定义了一个包括tf-idf特征提取和多项式朴素贝叶斯分类器的管道,并使用GridSearchCV函数来搜索最优参数组合。

在实现过程中,我遇到了一些困难,其中最大的困难是对于文本预处理的不熟悉,例如如何去除标点符号和特殊字符、如何去除多余空格,以及如何使用pipeline和GridSearchCV函数进行模型构建和调优等问题。但通过查阅相关资料和参考别人的经验,我成功地克服了这些困难,不断地优化了算法,提高了模型的准确性和稳定性。

最终,我将训练好的模型保存为model.pkl文件,并使用joblib库进行加载和预测。利用预处理函数 preprocess_text 和 classify_sentiment 函数,我可以输入待检测的文本,快速地对其进行情感分类,并输出相应的结果。整个实验过程让我深刻认识到了文本分类算法的重要性和应用场景,同时也掌握了一些常用的数据处理和机器学习工具,对我的学习和研究都具有非常大的帮助。

通过本次实验,我深刻认识到了文本分类算法在自然语言处理领域中的重要性和广泛应用场景。在实现过程中,管道和GridSearchCV函数都让我受益匪浅。管道能够将多个数据处理和模型构建步骤串联起来,方便了代码的编写和维护;而GridSearchCV函数则能够自动搜索最优参数组合,减少了参数调整的负担,提高了模型的效率。我也通过调整参数组合,不断优化模型,使得模型的准确率不断提高,从而感受到了解决实际问题的成就感和满足感。

最后,我非常感谢老师的耐心指导和教授的知识,没有老师的培养和教育,我不可能这么顺利地完成本次实验。在以后的学习和工作中,我会更加努力地学习和实践,不断提高自己的技能和能力,为实现个人价值和社会贡献做出更多的努力。谢谢!

(想起来也没法洗稿哈哈哈因为数据集我没放进来哈哈哈哈哈)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Draina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值