分词算法介绍

article/2025/9/22 22:57:55

===============================================================================

如有需要可以转载,但转载请注明出处,并保留这一块信息,谢谢合作!

部分内容参考互联网,如有异议,请跟我联系!

作者:刀剑笑(Blog:http://blog.csdn.net/jyz3051)

Email:jyz3051 at yahoo dot com dot cn('at'请替换成'@','dot'请替换成'.' )

===============================================================================

 

关键词:中文分词,分词语言模型

 

到目前为止,中文分词包括三种方法:1)基于字符串匹配的分词;2)基于理解的分词;3)基于统计的分词。到目前为止,还无法证明哪一种方法更准确,每种方法都有自己的利弊,有强项也有致命弱点。

综合这几种方法,建立一种"复方配剂"可能是一种有效的解决方案,我采用的方案需要能够综合运用这三类方法。方案的基础就是分词模型,该模型需要能够综合这三种方法,下面我将介绍我的"基于字符的中文分词模型"。

中文分词就是将连续的汉字字符系列拆分成一系列有意义中文词语的过程。下面给出模型中的各种表示:

(1)分词的基本单元是文档,记作D;

(2)待分词的文档通过分隔符,将该文档D分拆为一系列的字符串。将文档拆分为字符串的标志包括:

① 标点符号,如句号、逗号、顿号、引号、感叹号、书名号、破折号、省略号等;

② 分隔符,如分页符、分节符、段落符等;

③ 一些特征词,如"的、和、与"等,但是这种方法常常会导致错误,故很多分词系统都不采取这种策略;

(3)待分词的字符串S有n个字符组成,这里的字符可以是汉字,也可以是英文字母、数字、下划线、连字符等各种符号,每个字符用si表示,则S={s1s2s3s4s5s6s7s8s9……sn}。如待分词字符串为:"他购买了一盒Esselte品牌的SHA-PA型号24/6的订书钉"则s1="他",s2="购"……s32="钉",n=32,表示该字符串有32个字符。

(4)原子系列,将字符串系列进行初步处理,得到S的原子系列A={a1a2a3a4……am}(m<=n),其中原子ai表示一个或多个连续字符的组合,即ai=sj…sk。每个原子被认为是在中文分词环境下,不能再分的字符组合,如一个汉字、一个英文单词、连字符连接的两个字母、英语缩写等等。如"他购买了一盒Esselte品牌的SHA-PA型号24/6的订书钉"的原子系列为:"他#购#买#了#一#盒#Esselte#品#牌#的#SHA-PA#型#号#24/6#的#订#书#钉",m=18,表示有18个原子。将字符串分隔为原子系列的规则常常为:

① 一个汉字为一个原子;

② 一个英语单词为一个原子;

③ 连字符连接的两个英文字符串为一个原子;

④ 无空格的连续英文字符串为一个原子。

以上的四个过程是借助中科院的分词系统中采用的方法,我只不过规范化了该过程而已。到此为止,一个待分词的字符串S已经变成了多个原子的组合,即S=A1A2……Am,下面就进入了一个新的过程:如何将这些原子组合成正确的词语系列W={w1w2w3……wk},(其中k<=m)。即:A1A2……Am到w1w2w3……wk转换的过程,为了保证分词的准确性,在这一过程需要综合以上三种分词算法的思想。

首先,借鉴中科院分词系统的思路,首先在原子系列前后分别加上"起始"和"结尾"标志,这里假设"起始"标志为"S##S","结尾"标志为"E##E",则得到新的原子系列为:

S##SA1A2……Am E##E

则"S##S"的位置是0A1的位置是1,依次类推,Am的位置是m,"E##E"的位置是m+1

如借用别人的例子:"李胜利说的确实在理",原子系列为:"李////////理",故加上"起始"、"结束"标记后变成"S##S////////// E##E"。

中文分词需要将这个原子系列进行一系列的合并操作,最终得到一系列的中文词语。当然,一个原子系列常常能得到多种分词结果,我们希望得到最可能的一种分词系列,即:如果假设我们最终得到的分词为W*,则可以表示为maxP(W|A),其中P(W|A)表示原子系列A得到词语系列W的可能性。上面的说明也可以通过下面的过程加以说明:

P(W|A) = P(WA)/P(A) = P(A|W)*P(W)/P(A)

因为在词语系列W的情况下,获得原子系列A的概率是1,则上式可以变换成:

