文本情感分类机器学习实战:从数据预处理到模型构建
·
本文将介绍如何使用机器学习方法对文本进行情感分类,涵盖数据预处理、特征提取和模型训练等完整流程。
1. 数据加载与探索
import pandas as pd
# 导入文件
df = pd.read_csv(filepath, encoding = 'utf-8')
# 查看数据前几行
df.head()
# 查看缺失值
df.isnull().sum()
这里我用的是 kaggle 里的数据:Sentiment140 dataset with 1.6 million tweets
2. 文本预处理
import nltk
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
import string
# 初始化词干提取器和停用词列表
stemmer = PorterStemmer()
stop_words = set(stopwords.words('english'))
# 第一次运行还要加上:
# nltk.download('stopwords')
def preprocess_text(text):
# 移除标点和转小写
text = text.translate(str.maketrans('', '', string.punctuation)).lower()
# 分词
words = text.split()
# 移除停用词并做词干提取(如"the", "a", "is"等常见但无实际意义的词)
words = [stemmer.stem(word) for word in words if word not in stop_words]
return ' '.join(words)
# 应用预处理函数
df['cleaned_text'] = df['text'].apply(preprocess_text)
3. 特征提取
将文本转换为机器学习模型可以理解的数值特征。
TF-IDF(词频-逆文档频率):衡量词语在文档中的重要程度。
from sklearn.feature_extraction.text import TfidfVectorizer
# 初始化TF-IDF向量化器
tfidf = TfidfVectorizer(max_features=150)
# 将清洗后的文本转换为TF-IDF矩阵
X = tfidf.fit_transform(df['cleaned_text']).toarray()
y = df['score']
4. 模型训练与评估
4.1 朴素贝叶斯
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report, mean_absolute_error
# 分割数据集
train_X, val_X, train_y, val_y = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
model = MultinomialNB()
model.fit(train_X, train_y)
# 预测并评估
pred_y = model.predict(val_X)
accuracy = accuracy_score(val_y, pred_y)
mae = mean_absolute_error(val_y, pred_y)
4.2 逻辑回归
from sklearn.linear_model import LogisticRegression
# 训练逻辑回归模型
model_1 = LogisticRegression()
model_1.fit(train_X, train_y)
# 预测并评估
pred_y_1 = model_1.predict(val_X)
accuracy_1 = accuracy_score(val_y, pred_y_1)
mae_1 = mean_absolute_error(val_y, pred_y_1)
4.3 支持向量机
from sklearn.svm import SVC
# 训练SVM模型
model_2 = SVC(kernel='linear', C=1, gamma='scale', class_weight='balanced', random_state=42)
model_2.fit(train_X, train_y)
# 预测并评估
pred_y_2 = model_2.predict(val_X)
accuracy_2 = accuracy_score(val_y, pred_y_2)
mae_2 = mean_absolute_error(val_y, pred_y_2)
5. 应用
训练好的模型可以用于对新文本进行情感分类:
def predict_sentiment(model, tfidf, text):
processed_text = preprocess_text(text)
text_tfidf = tfidf.transform([processed_text])
prediction = model.predict(text_tfidf)[0]
probability = model.predict_proba(text_tfidf)[0]
return prediction, probability
# 测试实例
test_texts = ['i am happy']
for text in test_texts:
pred, prob = predict_sentiment(model, tfidf, text)
print(f"文本: '{text}', 分类: {pred}, 概率: {max(prob):.2f}")
总结
本文展示了文本情感分类的流程:
- 导入数据
- 文本预处理(分词、去停用词、词干提取)
- 特征提取(TF-IDF)
- 模型训练(朴素贝叶斯、逻辑回归、SVM)
- 模型评估与应用
通过这些步骤,大概可以构建一个情感分类系统,用于判断文本的情感倾向。
由于本人能力有限,只用了200条数据来建模,处理和方法的应用有很多不到位的地方,以上代码运行下来的结果准确率不高,最高的是用朴素贝叶斯的,0.7左右,MAE值1.2左右。
如果有错误或者可以改进的地方,欢迎指出~
感谢阅读!
更多推荐



所有评论(0)