当前位置: 首页 > news >正文

基于Python的人工智能应用案例系列(19):SpaCy评论情感极性分类

  在本案例中,我们将尝试将Yelp评论分类为正面或负面的情感极性。我们将通过加载评论数据,进行文本预处理,使用TF-IDF向量化技术,并通过支持向量机(SVM)分类模型来完成分类任务。尽管这是一个基础任务,但它可以帮助我们回顾并掌握文本预处理和分类任务中的关键步骤。

0. 基本文本预处理

        在自然语言处理(NLP)任务中,文本预处理是不可或缺的步骤,它能够有效地提高模型的性能。我们将会进行以下几种基本的预处理操作:

  • 词形还原(Lemmatization):将不同形式的词语还原为它们的基本形式,如runrunsrunning会被还原为run
  • 去除停用词(Stopwords):去除常见但没有实际意义的词,如“the”、“is”。
  • 去除标点符号和空格:移除标点符号和多余的空格,并将文本转换为小写。

        首先,安装和加载Spacy库并初始化模型来处理这些任务:

import spacy# 加载英语语言模型
nlp = spacy.load("en_core_web_sm")
词形还原

        词形还原是将单词还原为其基础词干形式。通过Spacy的lemma_属性,我们可以提取词的基础形式。示例代码如下:

# 示例文本
doc = nlp('run runs running ran')# 遍历文档中的词并提取词干
for token in doc:print(token.text, token.lemma_)
去除停用词和标点符号

        停用词是一些常见的、对文本分析意义不大的词语。我们使用Spacy内置的停用词列表,并结合POS标注去除标点符号。示例代码如下:

from spacy.lang.en.stop_words import STOP_WORDS# 示例文档
doc = nlp('Going to eat at Thammasat with my / best      good friends.')# 去除停用词和标点符号
clean_tokens = []
for token in doc:if not token.is_stop and token.pos_ != 'PUNCT':clean_tokens.append(token.text)print(clean_tokens)
组合所有预处理操作

        为了简化后续步骤,我们将所有预处理操作组合到一个函数中,返回清理后的单词列表:

def preprocessing(sentence):doc = nlp(sentence)cleaned_tokens = []for token in doc:# 去除停用词、标点符号、空格、以及特殊符号if not token.is_stop and token.pos_ not in ['PUNCT', 'SPACE', 'SYM']:cleaned_tokens.append(token.lemma_.lower().strip())return cleaned_tokens

1. Yelp评论情感分类

1.1 加载数据

        我们使用来自Kaggle的数据集,包含来自Yelp、Amazon和IMDB的用户评论。每条评论都有一个对应的情感标签(0为负面,1为正面)。

import pandas as pd# 加载Yelp、Amazon、IMDB的评论数据集
data_yelp = pd.read_csv('../data/yelp_labelled.txt', sep='\t', header=None, names=['Review', 'Sentiment'])
data_amazon = pd.read_csv('../data/amazon_labelled.txt', sep='\t', header=None, names=['Review', 'Sentiment'])
data_imdb = pd.read_csv('../data/imdb_labelled.txt', sep='\t', header=None, names=['Review', 'Sentiment'])
1.2 合并数据集

        将三个数据集合并为一个大数据集,便于模型训练:

# 合并三个数据集
data = pd.concat([data_yelp, data_amazon, data_imdb], ignore_index=True)
print(data.shape)  # 查看合并后的数据集大小

2. 使用CountVectorizer进行词频统计

        CountVectorizer用于将文本转换为词频矩阵,即统计每个单词在文档中出现的次数。我们将结合前面定义的preprocessing函数对文本进行预处理。

from sklearn.feature_extraction.text import CountVectorizer# 初始化CountVectorizer并应用预处理函数
countvec = CountVectorizer(tokenizer=preprocessing)# 示例文本集
corpus = ['I love programming in Python', 'Python is great for data analysis', 'Deep learning is amazing']
result = countvec.fit_transform(corpus)# 输出词汇表
print(countvec.get_feature_names_out())
# 输出词频矩阵
print(result.toarray())

3. 使用TfidfVectorizer进行TF-IDF词频-逆文档频率统计

        TF-IDF是对词频的改进,它考虑了单词在文档中的频率和在所有文档中的稀有性。