P(W|A) = P(WA)/P(A) = P(W)/P(A),故:W* = max P(W)/P(A) = max P(w1w2w3……wk)/P(A)

从上面的过程可以发现,W*是所有可能分词中最有可能的一种。如果我们穷举所有的分词可能,然后计算每种分词的可能性,计算量将是非常巨大的,故常常将求W*的过程看作是一个动态规划的问题。下面我以上面的例子"S##S////////// E##E"来构建这个动态规划问题,即在从"S##S"到"E##E"的所有路径中,寻找一条路径,使该路径出现的可能性是所有路径中有最大可能性。这就包括两项任务:

找出所有可能的从"S##S"到"E##E"的路径;

找出所有路径中,有最大可能出现的路径;

对于①,至少要保证最优的那条路径存在于该路径集合中,故在这一步我们需要为该原子系列串增加尽可能多的路径才行,当然也要考虑计算量,尽量减少那些可能性小的路径。

对于②,首先我们要定义什么才叫最优路径,并建立一个动态规划方程,求解该方程,得到最终的分词系列。

如"S##S////////// E##E"得到如下的路径图:

从上图可以看出,这些路径中不存在正确的路径,即最优路径并不在这个路径集合中,故无法得到我们最后需要的路径,这里就涉及到未登录词识别的问题,这个问题将在后面的文章中讨论。

 

 

===============================================================================

如有需要可以转载,但转载请注明出处,并保留这一块信息,谢谢合作!

部分内容参考互联网,如有异议,请跟我联系!

作者:刀剑笑(Blog:http://blog.csdn.net/jyz3051)

Email:jyz3051 at yahoo dot com dot cn('at'请替换成'@','dot'请替换成'.' )

===============================================================================

 

关键词:中文分词,中文分词语言模型,动态规划

 

前面的文章中(详细请参见"中文分词的语言模型"),我们给出了能够融合三种分词算法的语言模型,该模型能够融合目前出现的所有三种分词算法,并将该语言模型用一个统一的概率模型表示出来:给出原子系列,最有可能出现的中文词语系列就是我们需要的最终分词结果,可表示如下:

W* = max P(W)/P(A) = max P(w1w2w3……wk)/P(A)

最后,我们给出了求解该模型的网络示意,中文分词就成为求解最大概率的路径,中文分词过程就变成了以下的两个过程:

① 找出所有可能的从"S##S"到"E##E"的路径;

② 找出所有路径中,有最大可能出现的路径;

下面我将这种介绍如何建立动态规划模型。

最优路径指从"S##S"到"E##E"最有可能出现的词语系列,这包括两个方面的问题:1)这些词语同时出现的概率,同时出现的概率越大,则该系列越有可能;2)这些词语以这个顺序出现的概率,以这个顺序出现的概率越大,则该系列越有可能;这中间还有一个隐含的问题没有揭露出来,即假设这些组合(原子或词语)就是所有的可能,所以并没有涉及到未登录词识别的问题。因为我要建立一个统一的分词框架,故应该还包括第三个问题:3)这些词语(或原子)出现的概率,词语(或原子)出现的可能性越大,则越有可能出现,成为最优路径。当然问题1)和问题2)可以合并,从而得到以下的两个问题:

  1. 这些词语(或原子)本身出现的概率多大;
  2. 这些词语(或原子)以这个顺序同时出现的概率多大;

两者综合的概率越大,则越有可能形成这个系列,从而越有可能成为我们的最优分词结果。

综合这两个问题,某个路径L出现的概率可以表示为:

P(L) = P(w2|w1)P(w3|w1w2) P(w4|w1w2w3) ……P(wk|w1w2w3…w(k-1))

*P(w1) P(w2) P(w3)…… P(wk)

如路径L1"李/胜利/说/的/确实/在理/ E##E"中,词语系列W={李,胜利,说,的,确实,在理},则这条路径出现的概率可以表示为:

P(L1) = P(胜利|李) * P(说|李胜利) * P(的|李胜利说) * P(确实|李胜利说的)

* P(在理|李胜利说的确实)

* P(李) P(胜利) P(说) P(的) P(确实) P(在理)

