【自然语言处理】情感分析(二):基于 scikit-learn 的 Naive Bayes 实现

news2024/10/6 22:31:41

情感分析(二):基于 scikit-learn 的 Naive Bayes 实现

在上一篇博客 情感分析(一):基于 NLTK 的 Naive Bayes 实现 中,我们介绍了基于 NLTK 实现朴素贝叶斯分类的方法,本文将基于 scikit-learn 再次介绍朴素贝叶斯分类的实现方法。

本文代码已上传至 我的GitHub,需要可自行下载。

1.导入包

import pandas as pd
import sys
sys.path.append("..") # Adds higher directory to python modules path.
from NLPmoviereviews.data import load_data_sent
from NLPmoviereviews.utilities import preprocessing
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB, ComplementNB
from sklearn.model_selection import cross_validate
from sklearn.metrics import ConfusionMatrixDisplay, classification_report

2.导入数据

我们仍然使用的是 tensorflow-datasets 提供的 imdb_reviews 数据集。

# load data
X_train, y_train, X_test, y_test = load_data_sent(percentage_of_sentences=10)
# create dataframe from data
d = {'text': X_train, 'sentiment': y_train}
df = pd.DataFrame(d)

df.head()

在这里插入图片描述
原数据集提供了 25000 25000 25000 条训练数据,取 10 % 10\% 10% 2500 2500 2500 条。

# check shape
df.shape

在这里插入图片描述

# check class balance (it's pretty balanced)
df.sentiment.value_counts()

在这里插入图片描述

df.text[0]

在这里插入图片描述

3.数据预处理

删除自定义停用词可提高分数(可忽略不计,约提高 0.002 % 0.002\% 0.002%)。

# remove custom stop-words (improves accuracy)
def rm_custom_stops(sentence):
    '''
    Custom stop word remover
    Parameters:
        sentence (str): a string of words
    Returns:
        list_of_words (list): cleaned sentence as a list of words
    '''
    words = sentence.split()
    stop_words = {'br', 'movie', 'film'}
    cleaned_words = [w for w in words if not w in stop_words]
    return ' '.join(cleaned_words)
# clean text data
df['text'] = df.text.apply(preprocessing)
df['text'] = df.text.apply(rm_custom_stops)
df.head()

在这里插入图片描述
:调整 n-gram 似乎用处不大。N-grams 是要考虑目标单词周围的单词数量:增加 n-grams 可以帮助机器在其上下文中理解单词,从而更好地分析单词的含义。

示例:

  • vectorizer = CountVectorizer(ngram_range = (2,2)) # 得到较低的准确率 78 % 78\% 78%
  • vectorizer = CountVectorizer(ngram_range = (5,5)) # 得到更低的准确率 50 % 50\% 50%

将文本通过 词袋模型 转化为向量。

# vectorize text (convert collection of texts to a matrix of token counts)
vectorizer = CountVectorizer()
X_train_count = vectorizer.fit_transform(df.text)

处理测试数据。

# process test data
d_test = {'text': X_test}
df_test = pd.DataFrame(d_test)      # create dataframe
df_test['text'] = df_test.text.apply(preprocessing)     # preprocess
df_test['text'] = df_test.text.apply(rm_custom_stops)
X_test_count = vectorizer.transform(df_test.text)     # vectorize

4.交叉验证模型

scikit-learn 官网提供了 5 5 5 种朴素贝叶斯算法:

全称导入
Gaussian Naive Bayesfrom sklearn.naive_bayes import GaussianNB
Multinomial Naive Bayesfrom sklearn.naive_bayes import MultinomialNB
Complement Naive Bayesfrom sklearn.naive_bayes import ComplementNB
Bernoulli Naive Bayesfrom sklearn.naive_bayes import BernoulliNB
Categorical Naive Bayesfrom sklearn.naive_bayes import CategoricalNB
# initialize & cross validate a basic model
naivebayes = MultinomialNB()
cv_nb = cross_validate(naivebayes,
                       X_train_count,
                       y_train,
                       scoring = "accuracy")
# evaluate accuracy
cv_nb['test_score'].mean()

在这里插入图片描述
拟合交叉验证模型。

# fit model
naivebayes.fit(X_train_count, y_train)

