【Python机器学习】NLP分词——词的“情感”

news2024/9/21 4:26:39

目录

VADER:一个基于规则的情感分析器

朴素贝叶斯


无论NLP流水线中使用的是单个词、n-gram、词干还是词元作为词条,每个词条都包含了一些信息,这些信息中一个重要部分是词的情感,即一个词所唤起的总体感觉或感情。这种度量短语或者文本块的情感的任务称为情感分析,是NLP中的一个常见应用。在很多公司中,NLP工程师要做的最主要的工作就是情感分析。

类似于研究/分析用户对商品的反馈,机器不会有人类的那种倾向性,也没有人类的情感触发器。而且,并不仅仅是人类才可以处理自然语言文本和从中提取信息甚至意义,NLP流水线也能够快速客观地处理大量用户反馈,而不会出现什么倾向性。同时,NLP流水线能够输入文本的正向性或者负向性以及任何其他的情感质量的数值等级。

另一个常见的情感分析应用是垃圾邮件或钓鱼消息的过滤。我们也希望自己的聊天机器人能够判断聊天信息中的情感以便能够合理地回复消息。甚至更重要的一点是:我们希望聊天机器人在输出语句之前能够知道该语句的情感倾向,从而引导机器人输出更加亲和、友好的语句。我们需要机器人能够度量要说的任何话的得体程度从而决定是否需要回复。

要度量一段文本的情感产生所谓的倾向性数值,我们希望NLP流水线和情感分析算法输出单个从-1到+1之间的浮点数。

有两种情感分词的方法,分别是:

  • 基于规则的算法,规则由人来撰写;
  • 基于机器学习的模型,模型是机器从数据中学习而得到的。

第一种情感分析的方法使用用户设计的规则(有时称为启发式规则)来度量文本的情感。一个常用的基于规则的方法是在文本中寻找关键词,并将每个关键词映射到某部字典或者映射上的数值得分或权重,例如这部字典可以是Python的dict。我们在字典中可以使用分词后的词干、词元或者n-gram词条,而不只是词。算法中的规则将迭加文档中每个关键词在字典中的情感得分。显然,在文本上运行我们的算法之前,我们必须要手工构建一步关键词及每个关键词的情感得分的字典。

第二中基于机器学习的方法利用一系列标注语句或者文档来训练机器学习模型以产生规则。机器学习的情感模型在经过训练以后能够处理输入文本并输出该文本的一个情感数值得分,该得分就像正向倾向性、垃圾程度和钓鱼程度一样。对于机器学习方法,需要大量标注好“正确”情感得分的文本数据。推文数据往往被用于这类方法,因为推文中的哈希标签往往可用于构建“自标注”的数据集。

VADER:一个基于规则的情感分析器

VADER算法时最早被成功提出的基于规则的情感分析算法,很多NLP包实现的是该算法的某种形式。NLTK包中的nltk.sentiment.vader实现了VADER算法。

下面是使用vaderSentiment的代码:

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

sa=SentimentIntensityAnalyzer()
print(sa.lexicon)

上述代码呈现的是分词器最擅长处理的标点符合和表情符号,这样VADER才能更好地工作。如果在流水线中词干还原工具(或词形归并工具),需要将该工具也用于VADER词库,使单个词干或词元中的所有词的得分组合起来。

print([(tok,score) for tok,score in sa.lexicon.items()])

在VADER定义的7500个词条中,只有3个包含空格,其中两个实际上是n-gram,另一个是表达“kiss”的表情符号。

print(sa.polarity_scores(text="Python is very readable and it's great for NLP."))

VADER算法用3个不同的分数(正向、负向和中立)来表达情感极性的强度,然后将它们组合在一起得到一个复合的情感倾向性得分。

print(sa.polarity_scores(text="Python is not a bad choice for most applications."))

下面看上述基于规则的方法在前面提到的语句上的应用结果如何:

corpus=["Absolutely perfect! Love it! :-) :-) :-)",
        "Horrible! Completely useless. :(",
        "It was OK. Some good and some bad things."]