此时,需要得到各个词语的概率P(W),以及"李胜利"、"李胜利说"、"李胜利说的"、"李胜利说的确实"的概率。在实际应用系统中,前一种概率完全是可以穷举得到的,就是词典中词语出现的概率,而后一种字符串是无穷无尽的,全部计算它们的概率是几乎不可能的,故在实际应用中常常进行简化,即只认为后一个词语wi+1仅仅与前面一个词语wi相关,仅仅受wi的影响,而不受wi-1、wi-2、……w1等的影响,实践证明这种方法是一种很有效的方法。

在这个假设下,路径L的概率计算公式为:

P(L) = P(w2|w1) * P(w3|w2) * P(w4|w3) *……* P(wk|w(k-1))

*P(w1) * P(w2) * P(w3)…… * P(wk)

结合上面出现的"动态规划路径图"可以看出,p(wi|wi-1)表示在前一个词出现的情况下,后一个词出现的概率,即图形中"边"的权重,而P(wi)则表示某个词语出现的概率,即图中"结点"的权重。

此时,可以得到一个标注权重的"动态规划路径图",示意图如下:

经过这个转换之后,我们就把中文分词过程(找出最大概率的词语系列)转换成了寻找一条从"S##S"到"E##E"最大可能路径的问题,很明显这是一个动态规划问题。其中:

(1)    结点上的权重表示该结点出现的可能性;

(2)    边上的权重表示两个“结点”按照该顺序出现的可能性;


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

相关文章

为什么中文分词比英文分词更难?有哪些常用算法?(附代码)

导读&#xff1a;人类文明的重要标志之一是语言文字的诞生。数千年来&#xff0c;几乎人类所有知识的传播都是以语言和文字作为媒介。 自然语言处理是使用计算机科学与人工智能技术分析和理解人类语言的一门学科。在人工智能的诸多范畴中&#xff0c;自然语言的理解以其复杂性、…

中文分词工具讨论

中文分词工具讨论 1 中文分词原理介绍 1.1 中文分词概述 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。 1.2 中文分词方法介绍 现有的分词方法可分为三大类&#xff1…

几种中文分词工具

word分词 word分词是一个Java实现的分布式的中文分词组件&#xff0c;提供了多种基于词典的分词算法&#xff0c;并利用ngram模型来消除歧义。能准确识别英文、数字&#xff0c;以及日期、时间等数量词&#xff0c;能识别人名、地名、组织机构名等未登录词。能通过自定义配置文…

NLP词法分析(一):中文分词技术

文分词介绍 中文分词相较于英文分词要难许多&#xff0c;因为英文本身就是由单词与空格组成的&#xff0c;而中文则是由独立的字组成的&#xff0c;但同时语义却是有词来表达的。因此对于中文的分析与研究&#xff0c;首先应寻找合适的方法进行分词。现有的中文分词技术主要分…

双向最大匹配算法——基于词典规则的中文分词(Java实现)

目录 前言 一、中文分词理论描述 二、算法描述 1、正向最大匹配算法 2、反向最大匹配算法 3、双剑合璧 三、案例描述 四、JAVA实现完整代码 五、组装UI 六、总结 前言 中文分词所需要的词典放在公众号&#xff0c;关注文章末尾的公众号&#xff0c;回复“字典”获取…

中文分词技术及应用

中文分词技术及应用中文分词算法有5大类&#xff1a; 1、 基于词典的方法 2、基于统计的方法 3、基于规则的方法 4、基于字标注的方法 5、基于人工智能的技术&#xff08;基于理解&#xff09;的方法 中文分词目前有4个瓶颈&#xff1a; 1、分词歧义 2、未登陆词识别 3、分词粒…

【NLP】为什么中文分词比英文分词更难?有哪些常用算法?(附代码)

导读&#xff1a;人类文明的重要标志之一是语言文字的诞生。数千年来&#xff0c;几乎人类所有知识的传播都是以语言和文字作为媒介。 自然语言处理是使用计算机科学与人工智能技术分析和理解人类语言的一门学科。在人工智能的诸多范畴中&#xff0c;自然语言的理解以其复杂性、…

正向最大匹配中文分词算法

中文分词一直都是中文自然语言处理领域的基础研究。目前&#xff0c;网络上流行的很多中文分词软件都可以在付出较少的代价的同时&#xff0c;具备较高的正确率。而且不少中文分词软件支持Lucene扩展。但不管实现如何&#xff0c;目前而言的分词系统绝大多数都是基于中文词典的…

NLP|中文分词技术及应用