在这里插入图片描述

5.评估模型

# get accuracy score
naivebayes.score(X_test_count, y_test)

在这里插入图片描述

# Plot confusion matrix
disp = ConfusionMatrixDisplay.from_estimator(naivebayes,
                             X_test_count, y_test,
                             cmap="Blues");

# 160 false positives, 323 false negatives

注意:ConfusionMatrixDisplay.from_estimator 需要 scikit-learn 1.0 1.0 1.0 以上版本。
在这里插入图片描述
解决方案:ConfusionMatrixDisplay.from_estimator missing #21775

根据官网提示,如果你使用的是 Python 3.6 版本,是装不上 scikit-learn 1.0 1.0 1.0 版本及以上的。

在这里插入图片描述
在这里插入图片描述
解决完这个 bug 后,工作继续。

# print classification report
Y_predict = naivebayes.fit(X_train_count, y_train).predict(X_test_count)
print(classification_report(y_test, Y_predict))

在这里插入图片描述

6.优化模型

6.1 使用 TF-IDF 构建词向量

关于 TF-IDF,想详细了解可以浏览我的这篇博客【自然语言处理】BOW和TF-IDF详解。

vectorizer = TfidfVectorizer(max_df=0.3) # ignore words with a frequency higher than this %
X_train_vec = vectorizer.fit_transform(df.text)
X_test_vec = vectorizer.transform(df_test.text)
model = MultinomialNB() # 多项式朴素贝叶斯分类器
model.fit(X_train_vec, y_train)
model.score(X_test_vec, y_test)

在这里插入图片描述

6.2 使用 ComplementNB 模型

ComplementNBMultinomialNB 模型的一个变种,实现了 补码朴素贝叶斯(CNB)算法。CNB 是 标准多项式朴素贝叶斯(MNB)算法的一种改进,比较适用于不平衡的数据集,在文本分类上的结果通常比 MultinomialNB 模型好,具体来说,CNB 使用来自每个类的补数的统计数据来计算模型的权重。CNB 的发明者的研究表明,CNB 的参数估计比 MNB 的参数估计更稳定。

vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(df.text)
X_test_vec = vectorizer.transform(df_test.text)
model = ComplementNB()
model.fit(X_train_vec, y_train)
model.score(X_test_vec, y_test)

在这里插入图片描述

6.3 清除 HTML 标签

import re

# function to remove html tags from text
def cleanHtml(review):
    cleanreg = re.compile('<.*?>')
    cleantxt = re.sub(cleanreg, ' ', review)
    return cleantxt

# load data
X_train, y_train, X_test, y_test = load_data_sent(percentage_of_sentences=10)

# process train data
df = pd.DataFrame({'text': X_train})
df.text = df.text.apply(cleanHtml)
df['text'] = df.text.apply(preprocessing)
df['text'] = df.text.apply(rm_custom_stops)
# process test data
df_test = pd.DataFrame({'text': X_test})
df_test.text = df_test.text.apply(cleanHtml)
df_test['text'] = df_test.text.apply(preprocessing)
df_test['text'] = df_test.text.apply(rm_custom_stops)

# modelling
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(df.text)
X_test_vec = vectorizer.transform(df_test.text)
model = ComplementNB()
model.fit(X_train_vec, y_train)
model.score(X_test_vec, y_test)

在这里插入图片描述

7.获取词频分布的方法(补充)

# create a new column with words and word counts
vectorizer = CountVectorizer()
analyzer = vectorizer.build_analyzer()

def wordcounts(s):
    c = {}
    if analyzer(s):
        d = {}
        w = vectorizer.fit_transform([s]).toarray()
        vc = vectorizer.vocabulary_
        for k,v in vc.items():
            d[v]=k # d -> index:word 
        for index,i in enumerate(w[0]):
            c[d[index]] = i # c -> word:count
    return  c

