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


七、参考工具与资源

相关推荐
田里的水稻2 小时前
RL_强化学习概述---具身机器人
人工智能·深度学习·神经网络·机器学习
KKKlucifer2 小时前
国内数据分类分级平台的路线分化与落地边界
大数据·人工智能·分类
Joecien2 小时前
大模型做分类的第三条路:百炼决策模型实测,46ms 一次前向出概率,阈值标定是接入前提
人工智能·分类·数据挖掘
larance2 小时前
机器学习的数据分片
人工智能·机器学习
Evanfu02162 小时前
AI 短剧出海前要检查哪些版权、肖像和声音权利?
自然语言处理·aigc·音视频·视频·机器翻译·自动翻译
Q26433650232 小时前
【有源码】基于K-Means算法的航空客户行为分群及异常预订识别研究-基于大数据的航空客户预订行为多维分析与可视化大屏设计
大数据·人工智能·机器学习·数据挖掘·数据分析·spark·kmeans
allnlei3 小时前
线性回归(Linear Regression)
机器学习·回归·线性回归
张继雁3 小时前
30~50MPa数控高压清洗:前端分级过滤逻辑,抑制硬质磨粒对喷嘴冲蚀
大数据·数据库·人工智能·机器学习·创业创新
小蒋观天下4 小时前
【安防AI工程实战二】AI摄像头帧率抖动根治:ISP曝光时序与AI推理时序冲突深度定位
人工智能·深度学习·算法·安全·机器学习·ai大模型
鼓掌MVP4 小时前
决定全案的智能Agent
大数据·人工智能·机器学习