分类目录归档:中文分词

Mecab安装过程中的一些坑

先说一点题外话,最近发现 Linode 因为庆祝13周年活动将所有的Plan加了一倍,又来了一次加量不加价,这一下子和别的产品拉开了差距,可惜目前Linode日本节点并不参加活动,否则52nlp目前所用的这台 Linode 主机性能就可以翻倍了。不过还是搞了一台 Linode 8GB(8G内存,4核,96G SSD硬盘容量) 的VPS套餐(40$/mo),选择了美国西部的 Fremont 节点,据说国内连接速度很不错。在上面选择了64位的Ubuntu14.04 版本,但是在这个环境下安装Mecab的过程中接连踩了几个坑,所以记录一下。

==============================================================================
Update: 2017.03.21

近期又试了一下Ubuntu上基于apt-get的安装方式,非常方便,如果不想踩下面源代码编译安装的坑,推荐这种方式,参考自:https://gist.github.com/YoshihitoAso/9048005

$ sudo apt-get install mecab libmecab-dev mecab-ipadic
$ sudo apt-get install mecab-ipadic-utf8
$ sudo apt-get install python-mecab

注意其中mecab-ipadic 和 mecab-ipadic-utf8 是日文词典和模型,可以选择安装或者不安装,基于需求而定。剩下的用法和之前的一样,选定一个中文词典和模型,使用即可。

==============================================================================

这里曾写过“Mecab中文分词”系列文章,也在github上发布过一个中文分词项目 MeCab-Chinese:Chinese morphological analysis with Word Segment and POS Tagging data for MeCab ,但是这个过程中没有怎么写到Mecab安装的问题,因为之前觉得rickjin的这篇《日文分词器 Mecab 文档》应该足够参考,自己当时也在Mac OS和Ubuntu环境下安装成功并测试,印象貌似不是太复杂。这次在Ubuntu 14.04的环境安装的时候,遇到了几个小坑,记录一下,做个备忘,仅供参考。
继续阅读

用MeCab打造一套实用的中文分词系统(四):MeCab增量更新

最近在处理NLPJob的一些数据,发现之前训练的Mecab中文分词工具包还有一些问题,所以想到了为NLPJob定制一个MeCab中文分词器,最简单的方法就是整理一批相关的词条,可以通过词条追加的方法加到原有的Mecab中文分词词典中去,这个可以参考《日文分词器Mecab文档》中介绍的“词条追加”方法,既可以放到系统词典中,也可以放到用户词典中,很方便。不过这个还不是最佳方案,之前有用户在《用MeCab打造一套实用的中文分词系统》中留言:

你好, 我在win7上训练的时候mecab-cost-train的时候会崩溃,请问下我能每次只训练一小部分,然后最后一起发布嘛?

google了一下,发现MeCab的作者Taku Kudo在google plus上给了一个增量更新的方案:

https://plus.google.com/107334123935896432800/posts/3g83gkBoSYE

当然这篇文章是用日文写得,不过如果熟悉Mecab的相关脚本,很容易看懂。增量更新除了可以解决在小内存机器上分批训练模型外,也可以很容易在一个已有的基准分词模型上定制特定领域的分词器,既更新词典,也更新模型,这才是我理想中NLPJob中文分词器的定制之路。
继续阅读

用MeCab打造一套实用的中文分词系统(三):MeCab-Chinese

我在Github上发布了一个MeCab中文分词项目: MeCab-Chinese , 目的是提供一个用于中文分词和词性标注的MeCab词典和模型数据,类似MeCab日文IPA词典(mecab-ipadic),并且提供一些我自己用到的特征模板和脚本,方便大家从源头开始训练一个MeCab中文分词系统。

自从上次在愚人节的时候发布了一个mecab中文词典和数据模型之后(《用MeCab打造一套实用的中文分词系统(二)》), 收到了一些反馈,而这些反馈又促使我深入的review了一下mecab,重新设计特征及特征模板,加入了一些新的词典数据,重新训练模型,感兴趣的同学可以先试试这个0.2版本: mecab-chinesedic-binary (链接: http://pan.baidu.com/s/1gdxnvFX 密码: kq9g)
注:目前所有发布的版本均默认utf-8编码,并且在Mac OS和Linux Ubuntu下测试有效,windows没有测试,感兴趣的同学可自行测试)

