NLP之分词
不同分词工具原理解析
对各种分词工具的介绍,具体参考:
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之分词的更多相关文章
- NLP & 中文分词
NLP & 中文分词 中文分词 (Word Segmentation, WS) 指的是将汉字序列切分成词序列. 中文自然语言处理系统 https://www.ltp-cloud.com/int ...
- nlp中文分词(jieba和pyltp)
分词是中文自然语言处理的基础.目前常用的分词算法有 1.张华平博士的NShort中文分词算法. 2.基于条件随机场(CRF)的中文分词算法. 这两种算法的代表工具包分别是jieba分词系统和哈工大的L ...
- nlp 总结 分词,词义消歧,词性标注,命名体识别,依存句法分析,语义角色标注
分词 中文分词 (Word Segmentation, WS) 指的是将汉字序列切分成词序列. 因为在汉语中,词是承载语义的最基本的单元.分词是信息检索.文本分类.情感分析等多项中文自然语言处理任务的 ...
- 【NLP】分词 新词
基于大规模语料的新词发现算法 https://blog.csdn.net/xgjianstart/article/details/52193258 互联网时代的社会语言学:基于SNS的文本数据挖掘 h ...
- elasticsearch分词器Jcseg安装手册
Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...
- 【NLP】老司机带你入门自然语言处理
自然语言处理是一门用于理解人类语言.情感和思想的技术,被称为是人工智能皇冠上的明珠. 随着深度学习发展,自然语言处理技术近年来发展迅速,在技术上表现为BERT.GPT等表现极佳的模型:在应用中表现为c ...
- R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...
- 精读《syntax-parser 源码》
1. 引言 syntax-parser 是一个 JS 版语法解析器生成器,具有分词.语法树解析的能力. 通过两个例子介绍它的功能. 第一个例子是创建一个词法解析器 myLexer: import { ...
- 深圳云栖大会人工智能专场:探索视频+AI,玩转智能视频应用
摘要: 在人工智能时代,AI技术是如何在各行业和领域真正的发挥应用和商业价值,带来产业变革才是关键.在3月28日深圳云栖大会的人工智能专场中,阿里云视频服务技术专家邹娟将带领大家探索熟悉的视频场景中, ...
随机推荐
- Jmockit 构造函数与初始代码块
from Jmockit 中文网 http://jmockit.cn/showArticle.htm?channel=4&id=14 有些编写不良好的类的构造函数,初始代码块,静态代码块存在大 ...
- LeetCode 155:最小栈 Min Stack
LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- ...
- Docker学习(六)-Kubernetes - Spring Boot 应用
接上一篇 https://www.cnblogs.com/woxpp/p/11872155.html 新建 k8s-demo.yaml apiVersion: apps/v1beta2 kind: D ...
- 抓包工具 fidder4
抓包工具 fidder4 fidder4是一款基于windos灵活的抓包工具,可抓取pc端移动端的网络数据包. 安装 安装:fidder 4 下载:https://www.telerik.com/d ...
- Python3.0的新特性
网上关于Python3与Python2的区别的文章都烂大街了,但基本上都是抄来抄去,为了追本溯源,直接看官网最靠谱,官网文档的结构性更强. 本文是对Python3.0官网文档 What's New I ...
- springboot拦截器拦了静态资源css,js,png,jpeg,svg等等静态资源
1.在SpringBoot中自己写的拦截器,居然把静态资源也拦截了,导致了页面加载失败. package com.bie.config; import com.bie.component.MyLoca ...
- [.NET] 控制只启动单个指定外部程序
独立观察员 2019 年 6 月 12 日 有的时候我们程序需要启动外部程序来配合实现某些功能,比如启动一个 Cef 相关程序来承载网页.那么如果那个外部程序并没有实现单例启动,我们程序去启动它的时候 ...
- C#下的时间测试(用于计算方法执行时间)
public class Timing { private TimeSpan m_StartTime; private TimeSpan duringTime; public Timing() //构 ...
- The underlying connection was closed: An unexpected error occurred on a send
操作系统是Windows Server 2003 x64 SP2,使用Framework 4.0,在使用WebClient访问某些特定的HTTPS站点时,会引发异常: Unhandled Except ...
- jenkins+robotframework邮件发送报告模板
1.Jenkins中配置系统邮件系统管理–系统设置,配置Extended E-mail Notification 2.jenkins 创建一个新项目,项目创建成功,配置邮件