基于情感词典、k-NN、Bayes、最大熵、SVM的情感极性分析及对比,含数据集

news2024/9/22 23:29:44

完整代码下载地址:基于情感词典、k-NN、Bayes、最大熵、SVM的情感极性分析及对比,含数据集

1、预处理

(1)、特征提取

  • 对应文件:feature_extraction.py

最后结果:

在这里插入图片描述

X^2值前几名的词语。能看出这些词都是一些有效的情感词。“了”这样的词出现在其中,说明可以去除一些停用词,来进一步提高分类精度。

在这里插入图片描述

X^2值后几名的词语。能看出这些词的分类作用不是很大。

(2)、结果评价

  • 对应文件:tools.py

结果展示

在这里插入图片描述

2、基于情感词典的情感极性分析

—— sentiment analysis based on sentiment dict

  • 对应文件:classifier.py DictClassifier

使用1:analyse_sentence

analyse_sentence(sentence, runout_filepath=None, print_show=False)

对单个句子进行情感极性分析

  • sentence,待分析的句子

  • 若runout_filepath指定,则将分析结果写入该文件;

  • 若print_show为True,则在控制台输出分析结果。

运行实例:

d = DictClassifier()
a_sentence = "剁椒鸡蛋好咸,土豆丝很好吃"
result = ds.analyse_sentence(a_sentence)
print(result)

使用2:analysis_file

analysis_file(filepath_in, filepath_out, encoding=“utf-8”, print_show=False, start=0, end=-1)

  • filepath_in,待分析的句子文件

  • filepath_out,分析结果输出文件

  • encoding,输入文件字符编码

  • print_show,是否在控制台输出

  • start,输入文件开始分析的句子行数

  • end,输入文件结束分析的句子行数

输出实例:

送餐快,态度好!味道不错。
Score:6.0
Sub-clause0: positive:快 
Sub-clause1: positive:好 punctuation:! 
Sub-clause2: positive:不错 

还可以,比预计时间晚了一小时到,不过还好
Score:-0.56
Sub-clause0: positive:还可以 
Sub-clause1: negative:晚……小时:晚了一小时 小时 
Sub-clause2: conjunction:不过 positive:还好

3、基于k-NN的情感极性分析

—— sentiment analysis based on k-NN

single_k_classify(input_data)

使用单个k值

k = 3

knn = KNNClassifier(train_data, train_labels, k=2, best_words=best_words)
classify_labels = []

print("KNNClassifiers is testing ...")
for data in self.test_data:
    classify_labels.append(knn.classify(data))
print("KNNClassifiers tests over.")

filepath = "f_runout/KNN-train-%d-test-%d-k-%s-%s.xls" % \
           (train_num, test_num, k,
            datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))

results = get_accuracy(test_labels, classify_labels)
Write2File.write_contents(filepath, results)

multiple_k_classify(input_data)

使用多个k值

from spa.classifiers import KNNClassifier

k = [1, 3, 5, 7, 9, 11, 13]

knn = KNNClassifier(train_data, train_labels, k=2, best_words=best_words)
classify_labels = []

print("KNNClassifiers is testing ...")
for data in self.test_data:
    classify_labels.append(knn.classify(data))
print("KNNClassifiers tests over.")

filepath = "f_runout/KNN-train-%d-test-%d-k-%s-%s.xls" % \
           (train_num, test_num, '-'.join([str(i) for i in k]),
            datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))

results = get_accuracy(test_labels, classify_labels)
Write2File.write_contents(filepath, results)

比较结论

在某些特定数据下,multiple_k比每个single_k效果要好。但并不是总是最好。

4、基于Bayes的情感极性分析

—— sentiment analysis based on bayes

from spa.classifiers import BayesClassifier

bayes = BayesClassifier(self.train_data, self.train_labels, self.best_words)

classify_labels = []
print("BayesClassifier is testing ...")
for data in self.test_data:
    classify_labels.append(bayes.classify(data))
print("BayesClassifier tests over.")

filepath = "f_runout/bayes-train-%d-test-%d-k-%s-%s.xls" % \
           (train_num, test_num, '-'.join([str(i) for i in k]),
            datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))

results = get_accuracy(test_labels, classify_labels)
Write2File.write_contents(filepath, results)

5、基于最大熵的情感极性分析

—— sentiment analysis based on maximum entropy

使用1:得到每次迭代的准确率的变化

在这里插入图片描述

def test_maxent_iteration(self):
    print("MaxEntClassifier iteration")
    print("---" * 45)
    print("Train num = %s" % self.train_num)
    print("Test num = %s" % self.test_num)
    print("maxiter = %s" % self.max_iter)

    from spa.classifiers import MaxEntClassifier

    m = MaxEntClassifier(self.max_iter)
    iter_results = m.test(self.train_data, self.train_labels, self.best_words, self.test_data)

    filepath = "f_runout/MaxEnt-iteration-%s-train-%d-test-%d-f-%d-maxiter-%d-%s.xls" % \
               (self.type,
                self.train_num,
                self.test_num,
                self.feature_num,
                self.max_iter,
                datetime.datetime.now().strftime(
                    "%Y-%m-%d-%H-%M-%S"))

    results = []
    for i in range(len(iter_results)):
        try:
            results.append(get_accuracy(self.test_labels, iter_results[i], self.parameters))
        except ZeroDivisionError:
            print("ZeroDivisionError")

    Write2File.write_contents(filepath, results)

