不同分词工具原理解析

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

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,能够增加一些大颗粒度信息的同时,相比于词输入还避免了分词引入的错误信息。

NLP之分词的更多相关文章

  1. NLP & 中文分词

    NLP & 中文分词 中文分词 (Word Segmentation, WS) 指的是将汉字序列切分成词序列. 中文自然语言处理系统 https://www.ltp-cloud.com/int ...

  2. nlp中文分词(jieba和pyltp)

    分词是中文自然语言处理的基础.目前常用的分词算法有 1.张华平博士的NShort中文分词算法. 2.基于条件随机场(CRF)的中文分词算法. 这两种算法的代表工具包分别是jieba分词系统和哈工大的L ...

  3. nlp 总结 分词,词义消歧,词性标注,命名体识别,依存句法分析,语义角色标注

    分词 中文分词 (Word Segmentation, WS) 指的是将汉字序列切分成词序列. 因为在汉语中,词是承载语义的最基本的单元.分词是信息检索.文本分类.情感分析等多项中文自然语言处理任务的 ...

  4. 【NLP】分词 新词

    基于大规模语料的新词发现算法 https://blog.csdn.net/xgjianstart/article/details/52193258 互联网时代的社会语言学:基于SNS的文本数据挖掘 h ...

  5. elasticsearch分词器Jcseg安装手册

    Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...

  6. 【NLP】老司机带你入门自然语言处理

    自然语言处理是一门用于理解人类语言.情感和思想的技术,被称为是人工智能皇冠上的明珠. 随着深度学习发展,自然语言处理技术近年来发展迅速,在技术上表现为BERT.GPT等表现极佳的模型:在应用中表现为c ...

  7. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...

  8. 精读《syntax-parser 源码》

    1. 引言 syntax-parser 是一个 JS 版语法解析器生成器,具有分词.语法树解析的能力. 通过两个例子介绍它的功能. 第一个例子是创建一个词法解析器 myLexer: import { ...

  9. 深圳云栖大会人工智能专场:探索视频+AI,玩转智能视频应用

    摘要: 在人工智能时代,AI技术是如何在各行业和领域真正的发挥应用和商业价值,带来产业变革才是关键.在3月28日深圳云栖大会的人工智能专场中,阿里云视频服务技术专家邹娟将带领大家探索熟悉的视频场景中, ...

随机推荐

  1. Flink101-快速示例

    验证本文需要具备Docker及Docker-composer,作者使用的环境为Mac + Docker Docker启动Flink集群 首先下载Flink的镜像docker pull flink,我下 ...

  2. Python连载36-线程数量限制、Timer、可重入锁

    一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 import threading import time #参数定义 ...

  3. centos 文本文件编码转换

    iconv -f utf-8 -t gbk   shtel_single_utf8.mlf > shtel_single_gbk.mlf

  4. 你需要知道的8个CSS带@的规则

    1:@charset(用来设置html文档字符编码的格式,比如我们常用的,charset='utf-8') 注:建议CSS文件最顶部都加上@charset "utf-8";,避免出 ...

  5. Kubernetes Pod 资源限制

    Kubernetes Pod 资源限制 官方文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources- ...

  6. Neo4j 第十一篇:Cypher函数

    Cypher函数是对图进行查询和操作的重要工具. 一,谓词函数 谓词函数返回true或者false,主要用于检查是否存在或满足特定的条件. 1,Exists 如果指定的模式存在于图中,或者特定的属性存 ...

  7. Redis(七)分布式锁

    前面学习了Redis的数据结构以及命令.Redis中的事务和Redis对Lua脚本的支持. 这一章就对Redis这些特性做一下实战性应用--基于Redis的分布式锁实现. Lock和Distribut ...

  8. 将VMWare中的虚拟机时间设定在一个固定值

    1.关闭虚拟机 2.用记事本打开虚拟机的.vmx文件 在末尾添加添加: tools.syncTime = "FALSE"  time.synchronize.continue = ...

  9. CTF必备技能丨Linux Pwn入门教程——ROP技术(上)

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  10. Spring Boot实战之定制自己的starter

    本文首发于个人网站,原文地址:http://www.javaadu.online/?p=535,如需转载,请注明出处 在学习Spring Boot的过程中,接触最多的就是starter.可以认为sta ...