标签归档:条件随机场

用MeCab打造一套实用的中文分词系统

Deep Learning Specialization on Coursera

MeCab是一套日文分词(形态分析)和词性标注系统(Yet Another Part-of-Speech and Morphological Analyzer), rick曾经在这里分享过MeCab的官方文档中文翻译: 日文分词器 Mecab 文档,这款日文分词器基于条件随机场打造,有着诸多优点,譬如代码基于C++实现,基本内嵌CRF++代码,词典检索的算法和数据结构均使用双数组Double-Array,性能优良,并通过SWIG提供多种语言调用接口,可扩展性和通用性都非常不错:

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 界被广泛使用。

我们曾经介绍过一个非常初级的CRF中文分词实现方案:中文分词入门之字标注法4,基于CRF++实现了一个Toy级别的CRF中文分词系统,但是还远远不够。在仔细看过这篇日文分词系统MeCab的中文文档并亲测之后,不得不赞这真是一个理想的CRF分词系统,除了上述所说的优点之外,在使用上它还支持Nbest输出,多种输出格式,全切分模式,系统词典和用户词典定制等等,难怪这套分词系统在日本NLP界被广泛使用。

MeCab的诸多优点以及它的通用性一直深深吸引着我,但是除了日文资料,相关的中文或英文资料相当匮乏,曾经尝试过基于MeCab的中文翻译文档以及代码中测试用例中的例子来训练一套中文分词系统,但是第一次以失败告终。这几天,由于偶然的因素又一次捡起了MeCab,然后通过Google及Google翻译发现了这篇日文文章《MeCabで中国語の形態素解析(分かち書き)をしてみる》,虽其是日语所写,但是主旨是通过MeCab构造一套中文(貌似是繁体)形态(中文分词+词性标注)分析系统,给了我很大的帮助。所以接下来,我会基于这篇文章的提示以及rick翻译文档中第八节“从原始词典/语料库做参数估计”的参考,同时结合backoff2005中微软研究院的中文分词语料来训练一套极简的中文分词系统,至于MeCab的相关介绍及安装使用请参考 日文分词器 Mecab 文档,这里不再赘述。以下是我在Mac OS下的操作记录,同理可推广制Linux下,至于Windows下,请自行测试。一些中文分词的背景知识可参考这里过往的相关文章: 中文分词
继续阅读

中文分词入门之字标注法全文文档

Deep Learning Specialization on Coursera

将“中文分词入门之字标注法”这个系列整理成了一个PDF文档放到微盘中了,感兴趣的同学可以下载:

微盘:中文分词入门之字标注法.pdf
百度网盘:中文分词入门之字标注法.pdf

如果愿意看网页,也可以从这个标签进入:字标注中文分词

另外在上一节关于CRF中文分词的介绍中,通过CRF++训练了一个CRF中文分词模型,实际训练的时间比较长,为了方便大家测试,也把这个CRF模型上传到微盘了,感兴趣的同学可以下载:crf_model

注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn

本文链接地址:http://www.52nlp.cn/中文分词入门之字标注法全文文档

中文分词入门之字标注法4

Deep Learning Specialization on Coursera

上一节主要介绍的是利用最大熵工具包来做字标注中文分词,这一节我们直奔主题,借用条件随机场工具“CRF++: Yet Another CRF toolkit”来完成字标注中文分词的全过程。

关于条件随机场(CRF)的背景知识,推荐参考阅读一些经典的文献:《条件随机场文献阅读指南》,另外再额外推荐一个tutorial:《Classical Probabilistic Models and Conditional Random Fields》, 这份关于CRF的文档分别从概率模型(NB,HMM,ME, CRF)之间的关系以及概率图模型背景来介绍条件随机场,比较清晰:

While a Hidden Markov Model is a sequential extension to the Nave Bayes Model, Conditional Random Fields can be understood as a sequential extension to the Maximum Entropy Model.

如果这些还不够过瘾,推荐课程图谱上收录的Coursera创始人之一Daphne Koller的“概率图模型公开课”,相信拿下这门课之后,对于上述概率模型,会有一种“一览众山小”的感觉。
继续阅读

中文分词入门之字标注法3

Deep Learning Specialization on Coursera

最近要整理一下课程图谱里的中文课程,需要处理中文,首当其冲的便是中文分词的问题。目前有一些开源的或者商用的中文分词器可供选择,但是出于探索或者好奇心的目的,想亲手打造一套实用的中文分词器,满足实际的需求。这些年无论是学习的时候还是工作的时候,林林总总的接触了很多实用的中文分词器,甚至在这里也写过一些Toy级别的中文分词相关文章,但是没有亲手打造过自己的分词器,甚为遗憾。目前自己处于能自由安排工作的阶段,所以第一步就是想从中文信息处理的桥头堡“中文分词”入手,打造一个实用的中文分词器,当然,首先面向的对象是课程图谱所在的教育领域。

大概4年前,这里写了两篇关于字标注中文分词的文章:中文分词入门之字标注法,文中用2-tag(B,I)进行说明并套用开源的HMM词性标注工具Citar(A simple Trigram HMM part-of-speech tagger)做了演示,虽然分词效果不太理想,但是能抛砖引玉,也算是有点用处。这次捡起中文分词,首先想到的依然是字标注分词方法,在回顾了一遍黄昌宁老师和赵海博士在07年第3期《中文信息学报》上发表的《中文分词十年回顾》后,决定这次从4-tag入手,并且探索一下最大熵模型和条件随机场(CRF)在中文分词字标注方法上的威力。这方面的文献大家可参考张开旭博士维护的“中文分词文献列表”。这里主要基于已有文献的思路和现成的开源工具做一些验证,包括张乐博士的最大熵模型工具包(Maximum Entropy Modeling Toolkit for Python and C++)和条件随机场的经典工具包CRF++(CRF++: Yet Another CRF toolkit)。

