使用Python构建一个简单的文本情感分析系统
在现代的自然语言处理(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
如需扩展功能,还可以考虑加入中文支持、情感强度分析、多语言识别等功能。希望这篇文章能为你提供实用的技术参考!