了解和安装mecab仍请参考:
日文分词器 Mecab 文档
用MeCab打造一套实用的中文分词系统

这里再补充一点,由于google code废弃的缘故,MeCab这个项目已经搬迁至github,但是一些资源反而不如之前那么好找了,可参考两个MeCab作者维护的页面:
MeCab日文文档: http://taku910.github.io/mecab/
MeCab github 页面:https://github.com/taku910/mecab

MeCab目前最新的版本是2013-02-18更新的MeCab 0.996,我在Mac OS和Linux Ubuntu下用的是这个版本,在MeCab-Chinese下,做了一个备份,感兴趣的同学可以从这里下载: MeCab 0.996
继续阅读

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

虽然是愚人节,但是这个不是愚人节玩笑,最近花了一些时间在MeCab身上,越发喜欢这个来自岛国的开源分词系统,今天花了一些时间训练了一个更适用的模型和词典,打包提供给大家使用,因为数据和词典涉及到一些版权问题,所以打包文件里只是mecab用于发布的二进制词典和模型文件,目前在mac os和linux ubuntu系统下测试无误,其他系统请自行测试使用:

链接: http://pan.baidu.com/s/1sjBfdXr 密码: 8udf

了解和安装mecab请参考:
日文分词器 Mecab 文档
用MeCab打造一套实用的中文分词系统

使用前请按上述文档安装mecab,下载这个中文分词模型和词典之后解压,解压后得到一个mecab-chinese-data目录,执行:

mecab -d mecab-chinese-data
扬帆远东做与中国合作的先行
扬帆 v,*,*,*,*,*,扬帆,*,*
远东 ns,*,*,*,*,*,远东,*,*
做 v,*,*,*,*,*,做,*,*
与 p,*,*,*,*,*,与,*,*
中国 ns,*,*,*,*,*,中国,*,*
合作 v,*,*,*,*,*,合作,*,*
的 u,*,*,*,*,*,的,*,*
先行 vn,*,*,*,*,*,先行,*,*
EOS

上述第二列提供了词性标注结果。

如果想得到单行的分词结果,可以这样执行:

mecab -d ./mecab-chinese-data/ -O wakati
扬帆远东做与中国合作的先行
扬帆 远东 做 与 中国 合作 的 先行

如果想直接对文件分词,可以这样执行:

mecab -d ./mecab-chinese-data/ INPUT -o OUTPUT

具体可以参考上述两个文档,另外我在mac下测试了一下中文维基百科语料的切分速度,大概700多M的语料,不到90秒切分完毕,大概7M/s的切分速度完全达到了工业届的使用标准。另外Mecab还支持Nbest输出,多种输出格式,全切分模式,系统词典和用户词典定制等等,同时通过SWIG提供了perl, ruby, python, java的调用接口,非常方便。

以下是在backoff2005 人民日报语料库上的测试结果:

=== SUMMARY:
=== TOTAL INSERTIONS: 3803
=== TOTAL DELETIONS: 1981
=== TOTAL SUBSTITUTIONS: 5004
=== TOTAL NCHANGE: 10788
=== TOTAL TRUE WORD COUNT: 104372
=== TOTAL TEST WORD COUNT: 106194
=== TOTAL TRUE WORDS RECALL: 0.933
=== TOTAL TEST WORDS PRECISION: 0.917
=== F MEASURE: 0.925
=== OOV Rate: 0.058
=== OOV Recall Rate: 0.482
=== IV Recall Rate: 0.961
### pku_test.result 3803 1981 5004 10788 104372 106194 0.933 0.917 0.925 0.058 0.482 0.961

召回率93.3%,准确率91.7%, F值为92.5%, 虽然还没有一个单纯针对这个测试语料比赛的分词结果好,但是测试了一些其他语料后觉得这个版本完全可以作为一个基准版本使用,另外mecab也提供了用户定制词典接口,方便用户按自己的需求定制使用。

最后提供一个demo仅供测试使用: 中文分词Demo

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

本文链接地址:http://www.52nlp.cn/用mecab打造一套实用的中文分词系统二

HMM相关文章索引

HMM系列文章是52nlp上访问量较高的一批文章,这里做个索引,方便大家参考。

