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

Deep Learning Specialization on Coursera

虽然是愚人节,但是这个不是愚人节玩笑,最近花了一些时间在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打造一套实用的中文分词系统二

Deep Learning Specialization on Coursera

用MeCab打造一套实用的中文分词系统(二)》上有25条评论

  1. huang

    关注你好久了~想请教一下,如果我有一个本地的语料库,我怎么设置一个流程使得别人提供一个近义词时快速返回语料库中最匹配的结果呢?

    [回复]

    52nlp 回复:

    你想返回什么呢?词还是篇章呢?

    [回复]

  2. 陈佳

    谢谢分享,中文分词是中文特有的问题,研究一下MeCab,不知道适不适合在生产环境适应。

    [回复]

    52nlp 回复:

    MeCab非常适合生产环境,目前核心的问题就是为自己的业务训练一套舒服的模型和词典

    [回复]

  3. Janvn

    大神求救,我之前在windows上没跑起来,现在移到ubuntu上去跑,mecab-0.98..tar.gz和词典是最新的版本,都是按照教程装的,配置文件也写好了,可是运行/usr/local/libexec/mecab/mecab-dict-index生成二进制词典时,就开始报错了
    char_property.cpp(150) [size >= 2] format error:
    请问下怎么解决这个问题?

    [回复]

    52nlp 回复:

    这个和你的配置文件或者词典格式有关吧?不匹配?

    [回复]

    Janvn 回复:

    之前我是直接把在windows上写好的配置文件拷贝过来的,出现了错误,后来我在ubuntu上的seed目录下重新写了配置文件,没有报错,可是一直处于执行命令中,终端上不出现任何结果信息,seed文件夹下只会生成一个char.bin文件,会不会是我写的配置文件方式不对?我是直接将文件名设置为.def的。如果不是这样写,具体是怎么样的写的呢?我不太会,好纠结呀

    [回复]

    52nlp 回复:

    你可以按上一篇文章来一步一步试试, 目的是先跑通,然后酌情加feature: http://www.52nlp.cn/%E7%94%A8mecab%E6%89%93%E9%80%A0%E4%B8%80%E5%A5%97%E5%AE%9E%E7%94%A8%E7%9A%84%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E7%B3%BB%E7%BB%9F

    Janvn 回复:

    貌似0.98的版本有问题,一直没下载到0.97的版本,现在下载了最新的0.996的版本,终于可以跑过去了,呵呵

    [回复]

    52nlp 回复:

    我用的就是0.996版本,最新版

  4. weyn

    请问怎么样可以获得词性标注的结果?我想试验一下词性标注的结果。谢谢!

    [回复]

  5. weyn

    请问如何可以生成词性标注?

    [回复]

    52nlp 回复:

    可以这样指定输出:
    mecab -d mecab-chinese-data --node-format=%m/%F-[0]\\s --eos-format=\\n input -o output

    [回复]

    weyn 回复:

    谢谢,我试了下这个指令,系统反馈说,无法unrecognized option `-node-format=%m/%F-[o]\s`
    何解?

    [回复]

    52nlp 回复:

    不清楚,我这边可以,注意是双斜线

  6. 赖鸿昌

    您好!!
    我在Windows下使用的时候一直是乱码,已经试过EUC,SHIFT,UTF编码的字典,是系统字符集的问题吗?我是要直接更改系统语言吗?

    [回复]

    52nlp 回复:

    抱歉,windows下我没有试过,不太清楚,mac & ubuntu下使用无误,回头看看有没有机会测试一下,谢谢提示

    [回复]

  7. Buzz.x

    您好,我在尝试java调用mecab的test.java的时候,loadLibrary出错,然后就会提示LD_LIBRARY_PATH有问题。我也是用的Mac OS,但是对系统的知识了解非常少,在网上查了一些资料也还是不知道问题在哪里,也不清楚应该修改哪里的配置。想请教一下您,谢谢!

    public class test {
    static {
    try {
    System.loadLibrary("MeCab");
    } catch (UnsatisfiedLinkError e) {
    System.err.println("Cannot load the example native code.\nMake sure your LD_LIBRARY_PATH contains \'.\'\n" + e);
    System.exit(1);
    }
    }

    public static void main(String[] argv) {
    System.out.println(MeCab.VERSION);
    Tagger tagger = new Tagger();
    String str = "太郎は二郎にこの本を渡した。";
    System.out.println(tagger.parse(str));
    Node node = tagger.parseToNode(str);
    for (; node != null; node = node.getNext()) {
    System.out.println(node.getSurface() + "\t" + node.getFeature());
    }
    System.out.println("EOS\n");

    Model model = new Model();
    Tagger tagger2 = model.createTagger();
    System.out.println(tagger2.parse(str));

    Lattice lattice = model.createLattice();
    System.out.println(str);
    lattice.set_sentence(str);
    if (tagger2.parse(lattice)) {
    System.out.println(lattice.toString());
    for (node = lattice.bos_node(); node != null; node = node.getNext()) {
    System.out.println(node.getSurface() + "\t" + node.getFeature());
    }
    System.out.println("EOS\n");
    }

    lattice.add_request_type(MeCab.MECAB_NBEST);
    lattice.set_sentence(str);
    tagger2.parse(lattice);
    for (int i = 0; i < 10; ++i) { if (lattice.next()) { System.out.println("nbest:" + i + "\n" + lattice.toString()); } } } }

    [回复]

    52nlp 回复:

    估计和你编译mecab-java版本有关,我只用了python版本,没用java版本,不是太清楚,google了一下关键词,可以看看日文这个文档:http://tseiya.hatenablog.com/entry/2012/02/14/154150
    注意这里:
    #java-mecab用のクラスパス
    #export CLASSPATH=/usr/local/bin/mecab-java:$CLASSPATH
    #export LD_LIBRARY_PATH=/usr/local/bin/mecab-java:$LD_LIBRARY_PATH
    #export DYLD_LIBRARY_PATH=/usr/local/bin/mecab-java:$DYLD_LIBRARY_PATH

    建议你找到mecab-java的路径,然后export一下试试:
    export LD_LIBRARY_PATH=/usr/local/bin/mecab-java:$LD_LIBRARY_PATH

    [回复]

    Buzz.x 回复:

    还是没有成功,我先用终端熟悉一下吧,谢谢!
    找到一篇放在这儿吧。

    [回复]

    虾米 回复:

    您好,我也和你遇到相同的问题,请问您的问题解决了么?

  8. 虾米

    我在linux安装mecab后会在/usr/local/bin下生成两个可执行文件,分别为mecab和mecab-conf,然后在LD_LIBRARY_PATH=/usr/local/bin/,可是执行test后还是会出现错误

    [回复]

    52nlp 回复:

    关于mecab-java,建议仔细follow一下这个日文教程试试:http://tseiya.hatenablog.com/entry/2012/02/14/154150

    [回复]

  9. 哈哈

    你好,怎么进行已分词的文章进行词频统计,然后图形化结果

    [回复]

    52nlp 回复:

    这个是一个基础问题,建议你自行google一下"word count"

    [回复]

发表评论

电子邮件地址不会被公开。 必填项已用*标注