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


七、参考工具与资源

相关推荐
码蛊仙尊1 小时前
当我们想用GPU(nlp模型篇)
人工智能·自然语言处理
智慧地球(AI·Earth)5 小时前
DeepSeek V3.1 横空出世:重新定义大语言模型的边界与可能
人工智能·语言模型·自然语言处理
金井PRATHAMA5 小时前
语义普遍性与形式化:构建深层语义理解的统一框架
人工智能·自然语言处理·知识图谱
没有梦想的咸鱼185-1037-16638 小时前
AI大模型支持下的:CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析
人工智能·python·深度学习·机器学习·chatgpt·数据挖掘·数据分析
fanzhix13 小时前
线性回归学习
学习·机器学习·线性回归
OAFD.19 小时前
机器学习之线性回归:原理、实现与实践
人工智能·机器学习·线性回归
Gloria_niki1 天前
机器学习之K 均值聚类算法
人工智能·机器学习
codeyanwu1 天前
nanoGPT 部署
python·深度学习·机器学习
Loving_enjoy1 天前
智能合约漏洞检测技术综述:守护区块链世界的“自动售货机”
经验分享·机器学习·课程设计·facebook
失散131 天前
自然语言处理——04 注意力机制
人工智能·自然语言处理·注意力机制·seq2seq 架构