from sklearn.feature_extraction.text import TfidfVectorizer# 初始化TfidfVectorizer
tfidvec = TfidfVectorizer(tokenizer=preprocessing)# 对负面和正面评论进行词频统计
neg_df = data[data['Sentiment'] == 0]
pos_df = data[data['Sentiment'] == 1]# 计算负面评论中的词频
neg_result = tfidvec.fit_transform(neg_df['Review'])
print(tfidvec.get_feature_names_out())  # 查看词汇表

4. 模型训练与预测

        我们使用支持向量机(SVM)模型来训练和预测评论情感。

from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report, confusion_matrix# 定义数据
X = data['Review']
y = data['Sentiment']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建Pipeline
clf = Pipeline([('tfidf', TfidfVectorizer(tokenizer=preprocessing)), ('clf', LinearSVC())])# 训练模型
clf.fit(X_train, y_train)# 进行预测
y_pred = clf.predict(X_test)# 输出分类报告
print(classification_report(y_test, y_pred))
# 输出混淆矩阵
print(confusion_matrix(y_test, y_pred))

5. 实际预测

        最后,我们使用训练好的模型对新评论进行情感分类。

# 预测一些新评论
print(clf.predict(['This restaurant is amazing!']))
print(clf.predict(['The service was terrible.']))

结语

        通过这个案例,我们成功地展示了如何对Yelp评论数据进行情感分类,以及如何在文本处理的基础上进行分类建模。在这个过程中,我们首先通过自然语言处理(NLP)技术对原始文本进行了清洗和预处理,包括词干化(lemmatization)、去除停用词(stopwords)、处理标点符号、规范化大小写等操作。这些步骤对于提升模型性能至关重要,因为它们有效减少了数据中的噪声。

        接下来,我们探讨了两种常见的文本特征提取方法:CountVectorizerTfidfVectorizer。通过这两种方法,我们可以将文本数据转换为适合机器学习模型的数值表示。特别是 TfidfVectorizer,通过对词频进行逆文档频率(TF-IDF)加权处理,能够更好地识别重要的词汇,避免常见词(如“the”、“is”)对模型产生不必要的影响。

        在构建文本分类模型时,我们采用了支持向量机(SVM)进行训练,并且通过交叉验证和管道(Pipeline)的方式,使整个流程更加模块化和易于管理。最终,我们使用Yelp、Amazon、IMDB三个数据集对评论进行了情感分类,并在测试集上取得了较好的性能。

        本案例不仅仅是一次文本情感极性分类的演示,它还展示了如何从文本数据中提取有用的信息,并通过合理的预处理和特征工程来构建一个高效的分类模型。对于现实世界中的应用,这一技术可以进一步扩展到其他文本分析任务,如商品评价、社交媒体评论、电子邮件过滤等,甚至可以应用到更多语言处理的场景。

        通过这个案例的学习,你应该已经掌握了文本数据预处理、特征提取以及分类模型的完整流程。随着更多数据和更复杂的场景加入,文本分类的挑战也将不断增加,但这些基本的步骤将始终是解决这些问题的关键。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!


http://www.mrgr.cn/news/44386.html

相关文章:

  • SumatraPDF一打开就无响应怎么办?
  • 信息学奥赛一本通 2100:【23CSPJ普及组】一元二次方程(uqe) | 洛谷 P9750 [CSP-J 2023] 一元二次方程
  • Ajax面试题:(第一天)
  • 分享股票期货高频数据获取以及我的策略
  • 【Canvas与色彩】十六等分多彩隔断圆环
  • Network - Telnet协议
  • Linux:进程的创建、终止和等待
  • python爬虫 - 初识requests模块
  • 用Python实现运筹学——Day 14: 线性规划总结与案例复习
  • Arduino UNO R3自学笔记21 之 Arduino电机的闭环控制(PID)
  • C# 泛型集合实战:List<T>与Dictionary<TKey, TValue>的使用与优势
  • 给Linux操作系统命令取个别名
  • 【含文档】基于Springboot+Android的房屋租赁App(含源码+数据库+lw)
  • 数据采集工具sqoop介绍
  • 高级java每日一道面试题-2024年10月6日-数据库篇-MVCC是什么? 它的底层原理是什么?
  • 设计模式的学习
  • Trie树之最大异或对问题
  • C语言 | Leetcode C语言题解之第461题汉明距离
  • VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发布
  • 【Canvas与色彩】十二等分多彩隔断圆环