作者:Sunny from Hour41 (www.hour41.com )
这几天因为要负责新的搜索系统中的分词,所以看了一些入门级的分词算法。其中主要是机械分词方法,趁这个机会总结下。
机械分词方法又叫基于字符串匹配的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行区配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小)。
这几种分词方法的基本原理相同, 1和2基本上只是一个方向的区别,而由于我们习惯都是正向的来理解句子,所以反向分词的匹配的错误率会稍小。据网上的统计数据表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但有时候正向分出的结果却比反向更优,所以通过需要通过计算总的概率来选择最优的分词结果:
比如: 中国是世界上5个常任理事国之一
反向: 中/国是/世界/上/5/个/常任/理事国/之一/
正向: 中国/是/世界/上/5/个/常任/理事国/之一/
方法3就是在在前两种方法的结果基础上用统计方法找出切出词最小的匹配方法。
下面我们来看看一个机械分词算法的基本实现。首先,需要有一个词库。用来在其中对搜索串中可能为词的子串进行一个搜索,如果找到则表明是一个词。让计算机能够按照语言习惯进行切分,往往需要机器有一个比较丰富的词库才能够比较准确的识别出语句中的单词。理论上来说,词库越大越好。但由于考虑到加载后的速度问题,一般的词库都保持在几十万字的水平。一般应用中词库都是预先加载至内存中。下面是我看到的几种常见的字典加载的方法(当然词库的建法都是与后面的具体算法对应的):
l )直接建一个链表(LinkedList)加载,可用于二分查找匹配。
2)对字典建一个哈希表(HashTable)或键值对(Map),可以建立首字哈希搜索,也可以加入权重值进行搜索时的权重控制。还可以用值来标明匹配时目前的匹配是否有“潜力”成为一个词。
3)树形字典: 树的每个节点包含一个字. 比方 中国 中国人 中华民族 中华人民共和国 几个词,构成的树的结构:
中
国^ 华
人^ 人 民
民 族^
共
和
国^
树中结点标明匹配到这一点是否已经成词,否则说明继续往下(添加输入字)才可成词。
4)将字典构造为一个对象后,将其序列化再写入文件,直接将字典作为一个对象来进行操作。
加载了词库后,主要的算法步骤如下(正向最大匹配):
1, 待处理的短语为S;
2, 测试S.substring(0,k)是否是词语,如果是,保存其长度max=k。否则将k加1后继续在字典中匹配,重复此步骤。这里k为2到字典的词语的最大长度。
3, 得到一个最大词语,长为max。
4, 返回2,继续处理S = S.substring(max),即余下的字符。
反向匹配与此类似, 如下(最大匹配):
1, 得到搜索串中的一个子串S(0,k);
2, 测试S.substring(0,k)是否是词语,如果是,保存其长度max=k。否则继续在字典中匹配S.substring(1,k),重复此步骤。这里k为2到字典的词语的最大长度。
3, 得到一个最大词语,长为max。
4, 如果max=k,返回1以取得新的子串进行匹配;否则返回2,继续处理S = S.substring(0,k-max),即余下的字符。
实际应用中,这种算法的精度还远远不能满足需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。公司文档中提出的一种办法是增加辅助切分词语。这些词语并不是词语,它们是词语组合。它们来辅助的进行词语切分。比如,对于短语“吃面的地方”来说,当后向切词的时候,它会被切分为:吃、面的、地方。显然这是不对的。所以,可以增加一个辅助切词短语:“吃面的”,这个短语固定切分为:吃面、的。当发现某些短语切分不准确的时候,可以通过增加辅助切词词语来修正切分。当然这就需要一个额外的辅助切词短语的短语库,网上有没有现成的我还没有找过。
下面是一些网上找到的具体算法实现:
Ø http://www.iteye.com/topic/58701
Ø http://sourceforge.net/projects/wordsegment/
Ø http://www.solol.org/technologic/java/j-lucene2/index.html#top
Ø http://www.iteye.com/topic/59121
相关推荐
4. 支持语句或文章转拼音,使用分词算法解决多音字问题。 5. 词库借用python-pinyin词库,非常丰富。 6. 支持中文分词。 关于词库,实际上还是比python-pinyin少了不少。 这是因为java作为历史悠久的语言,char是双...
4. 中文文本处理:包括分词、词频统计、词云生成,以及文本情感分析和主题模型。 5. 深度学习(有条件的情况下):介绍基本概念、原理和PyTorch实践。 **教学目标** - 掌握Python编程基础和生态系统包的应用。 - ...
- **详细内容**:文章介绍了使用Python进行中文分词、关键词提取、情感分析等自然语言处理任务的方法,并列举了一些常用的第三方库资源,为中文信息处理提供了实用指南。 #### Python与JavaScript语言的区别 - **...
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
wrf转mp4播放器1.1.1
内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。
国网台区终端最新规范
《基于YOLOv8的智慧农业水肥一体化控制系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
GSDML-V2.33-LEUZE-AMS3048i-20170622.xml
微信小程序项目课程设计,包含LW+ppt
微信小程序项目课程设计,包含LW+ppt
终端运行进度条脚本
幼儿园预防肺结核教育培训课件资料
python,python相关资源
《基于YOLOv8的智慧校园电动车充电桩状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
deepseek 临床之理性软肋.pdf
SM2258XT量产工具(包含16种程序),固态硬盘量产工具使用
RecyclerView.zip
水务大脑让水务运营更智能(23页)
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。