df['Word Counts'] = df.text.apply(wordcounts)
df.head()
w 示例输出 [[1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1]]
vc 示例输出 {'big': 3, 'step': 34, 'surprisingly': 36, 'enjoyable': 5, 'original': 23, 'sequel': 29, 'isnt': 12, 'nearly': 19, 'fun': 9, 'part': 24, 'one': 21, 'instead': 10, 'spend': 32, 'much': 18, 'time': 40, 'plot': 26, 'development': 4, 'tim': 39, 'thomerson': 38, 'still': 35, 'best': 2, 'thing': 37, 'series': 30, 'wisecrack': 45, 'tone': 41, 'entry': 7, 'performance': 25, 'adequate': 1, 'script': 28, 'let': 14, 'action': 0, 'merely': 16, 'routine': 27, 'mildly': 17, 'interest': 11, 'need': 20, 'lot': 15, 'silly': 31, 'laugh': 13, 'order': 22, 'stay': 33, 'entertain': 6, 'trancers': 42, 'unfortunately': 43, 'far': 8, 'watchable': 44}

在这里插入图片描述

import operator

first_review = df['Word Counts'].iloc[0]
sorted_by_value = sorted(first_review.items(), key=operator.itemgetter(1),reverse=True)
print(sorted_by_value )

在这里插入图片描述

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

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

相关文章

阿里云效git仓库的创建与使用

一、为何选用阿里仓库为什么要让同学们什么阿里云git仓库呢&#xff1f;主要是考虑速度、容量、人数限制、功能等因素。阿里的速度较快。代码库不限&#xff0c;人数不限制。gitee等仓库要求人员在5名以下&#xff0c;不方便实操练习。云效的功能还强大。有阿里做后盾&#xff…

微服务必经之路,企业应用架构蓝图,有状态和无状态组件之分

微服务如火如荼&#xff0c;但很多时候是事倍功半&#xff0c;花了大力气&#xff0c;收获很少。怎样实现一键扩展&#xff0c;负载量自然伸缩&#xff0c;高可用呢&#xff1f; 一般公司都有了企业级的应用&#xff0c;我们通常所说的三层架构&#xff0c;即用户界面或者说前台…

“华为杯”研究生数学建模竞赛2005年-【华为杯】D题:仓库容量有限条件下的随机存贮管理问题(附获奖论文和matlab代码)

赛题描述 工厂生产需定期地定购各种原料,商家销售要成批地购进各种商品。无论是原料或商品,都有一个怎样存贮的问题。存得少了无法满足需求,影响利润;存得太多,存贮费用就高。因此说存贮管理是降低成本、提高经济效益的有效途径和方法。 问题2 以下是来自某个大型超市的…

【Android】开发一个简单时钟应用每天看时间起床

有没有想过&#xff0c;家里闲置不用的旧手机可以当时钟闹钟来用&#xff0c;觉得这个想法可以吧&#xff0c;把闲置手机充分利用起来了呢&#xff0c;接下来给大家讲一下如何实现&#xff0c;功能简单&#xff0c;可以当作编程入门课。 在电脑上&#xff0c;打开我们熟悉的An…

【设计模式】结构型模式·享元模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 定义&#xff1a;运用共享技术来有效地支持大量细粒度对象的复用。通过共享已经存在的对…

厚积薄发打卡Day115:Debug设计模式<简单工厂、工厂方法、抽象工厂>

厚积薄发打卡Day115&#xff1a;Debug设计模式<简单工厂、工厂方法、抽象工厂> 简单工厂 定义 由一个工厂对象决定创建出哪一种产品类的实例&#xff08;严格意义并不是设计模式&#xff0c;更是一种风格&#xff09; 类型&#xff1a;创建型&#xff0c;但不属于GOF…

PyAutoFEP Tutorial--基于Gromacs

PyAutoFEP 自由能微扰计算–基于Gromacs 简介 注意&#xff1a;以下教程假定读者熟悉分子动力学 (MD) 和自由能微扰 (FEP) 理论。此外&#xff0c;了解 GROMACS 工具、拓扑和输入文件也很有用。整个教程都使用 Linux 命令行。最后&#xff0c;建议用户阅读并参考 PyAutoFEP 手…

17种编程语言+10种排序算法

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、前…

AI算法工程师 | 09机器学习-概率图模型(二)朴素贝叶斯算法与文本分类(1)