HMM学习

  • HMM学习最佳范例一:介绍
  • HMM学习最佳范例二:生成模式
  • HMM学习最佳范例三:隐藏模式
  • HMM学习最佳范例四:隐马尔科夫模型
  • HMM学习最佳范例五:前向算法
  • HMM学习最佳范例六:维特比算法
  • HMM学习最佳范例七:前向-后向算法
  • HMM学习最佳范例八:总结
  • HMM学习最佳范例全文文档PDF百度网盘-密码f7az
  • HMM相关

  • wiki上一个比较好的HMM例子
  • 几种不同程序语言的HMM版本
  • HMM应用

  • HMM词性标注
  • HMM中文分词
  • 用MeCab打造一套实用的中文分词系统

    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下,请自行测试。一些中文分词的背景知识可参考这里过往的相关文章: 中文分词
    继续阅读

    Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器

    斯坦福大学自然语言处理组是世界知名的NLP研究小组,他们提供了一系列开源的Java文本分析工具,包括分词器(Word Segmenter),词性标注工具(Part-Of-Speech Tagger),命名实体识别工具(Named Entity Recognizer),句法分析器(Parser)等,可喜的事,他们还为这些工具训练了相应的中文模型,支持中文文本处理。在使用NLTK的过程中,发现当前版本的NLTK已经提供了相应的斯坦福文本处理工具接口,包括词性标注,命名实体识别和句法分析器的接口,不过可惜的是,没有提供分词器的接口。在google无果和阅读了相应的代码后,我决定照猫画虎为NLTK写一个斯坦福中文分词器接口,这样可以方便的在Python中调用斯坦福文本处理工具。

    首先需要做一些准备工作,第一步当然是安装NLTK,这个可以参考我们在gensim的相关文章中的介绍《如何计算两个文档的相似度》,不过这里建议check github上最新的NLTK源代码并用“python setup.py install”的方式安装这个版本:https://github.com/nltk/nltk。这个版本新增了对于斯坦福句法分析器的接口,一些老的版本并没有,这个之后我们也许还会用来介绍。而我们也是在这个版本中添加的斯坦福分词器接口,其他版本也许会存在一些小问题。其次是安装Java运行环境,以Ubuntu 12.04为例,安装Java运行环境仅需要两步:

    sudo apt-get install default-jre
    sudo apt-get install default-jdk

    最后,当然是最重要的,你需要下载斯坦福分词器的相应文件,包括源代码,模型文件,词典文件等。注意斯坦福分词器并不仅仅支持中文分词,还支持阿拉伯语的分词,需要下载的zip打包文件是这个: Download Stanford Word Segmenter version 2014-08-27,下载后解压。

    准备工作就绪后,我们首先考虑的是在nltk源代码里的什么地方来添加这个接口文件。在nltk源代码包下,斯坦福词性标注器和命名实体识别工具的接口文件是这个:nltk/tag/stanford.py ,而句法分析器的接口文件是这个:nltk/parse/stanford.py , 虽然在nltk/tokenize/目录下有一个stanford.py文件,但是仅仅提供了一个针对英文的tokenizer工具PTBTokenizer的接口,没有针对斯坦福分词器的接口,于是我决定在nltk/tokenize下添加一个stanford_segmenter.py文件,作为nltk斯坦福中文分词器的接口文件。NLTK中的这些接口利用了Linux 下的管道(PIPE)机制和subprocess模块,这里直接贴源代码了,感兴趣的同学可以自行阅读:
    继续阅读

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

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

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

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

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

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

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

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

    上一节主要介绍的是利用最大熵工具包来做字标注中文分词,这一节我们直奔主题,借用条件随机场工具“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

    最近要整理一下课程图谱里的中文课程,需要处理中文,首当其冲的便是中文分词的问题。目前有一些开源的或者商用的中文分词器可供选择,但是出于探索或者好奇心的目的,想亲手打造一套实用的中文分词器,满足实际的需求。这些年无论是学习的时候还是工作的时候,林林总总的接触了很多实用的中文分词器,甚至在这里也写过一些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%以上的效果。不清楚这份中文分词资源的同学可参考很早之前写的这篇文章:中文分词入门之资源。以下我们将转入这篇文章的主题,基于最大熵模型的字标注中文分词。
    继续阅读