自然语言处理(5)—— 中文分词

embedded/2025/4/1 3:59:20/

中文分词的基本原理及实现

    • 1. 什么是词
    • 2. 基本原理
    • 3. 发展趋势:多数场景无需显式分词

信息处理的目标是使用计算机能够理解和产生自然语言。而自然语言理解和产生的前提是对语言能够做出全面的解析。

汉语词汇是语言中能够独立运用的最小的语言单位,是语言中的原子结构。由于中文缺乏类似英文的空格分隔,分词的准确性直接影响后续任务(如机器翻译、情感分析)的效果。因此,对中文进行分词就显得至关重要。

中文分词(Chinese Word Segmentation)是自然语言处理的基础任务,旨在将连续的中文字符序列切分成具有独立语义的词语。

以下从基本原理、主流方法、实现工具及挑战展开介绍。


1. 什么是词

古往今来,汉字虽然有5万多个,但常用的汉字大约仅有6000个。即便如此,其中很多汉字在日常生活中较少用到。然而,这些有限的汉字足以维持词汇的长期更新,因为扩大中文词汇的方法是通过构造汉字的复合新词,而不是创造新的字符来完成的。这就造成了汉语中所谓的词和短语之间没有明确的界限。

这可能也就是中国的一些语法学家认为,中文没有词语而只有汉字的原因,并创造了一个术语–“字短语”来代替传统的词汇。董振东就认为:“‘词或字符’的争论源于他们都急于给中国语言一个硬规范的共同基础。遗憾的是,中文不是那么明确的或硬的,它是软的。我们必须认识到其‘柔软度’”。

除构词法的原因之外,人们还因为自身的方言、受教育程度、亚文化等差异因素,对词汇的认识也不同。这些事实都成为制定统一的汉语分词标准的障碍。但是对于计算机系统而言,同一种语言应使用统一的规范来划分词汇,否则,很难想象在多重标准下的词汇系统能够计算出相同的语义结果。

随着 NLP的大规模应用,计算语言学界逐渐统一了汉语词汇的标准。
《信息处理用现代汉语分词规范》关于汉语词的定义给出了如下说明:汉语信息处理使用的、具有确定的语义或语法功能的基本单位

2. 基本原理

中文分词的实现依赖于三大类方法:

(1)基于规则(词典)的分词方法

  • 核心思想:通过预定义的词典匹配文本中的词条,优先匹配最长词。
  • 典型算法
    • 正向最大匹配(FMM):从左到右逐字扫描,优先匹配最长词(如“北京大学”优先于“北京”)。
    • 逆向最大匹配(BMM):从右到左扫描,适用于处理后缀歧义(如“为人民办公益”可能误分为“为人/民办/公益”)。
    • 双向最大匹配:结合FMM和BMM,若结果一致则采纳,否则按最小词数或上下文调整。
  • 特点:速度快、实现简单,但依赖词典质量,无法处理未登录词和新词。

(2)基于统计的分词方法

  • 核心思想:利用大规模语料训练语言模型,通过概率选择最优分词路径。
  • 典型模型
    • N-gram语言模型:计算词序列联合概率,例如“南京市长江大桥”的切分路径通过Bigram或Trigram概率比较。
    • 隐马尔可夫模型(HMM):将分词转化为序列标注问题(BEMS:词首/中/尾/单字),如“北京/大学”标注为“B-E B-E”。
    • 条件随机场(CRF):相比HMM,考虑全局特征,标注更精准。
  • 特点:能处理未登录词和歧义,但需大量标注数据。

(3)基于深度学习的分词方法

  • 核心思想:通过神经网络自动学习上下文特征,端到端输出分词结果。
  • 典型模型
    • BiLSTM-CRF:双向LSTM捕捉上下文,CRF优化标签序列。
    • Transformer:自注意力机制处理长距离依赖,如《Multi-Criteria Chinese Word Segmentation with Transformer》。
    • 预训练模型(如BERT):直接以字符为单位建模,无需显式分词(如“陈敬雷分布式机器学习实战”整体处理)。
  • 特点:准确率高,但依赖算力和数据量,模型复杂度高。

实现工具与案例

  1. 主流工具

    • jieba:基于HMM和前缀词典,支持精确模式、全模式和搜索引擎模式。
      • 原理:构建前缀词典生成DAG(有向无环图),动态规划选择最大概率路径。
      • 示例:“研究生物”可能切分为“研究生/物”(HMM纠正为“研究/生物”)。
    • HanLP:集成词典与统计模型,支持多任务(如词性标注、NER)。
    • THULAC:清华大学开源工具,结合CRF和深度学习。
  2. 代码实现(以jieba为例)

    import jieba
    # 精确模式
    seg_list = jieba.cut("南京市长江大桥", cut_all=False)
    print("/".join(seg_list))  # 南京/市/长江大桥
    # 搜索引擎模式
    seg_search = jieba.cut_for_search("陈敬雷分布式机器学习实战")
    print("/".join(seg_search))  # 陈敬雷/分布式/机器/学习/实战/分布式机器学习/机器学习
    

