机器学习·NLP中的文本分类

前言

本文介绍自然语言处理(英语:Natural Language Processing,缩写作 NLP)中的文本分类应用,包括中英文分词方法、文本特征提取和假新闻分类任务。


一、中文分词方法

方法 原理 优缺点
正向最大匹配(MM) 从左向右取最长词匹配词典,匹配失败则减1字继续匹配 简单快速,但无法处理未登录词,依赖词典质量
逆向最大匹配(RMM) 从右向左取最长词匹配词典 对偏正结构处理更好,但同样依赖词典
双向最大匹配(BMM) 结合正向和逆向结果,选择切分次数少的作为最终结果 提高准确性,但计算复杂度较高
统计分词 基于语料库统计词共现概率,利用隐马尔可夫模型(HMM)或条件随机场(CRF) 能处理未登录词,但需要大量标注数据,计算复杂度高

二、结巴分词工具

  • 分词模式

    • 精确模式jieba.cut(text),适合文本分析。

    • 全模式jieba.cut(text, cut_all=True),输出所有可能成词的组合。

    • 搜索引擎模式jieba.cut_for_search(text),对长词再次切分,提高召回率。

  • 自定义词典

    复制代码
    jieba.add_word("机器学习")  # 添加新词
    jieba.load_userdict("user_dict.txt")  # 加载自定义词典

三、英文文本分词

  • 特点:天然以空格分隔,无需复杂分词算法。

  • 处理标点

    复制代码
    import string
    text = "Hello, world! This is an example."
    words = text.translate(str.maketrans('', '', string.punctuation)).split()
    # 输出:['Hello', 'world', 'This', 'is', 'an', 'example']

四、文本特征提取方法

方法 原理 应用场景 工具
词袋模型(BoW) 统计词频生成向量,忽略词序和语法 简单文本分类,基线模型 sklearn.feature_extraction.CountVectorizer
TF-IDF 词频(TF)×逆文档频率(IDF),突出重要词 信息检索,文本分类 sklearn.feature_extraction.TfidfVectorizer
Word2Vec 将词映射为低维稠密向量,捕捉语义相似性 语义分析,深度学习模型输入 gensim.models.Word2Vec
  • TF-IDF 公式

    \( \text{TF-IDF}(t,d) = \text{TF}(t,d) \times \log\left(\frac{N}{\text{DF}(t) + 1}\right) \)

    • \( \text{TF}(t,d) \):词 \( t \) 在文档 \( d \) 中的频率。

    • \( \text{DF}(t) \):包含词 \( t \) 的文档数。

    • \( N \):总文档数。

  • Word2Vec 训练示例

    复制代码
    from gensim.models import Word2Vec
    sentences = [["自然", "语言", "处理"], ["深度", "学习", "实战"]]
    model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)
    print(model.wv["自然"])  # 输出词向量

五、假新闻分类实战步骤

1. 数据预处理
  • 合并文本列

    复制代码
    df['title_zh'] = df['title1_zh'] + df['title2_zh']
  • 加载停用词

    复制代码
    def load_stopwords(file_path):
        with open(file_path, 'r') as f:
            return [line.strip() for line in f]
    stopwords = load_stopwords('stopwords.txt')
2. 分词与清洗
  • 结巴分词 + 去停用词

    复制代码
    import jieba
    corpus = []
    for text in df['title_zh']:
        words = [word for word in jieba.cut(text) if word not in stopwords]
        corpus.append(words)
3. 特征提取(Word2Vec)
  • 训练词向量

    复制代码
    model = Word2Vec(corpus, vector_size=100, window=5, min_count=1)
  • 文本向量化(词向量求和)

    复制代码
    import numpy as np
    def text_to_vec(words):
        vec = np.zeros(100)
        for word in words:
            if word in model.wv:
                vec += model.wv[word]
        return vec
    X = np.array([text_to_vec(words) for words in corpus])
4. 模型训练与评估
  • 划分数据集

    复制代码
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, df['label'], test_size=0.2)
  • 随机森林分类

    复制代码
    from sklearn.ensemble import RandomForestClassifier
    clf = RandomForestClassifier()
    clf.fit(X_train, y_train)
    print("Accuracy:", clf.score(X_test, y_test))

六、常见问题与优化方向

  1. 分词不准确

    • 添加专业词典(如 jieba.load_userdict())。

    • 调整结巴分词的 HMM 参数(jieba.cut(use_hmm=True))。

  2. 特征提取效果差

    • 使用预训练词向量(如腾讯词向量、Google News 词向量)。

    • 尝试其他文本表示方法(如 BERT 嵌入)。

  3. 模型准确率低

    • 增加数据量或数据增强。

    • 使用更复杂的模型(如 LSTM、Transformer)。


七、参考工具与资源

相关推荐
算法_小学生4 小时前
支持向量机(SVM)完整解析:原理 + 推导 + 核方法 + 实战
算法·机器学习·支持向量机
cwn_4 小时前
自然语言处理NLP (1)
人工智能·深度学习·机器学习·自然语言处理
算法_小学生4 小时前
逻辑回归(Logistic Regression)详解:从原理到实战一站式掌握
算法·机器学习·逻辑回归
karlso7 小时前
深度学习:简介与任务分类总览
人工智能·深度学习·分类
行然梦实7 小时前
粒子群优化算法(Particle Swarm Optimization, PSO) 求解二维 Rastrigin 函数最小值问题
算法·机器学习·数学建模
愚戏师8 小时前
机器学习(重学版)基础篇(概念与评估)
人工智能·机器学习
向左转, 向右走ˉ8 小时前
随机森林算法原理及优缺点
算法·随机森林·机器学习
go54631584659 小时前
基于YOLOP与GAN的图像修复与防御系统设计与实现
人工智能·深度学习·神经网络·机器学习·生成对抗网络·矩阵
SparkX开源AI知识库9 小时前
Langchain4j怎么结合DeepSeek打造本地知识库
机器学习
SHIPKING3939 小时前
【机器学习&深度学习】DeepSpeed框架:高效分布式训练的开源利器
人工智能·深度学习·机器学习