78·实战项目进阶

实战:文本分类(NLP)完整项目

projectnlp

第78课 实战:文本分类(NLP)完整项目

所属模块: 实战项目
难度: intermediate
标签: project, nlp
上一课: 实战:图像分类(CNN)完整项目
下一课: 实战:推荐系统构建


1. 学习目标

通过本节课的学习,你将能够:

  1. 理解并掌握一个完整的中文文本分类(情感分析)项目的全流程。
  2. 熟练运用自然语言处理(NLP)基础技术,如分词、停用词过滤和文本向量化。
  3. 独立实现从数据预处理、模型训练到评估与应用的端到端项目。
  4. 评估模型性能,并理解准确率、精确率、召回率等关键指标的意义。

2. 核心概念

文本分类,顾名思义,就是将一段文本自动归入一个或多个预定义的类别中。最经典的例子就是情感分析:判断一条用户评论是“正面的”还是“负面的”。

想象一下,你要教一个计算机理解人的情绪。我们不会直接把文字喂给它,而是需要一个“翻译”过程:

  1. 分词:中文句子需要被拆分成一个个有意义的词语(如“我/喜欢/这个/产品”)。这就是jieba库的核心作用。
  2. 去噪:去除对情感判断无用的词语,如“的”、“了”、“是”(称为停用词)。
  3. 数字化:计算机只认数字。我们需要把每个词转换成一个数字向量。最常用的方法是TF-IDF,它能衡量一个词在一篇文档中的重要程度(词频高且在整个语料库中不常见,权重就高)。
  4. 模型学习:我们将这些数字化的“文本特征”和对应的“情感标签”(0或1)一起交给一个分类算法(如朴素贝叶斯、逻辑回归),让它学习其中的规律。

3. 代码示例

我们将使用一个中文购物评论数据集,完成一个从“负面”/“正面”分类的项目。

# 导入必要的库
import pandas as pd
import jieba
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report

# 1. 加载数据
# 这里我们模拟一个简单的数据集,实际项目可以从CSV文件加载
data = {
    'comment': [
        "这个产品质量太差了,刚用一天就坏了",
        "非常棒的体验,物超所值,下次还来",
        "客服态度恶劣,坚决不推荐",
        "发货速度快,包装精美,很满意",
        "价格有点贵,但东西还可以",
        "完全是欺骗,图片和实物不符",
        "性能出众,运行流畅,好评!",
        "失望透顶,再也不买了"
    ],
    'label': [0, 1, 0, 1, 0, 0, 1, 0]  # 0: 负面, 1: 正面
}
df = pd.DataFrame(data)

# 2. 数据预处理 - 分词与清洗
# 定义停用词表(这里简化,实际应加载完整停用词表)
stopwords = set(['的', '了', '是', '在', '我', '就', '都', '而', '及', '与'])

def preprocess_text(text):
    # 使用jieba进行分词
    words = jieba.cut(text)
    # 过滤停用词,并用空格连接成字符串(TfidfVectorizer需要字符串输入)
    filtered_words = [word for word in words if word not in stopwords and word.strip()]
    return " ".join(filtered_words)

df['processed_comment'] = df['comment'].apply(preprocess_text)

# 3. 特征工程 - TF-IDF向量化
tfidf_vectorizer = TfidfVectorizer(max_features=1000)  # 限制特征数量,防止过拟合
X = tfidf_vectorizer.fit_transform(df['processed_comment'])
y = df['label']

# 4. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# 5. 模型训练(使用朴素贝叶斯,适合文本分类)
model = MultinomialNB()
model.fit(X_train, y_train)

# 6. 模型评估
y_pred = model.predict(X_test)
print(f"模型准确率: {accuracy_score(y_test, y_pred):.2f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=['负面', '正面']))

# 7. 模型应用 - 预测新评论
new_comments = [
    "这家店的服务让我非常生气!",
    "宝贝收到了,很喜欢,五星好评"
]
processed_new_comments = [preprocess_text(comment) for comment in new_comments]
new_X = tfidf_vectorizer.transform(processed_new_comments)
predictions = model.predict(new_X)
probabilities = model.predict_proba(new_X)

print("\n新评论预测结果:")
for comment, pred, prob in zip(new_comments, predictions, probabilities):
    label = "正面" if pred == 1 else "负面"
    confidence = prob[pred]
    print(f"评论: '{comment}' -> 预测: {label} (置信度: {confidence:.2f})")

4. 实践练习

练习一(基础): 将上述代码中的朴素贝叶斯分类器 (MultinomialNB) 替换为逻辑回归 (LogisticRegression) 或支持向量机 (SVC),观察并比较模型准确率的变化。 提示:需要从sklearn.linear_model导入LogisticRegression,或从sklearn.svm导入SVC

练习二(进阶): 为上述项目添加一个功能:计算模型在测试集上的混淆矩阵 (confusion_matrix),并思考如何解释矩阵中的四个值(真正例、假正例、真负例、假负例)。 预期输出:一个2x2的矩阵,并附上你的解读。

练习三(挑战): 在预处理步骤中,尝试对分词结果进行词性过滤,只保留名词、动词、形容词等对情感贡献大的词性。你可以使用jieba.posseg模块。 要求:比较加入词性过滤前后,模型准确率是否有变化。

5. 常见错误

  1. 忽略中文分词质量:直接对未分词的中文句子进行向量化,效果会很差。务必使用jieba等工具。
  2. 停用词处理不当:要么忘了去除停用词,要么停用词表过于简单(如只用了英文停用词表),无法有效过滤中文无用词。
  3. 特征向量化参数设置不当
    • max_features 设置过大,可能导致模型在小数据集上过拟合。
    • 没有使用 TfidfVectorizer 而是简单的 CountVectorizer(词袋模型),丢失了词频-逆文档频率这一重要权重信息。
  4. 数据泄露:在划分训练集/测试集之前,就应该对整个数据集进行分词和停用词处理。如果在划分之后分别处理,可能会导致测试集的处理方式受到训练集词表的影响,造成评估结果虚高。正确的流程是:原始数据 -> 预处理 -> 划分数据集 -> 向量化(在训练集上fit,在测试集上transform)。我们的示例代码为了简化,在划分前进行了fit_transform,这在小型示例中影响不大,但在严肃项目中应调整顺序。

6. 小结

在本课中,我们完成了一个完整的中文文本情感分析项目。关键要点如下:

  1. 流程完整:经历“数据加载 -> 预处理(分词、去停用词) -> 特征提取(TF-IDF) -> 模型训练 -> 评估 -> 应用”全流程。
  2. 预处理是关键:高质量的文本清洗和分词是NLP项目成功的基石。
  3. 特征提取决定上限:TF-IDF是一种简单有效的文本向量化方法,能很好地表征词的重要程度。
  4. 模型选择与评估:朴素贝叶斯是文本分类的基准模型,准确率、分类报告和混淆矩阵是评估分类模型性能的核心工具。
  5. 可复用性:将预处理和模型封装成函数,便于对新数据进行预测。

掌握这个流程后,你就可以将其迁移到其他文本分类任务中,如新闻主题分类、垃圾邮件识别、用户意图识别等。下一课,我们将进入另一个充满挑战的领域——推荐系统。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「实战:推荐系统构建」 以巩固所学知识。