机器学习·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)。


七、参考工具与资源

相关推荐
Wilber的技术分享1 小时前
【机器学习实战笔记 14】集成学习:XGBoost算法(一) 原理简介与快速应用
人工智能·笔记·算法·随机森林·机器学习·集成学习·xgboost
19891 小时前
【零基础学AI】第26讲:循环神经网络(RNN)与LSTM - 文本生成
人工智能·python·rnn·神经网络·机器学习·tensorflow·lstm
JoernLee2 小时前
机器学习算法:支持向量机SVM
人工智能·算法·机器学习
AI街潜水的八角3 小时前
深度学习图像分类数据集—蘑菇识别分类
人工智能·深度学习·分类
IT古董10 小时前
【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(4)模型评价与调整(Model Evaluation & Tuning)
神经网络·机器学习·回归
onceco10 小时前
领域LLM九讲——第5讲 为什么选择OpenManus而不是QwenAgent(附LLM免费api邀请码)
人工智能·python·深度学习·语言模型·自然语言处理·自动化
蓝婷儿14 小时前
Python 机器学习核心入门与实战进阶 Day 3 - 决策树 & 随机森林模型实战
人工智能·python·机器学习
大千AI助手14 小时前
PageRank:互联网的马尔可夫链平衡态
人工智能·机器学习·贝叶斯·mc·pagerank·条件概率·马尔科夫链
我就是全世界15 小时前
TensorRT-LLM:大模型推理加速的核心技术与实践优势
人工智能·机器学习·性能优化·大模型·tensorrt-llm
.30-06Springfield15 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习