【阿旭机器学习实战】【33】中文文本分类之情感分析--朴素贝叶斯、KNN、逻辑回归

news2025/7/5 12:50:14

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。

目录

  • 1.查看原始数据结构
  • 2.导入数据并进行数据处理
    • 2.1 提取数据与标签
    • 2.2 过滤停用词
    • 2.3 TfidfVectorizer将文本向量化
  • 3.利用不同模型进行训练与评估
    • 3.1 朴素贝叶斯模型
    • 3.2 k近邻模型
    • 3.3 逻辑回归模型

1.查看原始数据结构

关注GZH:阿旭算法与机器学习,回复:“ML33”即可获取本文数据集、源码与项目文档

数据集共有4个文件:
stopwords.txt为停用词文件;
train.negative.txt为训练用负面数据文件;
train.positive.txt为训练用正面数据文件;
test.combined.txxt为测试用数据文件。
在这里插入图片描述
文件内容如下:
在这里插入图片描述
在这里插入图片描述

2.导入数据并进行数据处理

from matplotlib import pyplot as plt
import jieba # 分词
import re # 正则
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np

2.1 提取数据与标签

def read_data(path, is_pos=None):
    """
    给定文件的路径,读取文件
    path: path to the data
    is_pos: 是否数据是postive samples. 
    return: (list of review texts, list of labels) 
    """
    reviews, labels  = [], []
    with open(path, 'r',encoding='utf-8') as file:
        review_start  = False
        review_text = []
        for line in file:
            line = line.strip()
            if not line: continue
            if not review_start and line.startswith("<review"):
                review_start = True
                if "label" in line:
                    labels.append(int(line.split('"')[-2]))
                continue                
            if review_start and line == "</review>":
                review_start = False
                reviews.append(" ".join(review_text))
                review_text = []
                continue
            if review_start:
                review_text.append(line)
    if is_pos:
        labels = [1]*len(reviews)
    elif not is_pos is None:
        labels = [0]*len(reviews)
    return reviews, labels


def process_file():
    """
    读取训练数据和测试数据,并对它们做一些预处理
    """    
    train_pos_file = "data_sentiment/train.positive.txt"
    train_neg_file = "data_sentiment/train.negative.txt"
    test_comb_file = "data_sentiment/test.combined.txt"
    
    # 读取文件部分,把具体的内容写入到变量里面
    train_pos_cmts, train_pos_lbs = read_data(train_pos_file, True)
    train_neg_cmts, train_neg_lbs = read_data(train_neg_file, False)
    train_comments = train_pos_cmts + train_neg_cmts
    train_labels = train_pos_lbs + train_neg_lbs
    test_comments, test_labels = read_data(test_comb_file)
    return train_comments, train_labels, test_comments, test_labels
train_comments, train_labels, test_comments, test_labels = process_file()
train_comments[:5]
['发短信特别不方便!背后的屏幕很大用起来不舒服,是手触屏的!切换屏幕很麻烦!',
 '手感超好,而且黑色相比白色在转得时候不容易眼花,找童年的记忆啦。',
 '!!!!!',
 '先付款的   有信用',
 '价格 质量 售后 都很满意']
# 训练数据和测试数据大小
print (len(train_comments), len(test_comments))

print (train_comments[1], train_labels[1])
8064 2500
手感超好,而且黑色相比白色在转得时候不容易眼花,找童年的记忆啦。 1

2.2 过滤停用词

def load_stopwords(path):
    """
    从外部文件中导入停用词
    """
    stopwords = set()
    with open(path, 'r',encoding='utf-8') as in_file:
        for line in in_file:
            stopwords.add(line.strip())
    return stopwords


def clean_non_chinese_symbols(text):
    """
    处理非中文字符
    """
    text = re.sub('[!!]+', "!", text)
    text = re.sub('[??]+', "?", text)
    text = re.sub("[a-zA-Z#$%&\'()*+,-./:;:<=>@,。★、…【】《》“”‘’[\\]^_`{|}~]+", " UNK ", text)
    return re.sub("\s+", " ", text)  

def clean_numbers(text):
    """
    处理数字符号  128  190  NUM 
    """
    return re.sub("\d+", ' NUM ', text)

def preprocess_text(text, stopwords):
    """
    文本的预处理过程
    """
    text = clean_non_chinese_symbols(text)
    text = clean_numbers(text)
    text = " ".join([term for term in jieba.cut(text) if term and not term in stopwords])
    return text
path_stopwords = "./data_sentiment/stopwords.txt"
stopwords = load_stopwords(path_stopwords)
# 对于train_comments, test_comments进行字符串的处理,几个考虑的点:
#   1. 停用词过滤
#   2. 去掉特殊符号
#   3. 去掉数字(比如价格..)
#   4. ...
#   需要注意的点是,由于评论数据本身很短,如果去掉的太多,很可能字符串长度变成0
#   预处理部部分,可以自行选择合适的方案,只要注释就可以。