for doc in corpus:
    scores=sa.polarity_scores(doc)
    print('{:+}:{}'.format(scores['compound'],doc))

VADER的唯一不足在于,它只关注其词库中的7500个词条,而非文档中的所有词。

朴素贝叶斯

朴素贝叶斯模型视图从一系列文档集合中寻找对目标(输出)变量有预测作用的关键词。当目标变量是要预测的情感时,模型将寻找那些能预测该情感的词,朴素贝叶斯模型的一个好处是:其内部的系数会将词或词条映射为类似于VADER中的情感得分。只有这时,我们才不必受限于让人来决定这些分数应该是多少,机器将寻找任何其认为的“最佳”得分。

对于任一机器学习算法,首先必须要有一个数据集,即需要一些已经标注好正向情感的文本文档。nlpia包中有4个不同的情感数据集:

from nlpia.data.loaders import get_data
movies=get_data('hutto_movies')
print(movies.head().round(2))

print(movies.describe().round(2))

可以看到,该数据集中,对电影的评分区间在-4到+4之间。

下面使用分词器对所有电影评论文本进行切分,从而得到每篇评论文本的词袋,然后将他们放入DataFrame中:

import pandas as pd
from nltk.tokenize import casual_tokenize
from collections import Counter
pd.set_option('display.width',75)
bags_of_words=[]
for text in movies.text:
    bags_of_words.append(Counter(casual_tokenize(text)))
df_bows=pd.DataFrame.from_records(bags_of_words)
df_bows=df_bows.fillna(0).astype(int)
print(df_bows.shape)
print(df_bows.head())

上述代码中,词袋表格可能会快速增长到很大的的规模,特别是在没有使用大小写归一化、停用词过滤、词干还原和词形归并过程时更是如此。在这里可以考虑插入上述降维工具观察对流水线的影响。

现在我们有了朴素贝叶斯模型所需要的所有数据,利用这些数据可以从自然语言文本中寻找那些预测情感的关键词:

from sklearn.naive_bayes import MultinomialNB
nb=MultinomialNB()
nb=nb.fit(df_bows,movies.sentiment>0)
predicted_s=list(nb.predict_proba(df_bows)*8-4)
print(predicted_s[:9])
ps=[]
for i in range(len(predicted_s)):
    ps.append(list(predicted_s[i])[1])
movies['predicted_sentiment']=ps
movies['error']=(movies.predicted_sentiment-movies.sentiment).abs()
print(movies.error.mean().round(1))
movies['sentiment_ispositive']=(movies.sentiment>0).astype(int)
movies['predicted_ispositive']=(movies.predicted_sentiment>0).astype(int)
print(movies['''sentiment predicted_sentiment sentiment_ispositive predicted_ispositive'''.split()].head(8))
print((movies.predicted_ispositive == movies.sentiment_ispositive).sum()/len(movies))

可以看到,最终的点赞评级的正确率是93.44%。

只需要短短的几行代码,就可以构建一个不错非情感分析器。我们不需要像VADER一样构建一个包含7500个词及其对应情感得分的列表,而只需要给出一些文本及其标注。这就是机器学习和NLP的优势所在。

在另一种数据上,如果想和上面一样构建一个实际的情感分析器,要对训练数据进行分割。如果强行对所有的文本点赞或点差,那么一个随机猜测的MAE大概在4左右,因此,上面的情感分析器大概比随机猜测好一半:

products=get_data('hutto_products')
bags_of_words=[]
for text in products.text:
    bags_of_words.append(Counter(casual_tokenize(text)))
df_product_bows=pd.DataFrame.from_records(bags_of_words)
df_product_bows=df_product_bows.fillna(0).astype(int)
df_all_bows=pd.concat([df_bows,df_product_bows],ignore_index=True)
#=df_bows.append(df_product_bows)
print(df_all_bows.columns)
df_product_bows=df_all_bows.iloc[len(movies):][df_bows.columns]
df_product_bows=df_product_bows.fillna(0).astype(int)
print(df_product_bows.shape)
print(df_bows.shape)

