中文分词方法

article/2025/9/13 17:52:53

词条化

分词又叫做词条化(tokenlize),指的是将原始的字符流转换成一个一个词条(token)的过程。词条化属于自然语言处理中预处理的一个步骤,它是分析语义的基础。下图是一个词条化的例子。

在这里插入图片描述
在不同的语言中,分词的方法和难点不同。在英语中,词与词之间有空格作为自然分隔符,处理的难点在于大小写代表的不同含义以及符号的用法。比如单词 china 在小写的情况下指的是陶瓷器,而大写的 China 代表中国。大小写的用法在英语中非常常见,包括句首、人名地名、专有名词以及缩略语等,如何正确处理这些大小写等情况是英语词条化的难点之一。另一个比较复杂的情景是上撇号「 ’ 」的用法,它既可以代表所有关系也可以代表缩写。比如说 aren’t 的词条可能会有以下几种结果:

在这里插入图片描述
在处理一些东亚语言如汉语、日语、泰语等时,问题就会复杂很多。在中文里是以字为基本书写单位,词语甚至句子之间都没有明显的区分标记。中文字和词的界限模糊,不同的分词方法可以将语料分解成不同的语义。例如:「南京市长江大桥」可以被分为:

  1. 南京市 \ 长江 \ 大桥
  2. 南京 \ 市长 \ 江大桥

在英语中词的构成单元是字母,而字母的数量有限( 26个 ),可以通过枚举的方式将所有的词加入词典中。常见的人名地名以及专有名词可以在有限的空间内进行存储。

而在中文中,字与字之间排列可以组合出名词的数量过于庞大,无法以词典的方式进行识别。因此,如何识别出人名等不常见的名词也是中文分词的难点。

停用词

在自然语言中,存在一些没有实际含义的虚词,例如汉语中的「了、着、吧、啊」和英语中的「the、that、a」等。还有一些结构助词「的、是、对」和「is、to、on、of」等。

不同的应用场景下,对于这些词的处理方式不相同。训练词向量时,由于这些词没有实际意义,应该作为停用词(stop word)去除,下图是英语中的一种停用词表。

在这里插入图片描述
在构建知识图谱时,结构助词能够表达实体之间关系,比如语句「苹果是一种水果」构建了 「苹果」与「水果」的从属关系。

在信息检索中,这些词通常没有意义,可以作为停用词,并且由于停用词的出现频率很高,停用后能提高检索效率以及准确度。但是在一些查询中,例如 Beatles 乐队的名曲 Let It Be 在去除停用词以后就很难被检索到。因此,在现代搜索引擎中,一般不停用词,而是采用了很多方法避免停用词产生过大开销。

中文分词方法

中文的分词方法一般分为三类:基于字典的分词方法、基于统计的分词方法和机器学习分词方法。

基于词典的分词方法

使用基于词典的分词方法时,需要一个中文词典,将待分词的文本与词典中的词条进行匹配。

正向最大匹配法

输入:字符串 s
过程:
1. 令 i=0,指针 pi 指向 s 的初始位置
2. repeat
3. 		计算当前指针 pi 到字串末端的字数(即未被切分字串的长度) n
4.		令 m=词典中最长单词的字数,如果 n<m, 令 m=n
5.		从当前 pi 起取 m 个汉字作为词 wi
6.		if	wi 在词典中
7.			then	在 wi 后添加一个切分标志,根据 wi 的长度修改指针 pi
8.		else
9.			将 wi 从右端去掉一个字
10. until pi 指向字串末端
输出: 添加切分标志后的字符串 s

最短路径法

在使用最短路径法之前除了需要词典以外,还需要一个词图。词图是一个全联通图,每个顶点代表词典中的一个词,顶点之间的边代表两个词组合的距离,例如「天气」和「好」之间的距离小于「天气」和「大」的之间距离,因为「天气好」这个组合的可能性更高。

在这里插入图片描述

输入:字符串 S = c1c2...cn, 其中 ci 为单个的汉字
过程:
1. 建立一个节点数为 n+1 的切分有向无环图 G,各节点编号为 V0,V1...Vn
2. 在相邻节点Vk,Vk-1之间建立有向边,边长查词图得出为Lk
3. repeat
4. 		if 存在 w = ci...cj (0<i<j<=n) ,并且 w 在词典中
5. 			then 将 w 作为新节点加入图中,与 Vi-1 和 Vj 建立有向边
6. until 没有新的 w 能够加入图中
7. 计算从 V0 到 Vn 的最短路径
输出:依次输出最短路径上的顶点

其中,G 的最短路径求解可以使用 Dijkstra 等方法。

基于统计的分词方法

基于统计的分词方法首先建立学习样本的生成模型,再利用模型对预测结果进行间接推理。