train_comments_new = [preprocess_text(comment, stopwords) for comment in train_comments]
test_comments_new = [preprocess_text(comment, stopwords) for comment in test_comments]

print (train_comments_new[0], test_comments_new[0])

发短信 特别 不 方便 ! 背后 屏幕 很大 起来 不 舒服   UNK   手触 屏 ! 切换 屏幕 很 麻烦 ! 终于 找到 同道中人 初中   UNK   已经 喜欢 上   UNK   同学 都 鄙夷 眼光 看   UNK   人为   UNK   样子 古怪 说 " 丑 " 当场 气晕 现在 同道中人   UNK   好开心 !   UNK   !   UNK  

2.3 TfidfVectorizer将文本向量化

#   利用tf-idf从文本中提取特征,写到数组里面. 
#   参考:https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html
tfidf = TfidfVectorizer()
X_train =  tfidf.fit_transform(train_comments_new) # 训练数据的特征
y_train =  train_labels # 训练数据的label
X_test = tfidf.transform(test_comments_new) # 测试数据的特征
y_test = test_labels# 测试数据的label

print (np.shape(X_train), np.shape(X_test), np.shape(y_train), np.shape(y_test))
(8064, 23101) (2500, 23101) (8064,) (2500,)

3.利用不同模型进行训练与评估

3.1 朴素贝叶斯模型

from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score

clf = MultinomialNB()
# 利用朴素贝叶斯做训练
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("accuracy on test data: ", accuracy_score(y_test, y_pred))
accuracy on test data:  0.6368

3.2 k近邻模型

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=1)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("accuracy on test data: ", accuracy_score(y_test, y_pred))
accuracy on test data:  0.524

3.3 逻辑回归模型

from sklearn.linear_model import LogisticRegression

clf = LogisticRegression(solver='liblinear')
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("accuracy on test data: ", accuracy_score(y_test, y_pred))
accuracy on test data:  0.7136

如果文章对你有帮助,感谢点赞+关注!

关注下方GZH:阿旭算法与机器学习,回复:“ML33”即可获取本文数据集、源码与项目文档,欢迎共同学习交流

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

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

相关文章

如何使用HTTPS加密保护网站?

加密 Web 内容并不是什么新鲜事&#xff1a;自发布通过SSL/TLS协议来加密 Web 内容的规范以来&#xff0c;已经过去了近 20 年。然而&#xff0c;近年来&#xff0c;运行安全的HTTPS加密 Web 服务器已经从一种选择变成了一种安全防护的必需品。攻击者继续寻找并找到窃取用户和W…

计算机网络概述 第二部分

5.网络分层 ①OSI 7层模型 数据链路层 (Data Link Layer) 实现相邻&#xff08;Neighboring&#xff09;网络实体间的数据传输 成帧&#xff08;Framing&#xff09;&#xff1a;从物理层的比特流中提取出完整的帧 错误检测与纠正&#xff1a;为提供可靠数据通信提供可能 …

算法笔记(十三)—— 树形DP及Morris遍历

树形DP&#xff1a; Question1: 以X为头结点的树&#xff0c;最大距离&#xff1a; 1. X不参与&#xff0c;在左子树上的最大距离 2. X不参与&#xff0c;在右子树上的最大距离 3. X参与&#xff0c;左树上最远的结点通过X到右树最远的结点 最后的结果一定是三种情况的最大…

【微信小程序】-- 常用视图容器类组件介绍(六)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

Spring Boot与Vue:实现图片的上传

文章目录1. 项目场景2. 问题描述3. 实现方案3.1 方案一&#xff1a;上传图片&#xff0c;转换成 Base64 编码并返回3.1.1 前端页面组件3.1.2 前端 JS 函数3.1.3 后端 Controller3.2 方案二&#xff1a;上传图片&#xff0c;并返回图片路径3.2.1 前端页面组件3.2.1 前端 JS 函数…

shell的函数

一、shell函数 有些脚本段间互相重复&#xff0c;如果能只写一次代码块而在任何地方都能引用那就提高了代码的可重用性。 shell 允许将一组命令集或语句形成一个可用块&#xff0c;这些块称为 shell 函数。 二、shell函数的格式 2.1.第一种格式 函数名&#xff08…

selenium自动化测试用例需要关注的几点

自动化测试设计简介注&#xff1a;参看文章地址 我们在本章提供的信息&#xff0c;对自动化测试领域的新人和经验丰富的老手都是有用的。本篇中描述最常见的自动化测试类型&#xff0c; 还描述了可以增强您的自动化测试套件可维护性和扩展性的“设计模式”。还没有使用这些技术…