from sklearn.naive_bayes import MultinomialNB
nb=MultinomialNB()
nb=nb.fit(df_bows,movies.sentiment>0)
products['ispos']=(products.sentiment>0).astype(int)
products['predicted_ispositive']=nb.predict(df_product_bows.values).astype(int)
print(products.head())
print((products.predicted_ispositive==products.ispos).sum()/len(products))

因此,上述朴素贝叶斯模型在预测商品评论是否正向(即点赞)时表现得很糟糕。造成如此糟糕效果的一个原因是,利用casual_tokenize从商品文本中得到的词汇表中有2546个词条不在电影评论中。这个数目大约占电影评论分词结果的10%,这些词在朴素贝叶斯模型中不会有任何权重或者得分。另外,朴素贝叶斯模型也没有像VADER一样处理否定词。我们必须要将n-gram放在分词器中才能够将否定词(如“not”、“never”)与其修饰的可能要用的正向词关联起来。

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

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

相关文章

XOR 已知明文攻击

在这篇博文中,我们详细展示了*针对 XOR 编码的*已知明文攻击是如何进行的,并使用自定义工具自动执行该攻击,以解密和提取 Cobalt Strike 信标的配置。如果您对理论不感兴趣,只对工具感兴趣,请直接跳到结论! 已知明文攻击 (KPA) 是一种密码分析方法,分析人员拥有消息的明文…

【设计模式-装饰】

定义 装饰模式是一种结构型设计模式,它允许在不改变对象自身的前提下动态地给对象添加职责(功能)。通过使用装饰模式,可以将对象的功能扩展变得更加灵活和可维护,同时避免了类继承的复杂性。 特点 动态扩展对象功能…

猫咪浮毛满天飞?希喂、IAM、352三款宠物空气净化器测试对比

我作为一名养宠三年的铲屎官,用过不少清理工具,可惜都效果不佳。经过朋友的推荐,我了解到宠物空气净化器这种产品,想要购入使用。在挑选时我发现,目前市面上宠物空气净化器品牌繁多,质量难辨。因此&#xf…

【iOS端】基于Uniapp跨平台接入即构RTC+相芯美颜

0 Uniapp平台接入完成iOS端的即构RTC相芯美颜 Uniapp最大优势是跨平台,前面介绍了如何在android中接入相芯美颜即构RTC,今天咱们把相同的代码接入到iOS中。按照惯例我们先看最终效果,欢迎大家评论讨论: 1 开发配置准备 iOS开发因…

YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】

目录 一、训练yolov8模型,得到最佳权重文件best.pt 二、pt转onnx,即best.pt->best11.onnx 1、对下载的YOLOv8代码修改 2、加入模型导出功能, 3、导出指令采用如下代码 三、ONNX转RKNN 四、RK3588部署 1、拷贝rknn文件到rk3588板子内 2、执行…

.NET6 多环境 在Windows IIS部署的应用场景

前言: 通常情况下 我们部署Web站点 需要用到 测试环境 和 正式环境 2个环境 Staging环境 或者其他环境 视 团队所处阶段、团队规模、质量要求、风险控制要求、第3方协议而定 1.我们把上一讲 IX.MultiEnvironment 这个项目发布到IIS中 2.IIS配置3个环境 我们重点…

MathType2025最新破解版补丁包+永久免费安装包win+mac系统

有一类笔记特别受欢迎,那就是“数学公式的排版”。这些笔记通常以图文并茂的方式,展示了如何使用各种工具来排版数学公式。其中,MathType 7 是最受欢迎的工具之一,它不仅功能强大、使用方便,还能让你轻松地制作出精美的…

Tailor:免费开源 AI 视频神器,创作者必备利器

目录 引言一、创新特性,引领视频编辑新潮流1. 智能人脸剪辑2. 精准语音剪辑3. 自动化口播生成4. 多样化字幕生成5. 一键式色彩生成 二、简单易用,新手也能快速上手1. 下载和安装2. 功能选择3. 操作流程 三、广泛应用,满足不同创作需求四、代码…

