基于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三个数据集对评论进行了情感分类,并在测试集上取得了较好的性能。

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

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

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

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

谢谢大家的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的Anthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值