隐马尔可夫模型

首先对分词问题建立隐马尔可夫模型,状态值集合为{B, M, E, S},分别代表字在词语中的不同位置(B,begin 表示词语的起始字;M,middle 表示词语的中间子;E,end 表示词语的结束字;S,single 表示单子成词)。观察值为需要分词的语料。在这个问题中,需要通过观察值求出可能性最大的状态序列,例如:

状态序列:BMEBMBM

观察值:南京市长江大桥

事实上,一个观察值能够对应多种可能的状态序列,就像是「南京市长江大桥」这个语料也有不同的分词解法:

状态序列1:BME \ BM \ BM

状态序列2:BM \ BM \ S \ BM

观察值:南京市长江大桥

如何对一个语料「正确地」分词就取决于如何使我们需要的状态序列的概率最大,这是一个 HMM 的参数估计问题。这里需要确定的参数有初始状态的概率分布 π \pi π ,状态转移概率 a i j a_{ij} aij 和发射概率 b i j b_{ij} bij 。可以使用最大似然估计训练出所需的参数。

训练参数完成后得到了隐马尔可夫模型 μ = ( S , K , A , B , π ) \mu = \left(S, K, A, B, \pi \right ) μ=(S,K,A,B,π) 后,要解决的问题变成了序列问题:给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2OT 和模型 μ = ( A , B , π ) \mu = \left ( A,B,\pi \right ) μ=(A,B,π) ,如何快速有效地选择在一定意义下「最优」的状态序列 Q = q 1 q 2 … q t Q = q_1q_2…q_t Q=q1q2qt ,使得该状态序列「最好地解释」观察序列?

这个问题一般使用 Viterbi 算法求解。

基于语义的分词方法

未完待续

参考资料

  1. 宗成庆.统计自然语言处理(第2版). 统计自然语言处理. 2008.
  2. 李航. 统计学习方法. 2012.

知识共享许可协议
本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。欢迎转载,演绎,但是必须保留本文的链接,不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。


http://chatgpt.dhexx.cn/article/BrH5o5Eg.shtml

相关文章

细说中文分词

完整的中文自然语言处理过程一般包括以下五种中文处理核心技术&#xff1a;分词、词性标注、命名实体识别、依存句法分析、语义分析。其中&#xff0c;分词是中文自然语言处理的基础&#xff0c;搜素引擎、文本挖掘、机器翻译、关键词提取、自动摘要生成等等技术都会用到中文分…

【Grails4+spring security】

Grails4spring security实现单用户登录 描述1、新建项目目录结构如图所示2、打开根目录下的build.gradle文件&#xff0c;dependencies中添加spring-security依赖3、创建用户、角色的domain4、创建登录控制器LoginController5、创建注销控制器 LogoutController6、自定义一个Co…

Grails配置-基本配置-如何覆盖默认配置,在哪里进行自定义配置

文章目录 Grails配置基本配置⎮Grails4风格配置⎮Grails2风格的Groovy配置⎮使用GrailsApplication对象访问配置信息 在控制器中使用grailsApplication对象 能获取到的配置信息有哪些 在业务层中使用grailsApplication对象方式一 在业务层中使用grailsApplication对象方式二…

Grails 的插件开发

警告&#xff1a;本文还未整理&#xff0c;可读性差&#xff0c;还只是草稿 文档 Grails Plugin Develop Document grails-spring-security-core 插件文档 grails-spring-security-rest插件 文档 创建插件 执行命令行 grails create-plugin <<PLUGIN NAME>>即…

Grails配置-启动类配置,数据源配置,连接Mysql数据库

文章目录 Grails配置1. 启动类配置Application.groovy启动类中可以做哪些事情1. 启动Grails应用程序2. 自定义包扫描路径3. 注册bean4. 应用程序生命周期管理 2. 环境配置2.1 默认的多环境配置2.2 预设的环境2.3 打包和运行使用不同的环境2.4 在代码启动过程中判断当前环境2.5 …

java grails mave_Grails 与 Maven 集成

Grails 与 Maven 集成 杨 健 2013 年 9 月 09 日发布 概述 Grails 简介&#xff1a;Grails 是一个开源的 Web 开发框架&#xff0c;它采用动态语言 Groovy 进行开发&#xff0c;并且可以和用 Java 开发的项目进行集成。Grails 充分体现了约定优于配置的原则&#xff0c;将项目的…

Grails4.0.11入门

文章目录 Grails4.0.11介绍相关依赖入门⎮Java环境搭建⎮Grails环境搭建⎮如何创建grails应用⎮如何选择开发工具IDEA如何导入Grails项目 ⎮目录结构&#xff0c;约定优于配置⎮如何部署Grails项目1. 使用默认内嵌的Tomcat8部署2. 使用外部Tomtcat8部署3. 使用外部Tomcat7部署 …