使用2:单个句子的情感极性划分

def test_maxent(self):
    print("MaxEntClassifier")
    print("---" * 45)
    print("Train num = %s" % self.train_num)
    print("Test num = %s" % self.test_num)
    print("maxiter = %s" % self.max_iter)

    from spa.classifiers import MaxEntClassifier

    m = MaxEntClassifier(self.max_iter)
    m.train(self.train_data, self.train_labels, self.best_words)

    print("MaxEntClassifier is testing ...")
    classify_results = []
    for data in self.test_data:
        classify_results.append(m.classify(data))
    print("MaxEntClassifier tests over.")

    filepath = "f_runout/MaxEnt-%s-train-%d-test-%d-f-%d-maxiter-%d-%s.xls" % \
               (self.type,
                self.train_num, self.test_num,
                self.feature_num, self.max_iter,
                datetime.datetime.now().strftime(
                    "%Y-%m-%d-%H-%M-%S"))

    self.write(filepath, classify_results, 1)

6、基于SVM的情感极性分析

—— sentiment analysis based on SVM

依赖于scikit-learn库。准确率较高!

def test_svm(self):
    print("SVMClassifier")
    print("---" * 45)
    print("Train num = %s" % self.train_num)
    print("Test num = %s" % self.test_num)
    print("C = %s" % self.C)

    from spa.classifiers import SVMClassifier
    svm = SVMClassifier(self.train_data, self.train_labels, self.best_words, self.C)

    classify_labels = []
    print("SVMClassifier is testing ...")
    for data in self.test_data:
        classify_labels.append(svm.classify(data))
    print("SVMClassifier tests over.")

    filepath = "f_runout/SVM-%s-train-%d-test-%d-f-%d-C-%d-%s-lin.xls" % \
               (self.type,
                self.train_num, self.test_num,
                self.feature_num, self.C,
                datetime.datetime.now().strftime(
                    "%Y-%m-%d-%H-%M-%S"))

    self.write(filepath, classify_labels, 2)

7、几种情感分析方法比较

基于词典

  • 准确率:准确率较高(80%以上),随着人工工作量的增加,准确率增加

  • 优点:易于理解

  • 缺点:人工工作量大

基于k_NN

  • 准确率:很低(60% - 70%)

  • 优点:思想简单、算法简单

  • 缺点:准确率低;耗内存;耗时间

基于Bayes

  • 准确率:还可以(70% - 80%)

  • 优点:简单,高效,运算速度快,扩展性好

  • 缺点:准确率不高,达不到实用

基于最大熵

  • 准确率:比较高(83%以上)

  • 优点:准确率高

  • 缺点:训练时间久

基于SVM

  • 准确率:最高(85%以上)

  • 优点:准确率高

  • 缺点:训练耗时

完整代码下载地址:基于情感词典、k-NN、Bayes、最大熵、SVM的情感极性分析及对比,含数据集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喜报丨武汉无名创新科技有限公司荣获国家“高新技术企业”证书,将助力高校科研与竞赛无人机产业加速发展!

2022年11月03日,高新技术企业认定管理官网公告了湖北省2022年第一批通过认定的高新技术企业名单,武汉无名创新科技有限公司(简称“无名创新”)榜上有名,证书编号为GR202242000480。“国家高新技术企业”认定是对无名创…

Java 并发编程知识总结【二】

3. 阻塞队列与线程池 3.1 阻塞队列 阻塞:必须要阻塞/不得不阻塞 阻塞队列是一个队列,在数据结构中是先进先出 线程1往阻塞队列里添加元素,线程2从阻塞队列里移除元素。 当队列是空的,从队列中获取元素的操作将会被阻塞 当队列…

OASIS协议标准文档的解读_第二部分

8 CELL REFERENCING 8.1 跟GDSII文件一样, 在OASIS文件中, cells也是用名字来标识的。一个CELL record不仅要包括一个cell的定义,还要包括它的名字。 PLACEMENT record根据cell的名字来指定cell的放置位置。跟GDSII一样,在OASIS中没有匿名的c…

APP应用渗透测试思路

今天继续给大家介绍渗透测试相关知识,本文主要内容是APP应用渗透测试思路。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权…

vue后台系统管理项目-echarts柱状图实现订单统计

echarts柱状图实现订单统计 主要功能 不同订单状态切换显示不同的柱状图数据;根据条件切换选择年度视图、月度视图;根据条件切换指定年份、指定月份显示当前的数据;根据搜索条件查询查看柱状图数据;柱状图数据导出功能&#xff0c…

