首页 技术 正文
技术 2022年11月10日
0 收藏 547 点赞 4,503 浏览 3054 个字

不同分词工具原理解析

对各种分词工具的介绍,具体参考:

http://www.cnblogs.com/en-heng/p/6234006.html

1) jieba

具体参考:

https://blog.csdn.net/rav009/article/details/12196623

jieba分词原理解析

采用的是Unigram + HMM,Unigram假设每个词相互独立

具体参考:

http://www.cnblogs.com/en-heng/p/6234006.html

先总结一下jieba的分词方法

先加载词典(包括自定义词典和自带的词典)生成字典树,对于待分词的句子先通过查字典树,对于那些在字典中出现了的词以此为基础构成一个DAG(有向无环图),具体是通过python中的字典表示的,字典的key是可能成词的词的词首在句子中的脚标,value是一个list,list中的每个值代表以key为词首所有可能组成的词的词尾在句子中的脚标。对于这些路径通过动态规划把求解概率最大问题转换为图论中的求最大路径问题,图中边的权重是词的词频的log值。

对于那些没有出现在字典中的词,把他们重新组成片段利用HMM模型进行分词,注意最后的解码过程中jieba对维特比算法进行了约束。

对于用HMM进行分词具体参考:

http://www.cnblogs.com/en-heng/p/6164145.html

Jieba用的是BEMS四标签格式分别表示词的开始、结束、中间(begin、end、middle)及字符独立成词(single),标签越多或许会更准确,但是会使训练速度更慢。

对于HMM发现新词总共是3个概率值的问题,这是作者基于一个大型语料提前训练出来的,词的初始概率可能就是每个词的频率,那么转移概率和生成概率也是通过一个大型语料训练出来的(这是学习问题)。语料包括:来源主要有两个,一个是网上能下载到的1998人民日报的切分语料还有一个msr的切分语料。另一个是我自己收集的一些txt小说,用ictclas把他们切分。

主题jieba在使用HMM模型进行分词时对维特比算法进行了如下修改

为了适配中文分词任务,Jieba对Viterbi算法做了如下的修改:状态转移时应满足PrevStatus条件,即状态B的前一状态只能是E或者S,…最后一个状态只能是E或者S,表示词的结尾。

1) Foolnltk

1. 自定义词典的加载

import fool
fool.load_userdict(‘dict/aa.txt’)

注意:aa.txt必须是GBK编码的,其次每个词要有一个大于1的权重值:

它是基于字特征+BI-LSTM+CRF进行分词的

3)哈工大的ltp

以微博为训练语料

以结构化感知器(Structured Perceptron, SP)方法来进行分词,它也是用于处理序列标注问题。

LTP用户词典:官方补充说“LTP的分词模块并非采用词典匹配的策略,外部词典以特征方式(转换为特征:是词典词汇的开头、是词典词汇的中间部分、是词典词汇的结尾)加入机器学习算法,并不能保证所有的词都是按照词典里的方式进行切分”。

结构化感知器与CRF以及感知器的区别

具体参考:

https://www.zhihu.com/question/51872633

结构化感知器和crf的最大差别在哪里?感觉crf的模版也可以用到结构化感知器上面

Perceptron(感知器)和CRF主要的区别是优化目标不同,CRF优化对数似然函数,是一个概率模型,因此需要计算partition function(配分函数),计算代价较高。而Perceptron优化正确答案与预测结果得分之间的差异(SP以最大熵准则建模score函数,分词结果则等同于最大score函数所对应的标注序列,具体没懂。),scoring function是线性函数。CRF的势函数与Perceptron的scoring function都使用了线性函数,因此特征模板是一致的

首先,“全局学习”的概念主要针对的是结构化预测问题(structure prediction),比如序列标注或者句法分析。不同于简单的多元分类,在结构化预测问题中,通常需要一个较为复杂的解码过程才能够获得最终的结构化输出。结构化感知器与普通感知器在学习算法上是一致的,主要的区别在于特征抽取是否考虑全局的结构化输出。而特征抽取过程则进一步决定了模型能否进行全局的结构化学习以及预测。

4)中科院的nlpir

以微博为训练语料

因为NLPIR是基于字典的分词,所以若用户加载自定义词典将优先使用用户词典。

它的前身是ICTCLAS

采用的是Bigram的Word-Based Generative Model,Bigram假设每个词出现的概率只和其前一个词有关。

Word-Based Generative Model是采用最大联合概率来对最佳分词方案建模。即为以词为基础的生成式模型,和jieba分词类似,jieba所使用的是Unigram+HMM而它使用的是Bigram+HMM。

5)清华的thulac

以人民日报为训练语料

和ltp所采用的分词模型相同。

6)斯坦福的中文分词

它是以CRF模型为基础进行中文分词的

为什么要分词?

神经网络适用于处理具有局部相关性的数据,在NLP任务中,词由字组成,句由词组成,成词的字之间有相关性,成句的词与词之间有相关性。所以说为什么要分词而不是直接用字进行构建?因为用字破坏了文本中的上下文关系,且字与字之间不是独立的效果不好,分词是为了把句子分为若干个相关性较弱的部分,同时也是为了对明显具有强相关关系的字特征进行组合,便于进一步处理。

那么在一些NLP的任务中分词之后把词向量作为神经网络的输入效果就会比以字向量作为输入的效果好吗?其实不是的。在19年的《Is Word Segmentation Necessary for Deep Learning of Chinese Representations?》文章中指出,把字向量作为输入效果更好。但是这篇论文不是说在NLP任务中应该以字向量为输入而不是词向量,它是为了引发我们做具体任务时的思考。论文中指出,之所以词向量的效果不如字向量一方面是因为分词工具的不准确,主要原因是因为单词数据的稀疏性以及OOV单词的存在,在训练语料中常用的词只是占词表中的一小部分,也就是说词表中绝大部分词的词频都很低,这就导致在训练词向量时不可避免的会出现过拟合现象,从而使得词向量的质量不高。

尽管从直觉上看, ”词“的所携带的信息是比”字“更丰富,但对于神经网络而言,会如何呢?深层的神经网络通过层层的特征组合学习能否根据复杂的过程来学习到字与字之间的组合方式, 如果可以,我们还有必要进行分词吗?很多文本表达中存在的交叉歧义也被带入了以字为序列的文本编码中,使得模型更难从单字的序列中学习到大颗粒度文本蕴含的语义信息,例如双字或者多字词的整体含义等。虽然通过大规模文本建模可以一定程度上区分不同上下文环境的语义,但是依然没有充分并显式地利用预训练和微调整语料中经常出现的词、短语、实体等更大颗粒度的信息。可以参照(https://www.cnblogs.com/dyl222/p/11853101.html)中的ZEN模型,使用字和N-gram作为输入,N-gram通过Transformer进行编码,这样可以提取到更加有用的N-gram,能够增加一些大颗粒度信息的同时,相比于词输入还避免了分词引入的错误信息。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905