摘要:中文分词是中文信息处理的重要基础,本文详细阐述了目前主要的几种中文分词算法的技术原理 、中文分词目前的瓶颈和评价准则,以及中文分词的具体应用。 中文分词指将一个汉字序列切分成一个个单独的词。现有的中文分词算法有五大类:基于词典的方法,基于统计的方法,基…

入门科普:一文看懂NLP和中文分词算法(附代码举例)

导读&#xff1a;在人类社会中&#xff0c;语言扮演着重要的角色&#xff0c;语言是人类区别于其他动物的根本标志&#xff0c;没有语言&#xff0c;人类的思维无从谈起&#xff0c;沟通交流更是无源之水。 所谓“自然”乃是寓意自然进化形成&#xff0c;是为了区分一些人造语言…

中文分词算法—— 基于词典的方法

1、基于词典的方法&#xff08;字符串匹配&#xff0c;机械分词方法&#xff09; 定义:按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配&#xff0c;若在词典中找到某个字符串&#xff0c;则匹配成功。 按照扫描方向的不同&#xff1a;正向匹配和逆向匹配…

【NLP】中文分词:原理及分词算法

一、中文分词 词是最小的能够独立活动的有意义的语言成分&#xff0c;英文单词之间是以空格作为自然分界符的&#xff0c;而汉语是以字为基本的书写单位&#xff0c;词语之间没有明显的区分标记&#xff0c;因此&#xff0c;中文词语分析是中文信息处理的基础与关键。 Lucene中…

常见分词算法综述

常见分词算法综述 文章目录 常见分词算法综述一、基于词典的分词1. 最大匹配分词算法2. 最短路径分词算法&#xff1a;2.1基于dijkstra算法求最短路径&#xff1a;2.2N-dijkstra算法求最短路径&#xff1a;2.3. 基于n-gram model的分词算法&#xff1a; 二、基于字的分词算法生…

中文分词原理及分词工具介绍

转自&#xff1a;https://blog.csdn.net/flysky1991/article/details/73948971 本文首先介绍下中文分词的基本原理&#xff0c;然后介绍下国内比较流行的中文分词工具&#xff0c;如jieba、SnowNLP、THULAC、NLPIR&#xff0c;上述分词工具都已经在github上开源&#xff0c;后…

中文分词常见方法

中文分词是中文文本处理的一个基础步骤&#xff0c;也是中文人机自然语言交互的基础模块。不同于英文的是&#xff0c;中文句子中没有词的界限&#xff0c;因此在进行中文自然语言处理时&#xff0c;通常需要先进行分词&#xff0c;分词效果将直接影响词性、句法树等模块的效果…

自然语言处理之中文分词技术与算法

1 正向最大匹配法 1.1 正向最大匹配&#xff08;Maximum Match Method, MM法&#xff09;的基本思想&#xff1a; 假定分词词典中的最长词有i个汉字字符&#xff0c;则用被处理文档的当前字串中的前i个字作为匹配字段&#xff0c;查找字典。若字典中存在这样的一个i字词&#…

列举:中文分词算法你知道几种?

列举&#xff1a;中文分词算法你知道几种&#xff1f; 摘要&#xff1a;看似普通的一句话&#xff0c;甚至几个词&#xff0c;在机器眼里都要经过好几道“程序”。这个过程主要靠中文分词算法&#xff0c;这个算法分为三大类&#xff1a;机械分词算法、基于n元语法的分词算法、…

(转)Linux下管道的原理

7.1.1 Linux管道的实现机制 在Linux中&#xff0c;管道是一种使用非常频繁的通信机制。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同&#xff0c;管道可以克服使用文件进行通信的两个问题&#xff0c;具体表现为&#xff1a; 限制管…

Linux之进程间通信——管道

文章目录 前言一、进程间通信1.概念2.目的3.进程间通信分类 二、管道1.管道介绍2.管道分类1.匿名管道pipi创建管道文件&#xff0c;打开读写端fork子进程关闭父进程的写入端&#xff0c;关闭子进程的读取端读写特征管道特征 2.命名管道mkfifo创建管道文件删除管道文件通信 三、…

Linux系统中的管道通信

目录 管道如何通信 管道的访问控制机制&#xff1a; 匿名管道 匿名管道数据传输的原理 如何使用&#xff08;代码案例&#xff09; 用C/C代码编译实现父子进程间通信案例 &#xff1a; 思路 实现 命名管道 为什么要有命名管道 回归进程间通信的本质 匿名管道的短板…