别让语法拖后腿:ChatGPT助你告别改稿噩梦!【建议收藏】

学术论文的撰写是研究成果传播的关键。清晰、准确、逻辑严密的表达对于学术论文的质量至关重要。人工智能技术的快速发展,尤其是ChatGPT 4.0的推出,为学术写作提供了新的辅助工具。本文将探讨如何有效利用ChatGPT 4.0进行论文润色。 ChatGPT&#xff1a…

线性代数:如何由AB=E 推出 BA=AB?

最近在二刷线性代数,在看逆矩阵定义的时候发现了这个问题。于是决定写一写,给出一种证明方式。 一、由逆矩阵的定义出发 这是我在mooc-山东大学-线性代数(秦静老师)第一章第十讲的ppt上截取的定义。 看到这个定义我就在想&#xf…

如何在Java中使用protobuf

写在前面 本文看下在Java中如何使用protofbuf。 1:介绍 1.1:什么是protobuf 是一种数据格式,同json,xml,等。但是一种二进制数据格式。 1.2:强在哪里?为啥要用? 小&#xff0c…

图新说-调整标绘线面的压盖顺序的两种方法

0.序 图新说作为一个三维可视化汇报工具,在公安消防领域常用于做态势标绘,应急救援方案,安保预案等。 如果撤离路线,或者行进路线【线对象】经过了水源地、危险区等【面对象】。如何确保线对象显示在面对象的上面,不被…

MyBatis中的占位符解析机制

深入理解 MyBatis 中的 #{} 占位符解析机制 在使用 MyBatis 进行数据库操作时,#{} 占位符是我们非常常用的一个特性。它能够将 Java 对象的属性值与 SQL 语句中的参数进行映射。在实际使用中,MyBatis 如何解析 #{} 占位符并获取对应的属性值呢&#xff…

如何实现低成本降噪?风扇噪声流体仿真解决方案

本文将说明工程师如何能够使用气动解决方案来模拟和降低一款小型发电机柜冷却风扇的噪音。ultraFluidX 的模拟结果将设备内部的流场和声场可视化,研究风扇和机柜内其他部件的相互作用,确认噪声源来自何处(协助工程师采取有效的降噪措施&#…

Mybatis中的缓存

一,为什么要使用缓存 1,缓存的作用 缓存(cache)的作用是为了减去数据库的压力,提高查询性能。 缓存实现的原理是 从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存) 中&#…

zipkin启动发生报错 : Failed to start bean ‘armeriaServerGracefulShutdownLifecycle‘;

报错详情 : 在windows下启动zipkin的时候发生报错 : Failed to start bean ‘armeriaServerGracefulShutdownLifecycle’;nested exception is java.util.concurrent.CompletionException: java.lang.IllegalStateException: Armeria server failed to start解决 : 由于z…

SSM网上书店--附源码96453

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于网上书店当然也不能排除在外,随着网络技术的不断成熟,带动了网上书店,它彻底改变了过去传统的管理方式…

安装cvxpy时遇到“subprocess-exited-with-error”的解决方式

尝试联邦学习时,遇到了这个问题,但实际上仔细看报错就能找到源头 ①更新cmake版本到3.17 参考此文即可更新 https://blog.csdn.net/why1249777255/article/details/138505546 【报错点中“Found CMake:…………”这一行,在不满足要求时会说…

信息学奥赛一本通编程启蒙(不断更新ing~)

可以作为c初学者的练习题,我会挑选有部分有代表意义的题目作为学生的课后作业,后面会在专栏中陆续更新题目解析,并附在这一篇文章的链接中 信息学奥赛一本通-编程启蒙(C版)在线评测系统 https://bas.ssoier.cn/index…

安全升级,智启未来!广东工业安全生产数智化转型闭门分享会圆满举办

8月26日,由华为技术有限公司(以下简称“华为”)与广州英码信息科技有限公司(以下简称“英码科技”)联合主办,广东省应急产业协会为支持单位的“广东工业安全生产数智化转型闭门分享会”在广州圆满举行。本次…