3. 发展趋势:多数场景无需显式分词

  • 预训练模型的突破
    BERT、GPT等模型直接以字符或子词(如WordPiece)为输入,通过上下文隐式学习词边界和语义组合。例如“机器学习”无需提前切分,模型能自动关联“机”与“器”、“学”与“习”形成整体语义。
  • 实验证据
    ACL 2019论文在语言模型、机器翻译等任务中验证,字符级模型效果优于词级模型。原因包括:
    • 数据稀疏性:词级模型面临低频词和OOV问题(如CTB数据集中约40%的词出现≤4次)。
    • 噪声传递:分词工具误差(如“南京市长江大桥”误切为“南京/市长/江大桥”)会损害模型性能。

无需分词的典型场景

场景原因
预训练语言模型直接处理字符或子词,通过自注意力机制学习长距离依赖和词组合规律。
文本分类/情感分析字符级CNN或Transformer能捕捉局部语义,如“好评”和“差评”无需依赖词边界。
机器翻译字符级输入减少OOV问题,如“Transformer”作为未登录词可通过子词拆分处理。

仍需分词的特定场景

场景原因
依赖词结构的任务如词性标注、句法分析,传统方法需显式分词定义词单位(但部分预训练模型已内化此类能力)。
信息检索(IR)若查询与文档使用相同分词规则,可提升召回率(如“机器学习”切分为“机器/学习”匹配更多结果)。
小数据场景数据量不足时,分词可提供词级特征辅助模型(如“苹果公司”作为整体提升实体识别准确率)。

深度学习模型并非完全不需要分词,但显式分词的场景已大幅减少

未来随着模型对细粒度语义的理解加深,分词的“中间层”角色将进一步弱化,但作为医疗、法律等专业领域知识载体仍具实用价值。


http://www.ppmy.cn/embedded/176244.html

相关文章

OpenSSL 3.0.2 报 dh key too small 的问题

问题复现 运行命令 curl 访问一个 https 网站,可能会出现 "dh key too small" 的问题。 > curl -v --insecure https://some_web_site * Trying 175.21.4.7:443... * Connected to some_web_site (175.21.4.7) port 443 (#0) * ALPN: offers h2,…

深度学习与计算机视觉方向

一、数学基础 模块具体内容应用场景示例学习资源推荐线性代数- 矩阵乘法、转置、逆矩阵 - 特征值/特征向量(PCA降维) - 张量(Tensor)基础PyTorch 张量操作、模型参数存储《线性代数应该这样学》、3Blue1Brown 视频微积分- 导数与偏…

【免费】2000-2019年各省地方财政城镇土地使用税数据

2000-2019年各省地方财政城镇土地使用税数据 1、时间:2000-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政城镇土地使用税 4、范围:31省 5、指标说明:城镇土地使用税是中国地方…

从零开始使用 Ansible 自动化部署 SpringBoot Web 应用(含 MySQL、Redis、Vue、Nginx)

文章目录 1. 安装 Ansible2. 创建 Ansible Playbook3. MySQL 自动化部署4. Redis 自动化部署5. Spring Boot 后端部署6. Vue 前端部署7. Nginx 配置8. 运行 Ansible Playbook9. 验证部署10. 总结 本教程使用 Ansible 实现全栈应用的自动化部署,包括: 后…

MySQL 字符集

目录 字符集的基本概念 常见MySQL字符集 ascii(单字节字符集) latin1(单字节字符集) utf8(多字节字符集) utf8mb4(多字节字符集) MySQL默认字符集 MySQL字符集的层次级别 服务器级别 数据库级别 表级别 列级别 连接字符集 字符集是计算机科学中的一个重要概念&…

STM32八股【3】------RAM和片上FLASH

1、RAM和FLASH构成 1.RAM ┌──────────────────────────┐ │ 栈区 (Stack) │ ← 从RAM顶端向下扩展(存储局部变量、函数调用信息) │--------------------------│ │ 堆区 (Heap) │ ← …

python爬虫可能遇到的小bug

一、正确代码展示: 由图可知,下面代码是没有任何问题的 二、错误代码展示: 下图和上面图片几乎一摸一样的,但运行出来就是空列表 三、原因分析: headers后面的字典写错了,User-Agent写成了User_Agent 记住,像这种headers字典里面的就是 User-Agent 细心一点 不要写错了 不…

Java爬虫抓取B站视频信息

依赖 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.17.2</version> <!-- 最新版可去官网查看 --></dependency>编码 public static List<VideoDto> parseSearchPage(Str…