这个系列也将补充两篇文章,一篇简单介绍背景知识并介绍如何利用现成的最大熵模型工具包来做中文分词,另外一篇介绍如何用CRF++做字标注分词,同时基于CRF++的python接口提供一份简单的 CRF Python 分词代码,仅供大家参考。至于最大熵和CRF++的背景知识,这里不会过多涉及,推荐大家跟踪一下课程图谱上相关的机器学习公开课

这次使用的中文分词资源依然是SIGHAN提供的backoff 2005语料,目前封闭测试最好的结果是4-tag+CFR标注分词,在北大语料库上可以在准确率,召回率以及F值上达到92%以上的效果,在微软语料库上可以到达96%以上的效果。不清楚这份中文分词资源的同学可参考很早之前写的这篇文章:中文分词入门之资源。以下我们将转入这篇文章的主题,基于最大熵模型的字标注中文分词。
继续阅读

条件随机场文献阅读指南

Deep Learning Specialization on Coursera

  与最大熵模型相似,条件随机场(Conditional random fields,CRFs)是一种机器学习模型,在自然语言处理的许多领域(如词性标注、中文分词、命名实体识别等)都有比较好的应用效果。条件随机场最早由John D. Lafferty提出,其也是Brown90的作者之一,和贾里尼克相似,在离开IBM后他去了卡耐基梅隆大学继续搞学术研究,2001年以第一作者的身份发表了CRF的经典论文 “Conditional random fields: Probabilistic models for segmenting and labeling sequence data”。 继续阅读

无约束最优化五

Deep Learning Specialization on Coursera

3.2 Quasi-Newton Method
  Quasi-Newton Method每一步计算过程中仅涉及到函数值和函数梯度值计算,这样有效避免了Newton Method中涉及到的Hessian矩阵计算问题。于Newton Method不同的是Quasi-Newton Method在每点处构建一个如下的近似模型: 继续阅读

无约束最优化四

Deep Learning Specialization on Coursera

3.Quasi-Newton Method
  在第2节中我们了解了步长的概念,以及从x_k走到x_k+1点使用line search方法计算步长的方法。不过我们在那里忽略了一个重要的概念,即“方向”。从第2节,我们了解到从每一点x_k走到下一点x_k+1时,需要给出要走的“方向”,只有“方向”确定好之后,才能在此基础上应用line search方法找到对应的“步长”,因此在解决了“步长”计算问题之后,这里我们将和大家一起了解一下每一步的“方向”如何确定。本节分为2大部分,首先我们通过newton method引入方向的概念,在此基础上引入quasi-newton method。然后引入quasi-newton method中的一种重要方法BFGS method,并在BFGS method的基础上介绍用于大规模计算的LBFGS method算法,同时以此结束本节的所有内容。 继续阅读

无约束最优化三

Deep Learning Specialization on Coursera

2.2 a_k步长的选择
  了解了a_k的合理性之后,就相当于获得了标尺,在此基础上我们可以选择合适的策略来求取a_k。所有的line search过程在计算每一步的a_k时,均需要提供一个初始点a_0,然后再此基础上生成一系列的{a_i},直到a_i满足2.1节所规定的条件为止,此时该a_k即被确定为a_i,或者未找到一个合适的a_k。这里我们仅介绍目前常用的策略平方插值和立方插值法。因此本节内容分为两部分,2.2.1节介绍选择a_k常用的平方插值和立方插值法,2.2.2节介绍由x_k点到x_k+1点,方向确定为p_k后,步长a_k具体计算过程。 继续阅读

无约束最优化二

Deep Learning Specialization on Coursera

2.1 a_k合理性讨论
  如下将要讨论关于a_k需要满足的两个条件,当a_k满足这两个条件后,就可以认为从x_k点移动到x_k+1点的步长已经确定下来了。第一个条件为sufficient decrease condition,从直观角度来看,该条件主要要用保证x_k+1点的函数值要小于x_k点的函数值,满足该条件后,才有全局收敛 的可能性。第二个条件为curvature condition,从直观角度来看,该条件主要用于保证x_k点经过步长a_k的移动到达x_k+1后,▽f_k+1小于▽f_k。 继续阅读

无约束最优化一

Deep Learning Specialization on Coursera

  估计有些读者看到这个题目的时候会觉得很数学,和自然语言处理没什么关系,不过如果你听说过最大熵模型、条件随机场,并且知道它们在自然语言处理中被广泛应用,甚至你明白其核心的参数训练算法中有一种叫LBFGS,那么本文就是对这类用于解无约束优化算法的Quasi-Newton Method的初步介绍。
  事实上,这个系列的作者是我的师兄jianzhu,他在中文分词、语言模型方面的研究很深入,如果大家对于srilm的源代码感兴趣,可以参考他个人博客上写的“srilm阅读文档系列”,很有帮助。我曾经向他约过稿,他说业余时间在学数学,比较忙,还以为他没有时间给52nlp写文章,没想到今天晚上他突然交给了我这篇文档,比较长,我会分几部分陆续放在博客上。这里非常感谢他对52nlp的支持,以下内容作者为jianzhu。 继续阅读