分词原理
首先建立分词词典,然后遍历的句子中所有相邻的两个字、三个字、四个、字甚至五个六个字,看词典中是否存在相应的词,如果存在,便作为一个词。假如该句这样分完词后没有产生分词冲突的情况,那么则认为分词结束;如果冲突,则要选择概率最大的分词方案。
大部分情况下,分词过程中产生冲突的句子非常多,那么该选择哪种分词的方案呢?
利用语料库建立的统计概率,对于一个句子,我们就可以通过计算各种分词方法对应的联合分布概率,找到最大概率对应的分词方法,即为最优分词。
问题又来了,该如何计算联合分布概率呢?
我们当然可以用暴力方法去计算出所有的分词可能的概率,再找出最优分词方法。但是用维特比算法可以大大简化求出最优分词的时间。
维特比算法采用的是动态规划来解决这个最优分词问题的,动态规划要求局部路径也是最优路径的一部分。
分词方法
中文分词算法大概可以分为:
- 基于字符串匹配的分词方法;
- 基于统计模型的分词方法;
- 二者的结合;
- 基于理解的分词方法。
基于字符串匹配的分词方法
即扫描字符串,如果发现字符串的子串和词相同,就算匹配。
这类分词通常会加入一些启发式规则,比如“正向/反向最大匹配”, “长词优先” 等策略。
优点:速度块,都是O(n)时间复杂度,实现简单,效果尚可。
缺点:对歧义和未登录词处理不好。
常见的基于词典的分词算法分为以下几种:正向最大匹配法、逆向最大匹配法、双向匹配分词法、最小切分(使一句话中的词语数量最少)等。具体使用的时候,通常是多种算法合用,或者一种为主、多种为辅,同时还会加入词性、词频等属性来辅助处理(运用某些简单的数学模型)。
注意:好的词典很重要。
这类分词工具包括:
- ikanalyzer
- paoding
- mmseg
基于统计模型的分词方法
这类分词基于人工标注的词性和统计特征,对中文进行建模,即根据观测到的数据(标注好的语料)对模型参数进行估计,即训练。 在分词阶段再通过模型计算各种分词出现的概率,将概率最大的分词结果作为最终结果。常见的序列标注模型有HMM和CRF,也使用SVM和深度学习。
随着深度学习的兴起,也出现了基于神经网络的分词器,例如有人员尝试使用双向LSTM+CRF实现分词器,其本质上是序列标注,所以有通用性,命名实体识别等都可以使用该模型。
优点:能很好处理歧义和未登录词问题,效果比前一类效果好;
缺点:需要大量的人工标注数据,分词速度较慢。
分词工具:
- 基于HMM
- ICTCLAS
- 结巴分词
- 基于CRF
- Stanford Word Segmenter
- 基于N-gram
- 基于ME(最大熵)
字符串匹配和统计模型结合的分词方法
常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。
基于理解的分词方法
通过让计算机模拟人对句子的理解,达到识别词的效果。
基本思想是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
分词工具
jieba
分词原理:
- 第一条,基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)。
- 第二条,采用了动态规划查找最大概率路径,找出基于词频的最大切分组合。
从右往左反向计算最大概率。这是因为汉语句子的重心经常落在后面,通常情况下形容词太多, 后面的才是主干。因此,从右往左计算,正确率要高于从左往右计算。 - 第三条,对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。
分词过程:
- 加载字典,生成trie树。
- 给定待分词的句子,使用正则获取连续的中文字符和英文字符,切分成短语列表,对每个短语使用DAG(查字典)和动态规划,得到最大概率路径,对DAG中那些没有在字典中查到的字,组合成一个新的片段短语,使用HMM模型进行分词,也就是作者说的识别新词,即识别字典外的新词。
- 使用python的yield 语法生成一个词语生成器,逐词语返回。当然,我认为直接返回list,效果也差不到哪里去。
Stanford Word Segmenter
斯坦福分词器。作为众多斯坦福自然语言处理中的一个包,目前最新版本3.8.0, Java实现的CRF算法。可以直接使用训练好的模型,也提供训练模型接口。
ICTCLAS(已改名为NLPIR)
基于HMM的分词。
THULAC
清华大学THULAC。目前已经有Java、Python和C++版本,并且代码开源。
mmseg
IKAnalyzer
基于文本匹配,不需要投入大量人力进行训练和标注。
可以自定词典,方便加入domain specific的词语。
能分出多粒度的结果。
written in java.
HanLP
Hanlp分词。求解的是最短路径。优点:开源、有人维护、可以解答。原始模型用的训练语料是人民日报的语料,当然如果你有足够的语料也可以自己训练。
Mecab
mecab (http://mecab.sourceforge.net/) 是奈良先端科学技術大学院的工藤拓开发的日文分词系统, 该作者写过多个 machine learning 方面的软件包, 最有名的就是 CRF++, 目前该作者在 google@Japan 工作。
mecab 是基于CRF 的一个日文分词系统,代码使用 c++ 实现, 基本上内嵌了 CRF++ 的代码, 同时提供了多种脚本语言调用的接口(python, perl, ruby 等).整个系统的架构采用通用泛化的设计,用户可以通过配置文件定制CRF训练中需要使用的特征模板。 甚至, 如果你有中文的分词语料作为训练语料,可以在该架构下按照其配置文件的规范定制一个中文的分词系统。
日文NLP 界有几个有名的开源分词系统, Juman, Chasen, Mecab. Juman 和 Chasen 都是比较老的系统了, Mecab 系统比较新, 在很多方面都优于 Juman 和 Chasen, mecab 目前开发也比较活跃。 Mecab 虽然使用 CRF 实现, 但是解析效率上确相当高效, 据作者的介绍, Mecab 比基于 HMM 的 Chasen 的解析速度要快。 笔者在一台 Linux 机器上粗略测试过其速度,将近达到 2MB/s, 完全达到了工程应用的需求, 该系统目前在日文 NLP 界被广泛使用。
日文NLP 界有几个有名的开源分词系统, Juman, Chasen, Mecab. Juman 和 Chasen 都是比较老的系统了, Mecab 系统比较新, 在很多方面都优于 Juman 和 Chasen, mecab 目前开发也比较活跃。 Mecab 虽然使用 CRF 实现, 但是解析效率上确相当高效, 据作者的介绍, Mecab 比基于 HMM 的 Chasen 的解析速度要快。 笔者在一台 Linux 机器上粗略测试过其速度,将近达到 2MB/s, 完全达到了工程应用的需求, 该系统目前在日文 NLP 界被广泛使用。
ansj
LTP
哈工大的分词器:主页上给过调用接口,每秒请求的次数有限制。
字嵌入+Bi-LSTM+CRF
本质上是序列标注,这个分词器用人民日报的80万语料,据说按照字符正确率评估标准能达到97.5%的准确率
ZPar
新加坡科技设计大学开发的中文分词器,包括分词、词性标注和Parser,支持多语言,据说效果是公开的分词器中最好的,C++语言编写。
分词的速度和准确性
要注意,在某些场景下,分词的正确性是次要的,重要的是速度。