本文将介绍如何使用机器学习方法对文本进行情感分类,涵盖数据预处理、特征提取和模型训练等完整流程。

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}")

总结

本文展示了文本情感分类的流程:

  1. 导入数据
  2. 文本预处理(分词、去停用词、词干提取)
  3. 特征提取(TF-IDF)
  4. 模型训练(朴素贝叶斯、逻辑回归、SVM)
  5. 模型评估与应用

通过这些步骤,大概可以构建一个情感分类系统,用于判断文本的情感倾向。

由于本人能力有限,只用了200条数据来建模,处理和方法的应用有很多不到位的地方,以上代码运行下来的结果准确率不高,最高的是用朴素贝叶斯的,0.7左右,MAE值1.2左右。
如果有错误或者可以改进的地方,欢迎指出~
感谢阅读!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