Clion安装Platformio支持

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、系统配置二、什么是platformio三、安装配置1.安装Clion2.安装platformio插件3.安装platformio&#xff08;CLI&#xff09;4. 配置Clion环境5. 创建示例Demo…

低功耗设计:rush current

在power gating的设计中有一个rush current的概念&#xff0c;它的产生原因是switch cell上电过程相当于电容充电过程&#xff0c;会产生一个短期的大电流&#xff0c;称之为rush current。 1.rush current的危害 1&#xff09;rush current产生的压降可能会造成大的短路电流…

Python学习笔记——NumPy

一、向量数据 ①概念 向量数据是指存储一系列同类数据的有序数据结构。 ②分类 python中的列表和元组可以用来存储向量数据。 分为 一维列表&#xff0c;二维列表&#xff0c;三(多)维列表。 ③向量数据结构的理解 二、产生原因 大量的向量数据计算时&#xff0c;使用pyt…

蓝桥杯的比赛流程和必考点

蓝桥杯的比赛流程和必考点 距省赛仅1个多月&#xff01;蓝桥杯的比赛流程和必考点&#xff0c;你还不清楚&#xff1f; “巷子里的猫很自由&#xff0c;却没有归宿&#xff1b;围墙里的狗有归宿&#xff0c;终身都得低头。人生这道选择题&#xff0c;怎么选都会有遗憾。” 但不…

弹性负载均衡器类型

Hello大家好&#xff0c;在本课时&#xff0c;我们将讨论AWS不同类型的弹性负载均衡器,也就是ELB。 对于认证考试您需要了解针对不同的场景使用哪种类型的负载均衡器。 负载均衡器类型 应用程序负载均衡器 第一个是应用程序负载均衡器&#xff0c;也就是ALB&#xff0c;ALB在…

ArcGIS手动分割矢量面要素从而划分为多个面部分的方式:Cut Polygons Tool

本文介绍在ArcGIS下属ArcMap软件中&#xff0c;通过“Cut Polygons Tool”工具&#xff0c;对一个面要素矢量图层加以手动分割&#xff0c;从而将其划分为指定形状的多个部分的方法。 对于一个面要素矢量文件&#xff0c;有时我们需要对其加以划分&#xff0c;通过手动勾勒新的…

Python杂题-- 内附蓝桥题:裁纸刀

杂题 ~~不定时更新&#x1f383;&#xff0c;上次更新&#xff1a;2023/02/23 蓝桥例题1-裁纸刀&#x1f52a; 问题描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一个裁纸刀&#xff0c;每次可以将一张纸沿…

高阶数据结构之LRU Cache

文章目录什么是LRU Cache&#xff1f;LRU Cache的实现JDK中自带的数据结构模拟实现LRU Cache&#xff08;双向链表哈希表&#xff09;什么是LRU Cache&#xff1f; LRU的全称是“Least Recently Used”的缩写&#xff0c;表示最近最少的使用&#xff0c;是一种Cache替换算法&am…

机器学习和深度学习综述

机器学习和深度学习综述 1. 人工智能、机器学习、深度学习的关系 近些年人工智能、机器学习和深度学习的概念十分火热&#xff0c;但很多从业者却很难说清它们之间的关系&#xff0c;外行人更是雾里看花。在研究深度学习之前&#xff0c;先从三个概念的正本清源开始。概括来说…

2022-2-23作业

一、通过操作Cortex-A7核&#xff0c;串口输入相应的命令&#xff0c;控制LED灯进行工作 1.例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led2灯熄灭 5.例如在串口输…

关于性能测试,你不可不知的内容

目录 1、性能测试概述 2、常见的性能测试指标 2.1、并发 2.2、响应时间 2.3、事务 2.3.1、事务响应时间 2.3.2、每秒事务通过数&#xff08;TPS&#xff09; 2.4、点击率 2.5、吞吐量 2.6、资源利用率 3、性能测试分类 3.1、一般性能测试 3.2、负载测试 3.3、压力…

虹科Dimetix激光测距仪在锯切系统中的应用

HK-Dimetix激光测距仪——锯切系统应用 许多生产设施&#xff0c;例如金属服务中心&#xff0c;使用切割锯将每个客户的订单切割成一定长度。定长切割过程通常涉及卷尺和慢跑锯的传送带。但更简单的替代方法是使用虹科Dimetix非接触式激光距离传感器。 为了切断大长度的棒材&…

Day898.Join语句执行流程 -MySQL实战

Join语句执行流程 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Join语句执行流程的内容。 在实际生产中&#xff0c;关于 join 语句使用的问题&#xff0c;一般会集中在以下两类&#xff1a; 不让使用 join&#xff0c;使用 join 有什么问题呢&#xff1f;如果有…