C#,核心基础算法——完整全面、简单易用、稳定可靠的统计学常用算法之原理介绍、算法精粹与完整的源代码

1、统计学常用算法 统计分析科学 在“政治算术”阶段出现的统计与数学的结合趋势逐渐发展形成了“统计分析科学”。 十九世纪末,欧洲大学开设的“国情纪要”或“政治算数”等课程名称逐渐消失,代之而起的是“统计分析科学”课程。当时的“统计分析科学”…

MongoDB:安装配置

MongoDB有两个服务器版本 :MongoDB 社区版 和 MongoDB 企业版。此篇主要介绍 MacOS 下 MongoDB 社区版的安装,在 “版本” 下拉列表中,选择要下载的 MongoDB 版本;在平台下拉列表中,选择 MacOS。在包下拉列表中&#x…

mysql一主双从环境搭建--docker-compose

mysql一主双从环境搭建–docker-compose 一、工作目录结构 ├── cluster01 │ ├── msql-master01 │ │ └── volumes │ │ ├── conf │ │ │ └── my.cnf │ │ ├── data │ │ ├── initdb │ │ │ …

基础数学(六)——非线性方程求根的数值解法

文章目录期末考核方式求解的一般步骤二分法求根二分法计算样例二分法的优缺点不动点迭代法全局收敛准则收敛性证明样例局部收敛性收敛阶数的定义迭代法具体例题(考试必考)牛顿迭代法例题(使用牛顿法近似目标解)(考过&a…

Gem5模拟器,FS模式运行自定义程序(九)

FS模拟和SE模拟最大的区别是:FS模拟会启动Linux操作系统,会模拟系统的所有组件。因此需要给系统配置相应的Linux内核以及磁盘镜像,镜像文件作为Linux系统的文件系统。在FS模拟下,使用gem5自带的python脚本configs/example/fs.py。…

从umati 看德国人如何玩OPCUA的

到目前为止,机器的联网标准缺乏统一的协议和语义标准。比较知名的要数每个的MTConnect。fanuc机床的focas协议。未来的发展方向是OPCUA协议。但是实现这个目标并非一日之功。德国的umati 社区也许给我们一些启发。 为了推进机床行业的数字化进程,VDW&…

从2022看2023年发展趋势

前言 时光荏苒,回望即将过去的2022年,前端领域在这一年中整体还是保持平稳向前,但对整个IT产业链路及互联网行业来说,变化还是很大的,下面我将简单分享一下个人对整个行业领域的一些观点与思考。鄙人才疏学浅&#xf…

Linux | 从头开始理解Linux以及工作日常常用命令

Linux的版本 分很多种,家庭用途版本有:Linux Mint、Ubuntu、OpenSUSE、Fedora、PC-BSD;商业用途版本有:Debian、RHEL、CentOS;还有其他版本:FreeBSD、OpenBSD、Solaris、OpenSolaris等。 目录 1.操作系统…

QT学习 控件(三)输入文本类与快捷键:QPlainText;QKeySequenceEdit

文章目录QPlainTextQKeySequenceEdit前情回顾: QLineEit QTextEdit文本输入类 QPlainTextEdit是一个简略版本的类,它的性能优于QTextEdit, 主要是因为在文本文档中使用QPlainTextDocumentLayout简化文本布局 QPlainText QPlainText和QTextEdit大致功能…

Dijkstra求最短路(堆优化)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。 请你求出 1 号点到 n 号点的最短距离,如果无法从1 号点走到 n 号点,则输出 −1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整…

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《205.同构字符串、217. 存在重复元素、283. 移动零》。 目…

(十四)大白话磁盘文件中, 40个bit位的数据头以及真实数据是如何存储的?

文章目录 1、前情回顾2、详解40个bit位数据头1、前情回顾 之前我们已经给大家讲到了在磁盘上存储数据的时候, 每一行数据都会有变长字段长度列表,逆序存放这行数据里的变长字段的长度,然后会有NULL值列表,对于允许为NULL的字段都会有一个bit位标识那个字段是否为NULL,也是…

shell第五天作业——函数与数组

题目 一、编写函数,实现打印绿色OK和红色FAILED 二、编写函数,实现判断是否有位置参数,如无参数,提示错误 三、编写函数实现两个数字做为参数,返回最大值 四、编写函数,实现两个整数为参数,…

状态压缩DP——最短Hamilton路径

状态压缩DP——最短Hamilton路径一、题目描述二、思路分析1、状态转移方程(1)状态表示——状态压缩(2)状态转移2、循环和初始化(1)循环设计(2)初始化三、代码实现一、题目描述 二、思…

(day1)自学java基础

非原创,记录学习过程,为方便自己后期复习 目录 1.Java基础概念 2.运算符 3.判断 4.循环 5.循环高级 6.数组 7.数组的内存图 8.方法 ctrlaltL 自动格式化代码 为什么要配置环境变量? 我们想在任意目录都可以打开指定软件,就…