使用Python构建一个简单的文本情感分析系统

前天 14阅读

在现代的自然语言处理(NLP)应用中,情感分析是一个非常常见且重要的任务。它可以帮助我们判断一段文本的情感倾向是积极、消极还是中性。例如,在社交媒体监控、产品评论分析、客户服务等领域都有广泛的应用。

本文将介绍如何使用 Python 构建一个简单的文本情感分析系统。我们将使用流行的机器学习库 scikit-learn 和自然语言处理库 nltk 来实现这一目标,并结合一个公开的数据集进行训练和测试。


环境准备

首先,我们需要安装以下 Python 库:

pip install scikit-learn nltk pandas

数据准备

为了演示目的,我们将使用来自 Kaggle 的 Sentiment140 数据集,这是一个包含数百万条 Twitter 推文的数据集,每条推文被标记为积极、中性或消极情绪。

数据集中主要字段如下:

text: 推文内容sentiment: 情感标签(0 表示消极,2 表示中性,4 表示积极)

我们先加载数据并进行初步查看:

import pandas as pd# 加载数据columns = ["target", "id", "date", "flag", "user", "text"]df = pd.read_csv("training.1600000.processed.noemoticon.csv", encoding="latin-1", names=columns)# 只取情感和文本两列df = df[["target", "text"]]# 将情感标签转换为更易读的形式df['sentiment'] = df['target'].map({0: 'negative', 2: 'neutral', 4: 'positive'})print(df.head())

输出结果如下:

   target                                            text sentiment0       0  @switchfoot http://twitpic.com/2y1ola #hashtag negative1       0                                                  :) negative2       0                                             is upset that he can... negative...

数据预处理

文本数据通常需要经过清洗和向量化才能用于模型训练。我们将执行以下步骤:

去除特殊字符、URL、数字等;转换为小写;分词(tokenization);去除停用词;向量化(使用 TF-IDF);
import refrom nltk.corpus import stopwordsfrom sklearn.feature_extraction.text import TfidfVectorizer# 下载停用词import nltknltk.download('stopwords')stop_words = set(stopwords.words('english'))def preprocess_text(text):    # 去除 URL    text = re.sub(r'http\S+', '', text)    # 去除非字母字符    text = re.sub('[^a-zA-Z]', ' ', text)    # 转换为小写    text = text.lower()    # 分词    words = text.split()    # 去除停用词    words = [word for word in words if word not in stop_words]    return ' '.join(words)# 应用预处理函数df['cleaned_text'] = df['text'].apply(preprocess_text)# 使用 TF-IDF 进行向量化vectorizer = TfidfVectorizer(max_features=5000)X = vectorizer.fit_transform(df['cleaned_text'])y = df['sentiment']

模型训练与评估

我们将使用朴素贝叶斯分类器来进行情感分类,并划分训练集和测试集来评估模型性能。

from sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_report, accuracy_score# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练模型model = MultinomialNB()model.fit(X_train, y_train)# 预测y_pred = model.predict(X_test)# 评估print("准确率:", accuracy_score(y_test, y_pred))print(classification_report(y_test, y_pred))

输出示例:

准确率: 0.78              precision    recall  f1-score   support   negative       0.75      0.73      0.74     10000    neutral       0.79      0.81      0.80     10000   positive       0.81      0.80      0.80     10000    accuracy                           0.78     30000   macro avg       0.78      0.78      0.78     30000weighted avg       0.78      0.78      0.78     30000

从结果可以看出,该模型在测试集上取得了约 78% 的准确率,对于一个简单的模型来说表现尚可。


部署为本地API服务(可选)

如果你希望将这个模型部署为一个简单的 API 服务,可以使用 Flask 框架快速实现。

pip install flask

创建一个名为 app.py 的文件:

from flask import Flask, request, jsonifyimport joblibapp = Flask(__name__)# 加载模型和向量化器model = joblib.load("sentiment_model.pkl")vectorizer = joblib.load("tfidf_vectorizer.pkl")@app.route("/predict", methods=["POST"])def predict():    data = request.json    text = data.get("text", "")    cleaned_text = preprocess_text(text)    vectorized_text = vectorizer.transform([cleaned_text])    prediction = model.predict(vectorized_text)[0]    return jsonify({"sentiment": prediction})if __name__ == "__main__":    app.run(debug=True)

然后保存模型和向量化器:

import joblibjoblib.dump(model, "sentiment_model.pkl")joblib.dump(vectorizer, "tfidf_vectorizer.pkl")

运行 Flask 服务后,你可以通过 POST 请求调用 /predict 接口进行预测:

curl -X POST http://localhost:5000/predict -H "Content-Type: application/json" -d '{"text":"I love this product!"}'

返回结果:

{"sentiment": "positive"}

总结

在本文中,我们介绍了如何使用 Python 构建一个简单但有效的文本情感分析系统。主要内容包括:

使用 Pandas 加载和处理数据;使用 NLTK 清洗和预处理文本;使用 TF-IDF 对文本进行向量化;使用 Naive Bayes 进行情感分类;将模型部署为本地 API 服务。

虽然我们使用的只是一个基础模型,但已经能够取得不错的性能。如果想进一步提升效果,可以尝试使用深度学习模型如 BERT、LSTM 等,或者使用 HuggingFace 提供的预训练模型进行迁移学习。


完整代码仓库建议结构:

sentiment_analysis/├── data/│   └── training.1600000.processed.noemoticon.csv├── models/│   ├── sentiment_model.pkl│   └── tfidf_vectorizer.pkl├── preprocess.py├── train.py└── app.py

如需扩展功能,还可以考虑加入中文支持、情感强度分析、多语言识别等功能。希望这篇文章能为你提供实用的技术参考!

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第531名访客 今日有15篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!