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


七、参考工具与资源

相关推荐
梦丶晓羽6 小时前
自然语言处理:文本分类
人工智能·python·自然语言处理·文本分类·朴素贝叶斯·逻辑斯谛回归
平凡而伟大(心之所向)7 小时前
机器学习的发展史
机器学习
龚大龙7 小时前
机器学习(李宏毅)——Domain Adaptation
人工智能·机器学习
AIGC_ZY7 小时前
扩散模型中三种加入条件的方式:Vanilla Guidance,Classifier Guidance 以及 Classifier-Free Guidance
深度学习·机器学习·计算机视觉
xiangzhihong89 小时前
GitHub神秘组织3小时极速复刻Manus
人工智能·深度学习·机器学习
西京刀客10 小时前
从零开始训练小型语言模型之minimind
人工智能·语言模型·自然语言处理
heine16211 小时前
nlp培训重点-5
人工智能·自然语言处理
夜幕龙12 小时前
深度生成模型(五)——生成对抗网络 GAN
人工智能·深度学习·机器学习·生成对抗网络
AIGCmagic社区13 小时前
DeepSeek专题:DeepSeek-V2核心知识点速览
人工智能·机器学习·aigc