目录机器学习 - 概率图模型 之 朴素贝叶斯算法一、贝叶斯与朴素贝叶斯算法1、相关概念2、朴素贝叶斯分类的工作流程3、朴素贝叶斯的优缺点二、文本分类1、one-hot 编码2、TF-IDF 词频-逆文档频率3、代码&#xff1a;基于朴素贝叶斯实现文本分类&#xff08;使用 Python 手动实现…

力扣刷题| 239. 滑动窗口最大值、347.前 K 个高频元素

文章目录LeetCode 239. 滑动窗口最大值题目链接&#x1f517;思路代码实现LeetCode 347.前 K 个高频元素题目链接&#x1f517;思路代码实现LeetCode 239. 滑动窗口最大值 题目链接&#x1f517; LeetCode 239. 滑动窗口最大值 思路 这是使用单调队列的经典题目 难点是如何…

html列表

1.无序列表&#xff1a; 场景&#xff1a;在网页中表示一组无顺序之分的列表 如&#xff1a;新闻列表 标签组成&#xff1a; ul&#xff1a; 表示无序列表的整体&#xff0c;用于包裹li标签 li&#xff1a;表示无序列表的每一项&#xff0c;用于包含每一行的内容 注意点&…

Makefile学习③:编译流程

Makefile学习③&#xff1a;编译流程 学习前准备 实现七个文件的编写&#xff0c;例如&#xff1a;实现加减乘三个函数的.c文件和.h文件的编写加上主函数main.c&#xff0c;方便后续使用Makefile将其分别编译。 博主的demo如下&#xff1a; 使用gcc 命令将所有文件编译出来生…

线程控制--Linux

文章目录线程理解线程的优点与缺点进程的多个线程共享线程控制线程创建线程终止线程等待线程分离总结线程理解 谈及线程&#xff0c;就不得不谈起进程与线程的关系了。学习完前面有关进程的知识&#xff0c;之前我们对进程的定义是&#xff1a;内核数据结构代码和数据。但是今…

C语言return的用法详解,C语言函数返回值详解

函数的返回值是指函数被调用之后&#xff0c;执行函数体中的代码所得到的结果&#xff0c;这个结果通过 return 语句返回。return 语句的一般形式为&#xff1a;return 表达式;或者&#xff1a;return (表达式);有没有( )都是正确的&#xff0c;为了简明&#xff0c;一般也不写…

python使用类装饰器生成函数的使用日志

1 什么是类装饰器 在了解类装饰器之前&#xff0c;建议大家先了解装饰器的概念。 装饰器知识快速入门链接 类装饰器是 Python 中的一种特殊类型的装饰器&#xff0c;它是一个类而不是一个函数。与函数装饰器不同&#xff0c;类装饰器可以在运行时接收参数并返回一个可调用的对…

Linux文件系统(IO缓冲区+磁盘+软硬链接)

目录 一、缓冲区 1.1 缓冲区是内存的一块存储空间 1.2 缓冲区的作用 1.3 C式缓冲区 1.3.1 C语言的FILE结构体 1.3.2 C式缓冲区刷新策略 二、OS与内核缓冲区 2.1 数据从缓冲区到磁盘 2.2 fsync() 数据免缓冲直接到磁盘文件 2.3 检验用户与内核缓冲区 三、文件系统 3…

11. 好客租房-ElasticSearch入门学习

Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

分享144个ASP源码,总有一款适合您

ASP源码 分享144个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 144个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/15O9p6a8XlNN0u-wFKEkJqQ?pwd8354 提取码&#x…

Go 语言

Go语言是云计算时代的语言 Go语言2007年诞生于Google&#xff0c;2009年开源&#xff0c;Go语言与区块链技术一样年轻 本文是对Go语言基本语法的总结 目录 Go词法单元 token Go的token 标识符 内置数据类型标识符 常量值标识符 空白标识符 关键字 程序整体结构的关键字…

VBA提高篇_05日期时间函数

文章目录日期函数1. Date()2. Time()3. Now()时间数据解析函数时间运算函数DateDiff() 数据时间差DateAdd() 时间点指定跨越拓展日期函数 VBA中默认日期系统格式: #1/26/2023 12:20:25 # #月/日/年 时:分:秒# 1. Date() 获取当前系统的时间(年/月/日) 精度: 精确到秒 范围: 公…