关于分词

分词原理

首先建立分词词典,然后遍历的句子中所有相邻的两个字、三个字、四个、字甚至五个六个字,看词典中是否存在相应的词,如果存在,便作为一个词。假如该句这样分完词后没有产生分词冲突的情况,那么则认为分词结束;如果冲突,则要选择概率最大的分词方案。

大部分情况下,分词过程中产生冲突的句子非常多,那么该选择哪种分词的方案呢?
利用语料库建立的统计概率,对于一个句子,我们就可以通过计算各种分词方法对应的联合分布概率,找到最大概率对应的分词方法,即为最优分词。

问题又来了,该如何计算联合分布概率呢?
我们当然可以用暴力方法去计算出所有的分词可能的概率,再找出最优分词方法。但是用维特比算法可以大大简化求出最优分词的时间。
维特比算法采用的是动态规划来解决这个最优分词问题的,动态规划要求局部路径也是最优路径的一部分。

分词方法

中文分词算法大概可以分为:

  • 基于字符串匹配的分词方法;
  • 基于统计模型的分词方法;
  • 二者的结合;
  • 基于理解的分词方法。

基于字符串匹配的分词方法

即扫描字符串,如果发现字符串的子串和词相同,就算匹配。
这类分词通常会加入一些启发式规则,比如“正向/反向最大匹配”, “长词优先” 等策略。

优点:速度块,都是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++语言编写。

分词的速度和准确性

要注意,在某些场景下,分词的正确性是次要的,重要的是速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值