grails java_Grails

十二、Grails 如今的Java Web开发对于需求来说已经变得过于复杂。当今众多Java领域的Web开发框架不仅使用复杂&#xff0c;而且并没有很好的遵循Don’t Repeat Yourself(DRY)原则。像Rails&#xff0c;Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路&#x…

JAVA AIO编程

Asynchronous IO&#xff1a; 异步非阻塞的编程方式 与NIO不同&#xff0c;当进行读写操作时&#xff0c;只须直接调用API的read或write方法即可。这两种方法均为异步的&#xff0c;对于读操作而言&#xff0c;当有流可读取时&#xff0c;操作系统会将可读的流传入read方法的缓…

java aio_Java AIO详解

JDK1.7升级了NIO类库&#xff0c;升级后的NIO类库被称为NIO 2.0。 Java正式提供了异步文件I/O操作&#xff0c;同时提供了与UNIX网络编程事件驱动I/O对应的AIO。 AIO编程 NIO 2.0引入了新的异步通道的概念&#xff0c;并提供了异步文件通道和异步套接字通道的实现。 异步通道获…

Java I/O 模型之 AIO

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;Java 教程&#xff1a;从入门到精通 大家好&#xff0c;我是水滴~~ 文章目录 服务端API创建服务端套接字的异步通道接…

如何用AIO技术提高程序性能

写在前面 这是一篇关于 AIO 的文章。本篇文章详细对比了几个常见的I/O模型&#xff0c;并且介绍了AIO相关的一些API。 我把英文原文翻译过来整理成这篇文章。目的一个是自己学习&#xff0c;一个是方便不习惯看英文资料的同学进行学习。 英文原文地址&#xff1a; https://…

08【AIO编程】

八、AIO编程 8.1 AIO编程简介 8.1.1 AIO编程概述 AIO也叫异步非阻塞&#xff0c;JDK1.7之后的新特性&#xff0c;AIO引入异步通道的概念&#xff0c;采用了 Proactor 模式&#xff0c;简化了程序编写&#xff0c;有效的请求才启动线程&#xff0c;它的特点是先由操作系统完成…

linux aio进程简介,Linux AIO机制

Linux的I/O机制经历了一下几个阶段的演进&#xff1a; 1. 同步阻塞I/O: 用户进程进行I/O操作&#xff0c;一直阻塞到I/O操作完成为止。 2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK&#xff0c;I/O操作可以立即返回&#xff0c;但是并不保证I/O操作成功…

关于aio

AIO 是异步非阻塞 同步意味着&#xff0c;在进行读写操作时&#xff0c;线程需要等待结果&#xff0c;还是相当于闲置 异步意味着&#xff0c;在进行读写操作时&#xff0c;线程不必等待结果&#xff0c;而是将来由操作系统来通过回调方式由另外的线程来获得结果 AIO的read方…

linux AIO

AIO 是 Linux 下的异步读写模型&#xff0c;它是 2.6 内核提供的一个标准增强特性。对于文件的读写&#xff0c;即使以 O_NONBLOCK 方式来打开一个文件&#xff0c;也会处于 “阻塞” 状态&#xff0c;因为文件时时刻刻处于可读状态&#xff0c;而从磁盘到内存所等待的时间是惊…

AIO模型

目录 AIO模型介绍 AsynchronousServerSocketChannel&#xff1a;AIO中网络通信服务端的socket 1、future方法 2、callback回调方式 AIO 的回调方式编程 BIO、NIO、AIO的比较 1、释义 BIO&#xff1a;同步阻塞IO模型 NIO&#xff1a;同步非阻塞IO模型 AIO&#xff1a;…

java中IO模型-AIO模型

AIO模型介绍 AIO&#xff08;Asynchronous I/O&#xff09; 异步非阻塞模型&#xff0c; 在javajdk.17版本开始支持AIO&#xff0c;AIO模型需要操作系统的支持。 AIO最大的特性是异步能力&#xff0c;对socket和I/O起作用。 异步IO模型类似的 与NIO模型不同&#xff0c;读写操…

架构解密从分布式到微服务:深入理解网络,AIO

AIO AIO是I/O模型里一个很高的层次&#xff0c;体现了大道至简的软件美学理念。与NIO相比&#xff0c;AIO的框架和使用方法相对简单很多。 AIO包括两大部分:AIO Files解决了文件的异步处理问题&#xff0c;AIO Sockets解决了Socket的异步处理问题。AIO的核心概念为应用发起非…

BIO,NIO,AIO区别

BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候&#xff0c;不需要关心操作系统层面的知识&#xff0c;也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,…