IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    52nlp发表于 2015-08-25 15:10:26
    love 0

    最近在处理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中文分词器的定制之路。

    按照这条路子,我预处理了一下NLPJob中的数据,包括提取和校正了公司名,在已有的Mecab-Chinese中文工具包的基础上,手工标记一批NLPJob分词和词性标注数据,用于词条追加和模型训练。然后按照上面Mecab作者的文章指引,进行了一次MeCab-Chinese的定向(NLPJob)更新,效果相当不错。以下是相关的中文记录,方便大家查看,文章的例子数据来源于手工标记的一小部分数据,仅供参考。

    首先准备两份数据,一份是需要追加的词条,例如 nlpjob.dict:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    明略数据/nt
    大数据/n
    挖掘/vn
    工程师/n
    美团/nt
    招聘/vn
    机器/n
    学习/vn
    技术/n
    专家/n
    ......

    另一份手工校正过的分词和词性标注数据,例如 nlpjob.data:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    【/w 明略数据/nt 】/w 大数据/n 挖掘/vn 工程师/n
    美团/nt 招聘/vn 机器/n 学习/vn 技术/n 专家/n
    美团/nt 招聘/vn 数据/n 挖掘/vn 技术/n 专家/n
    【/w 微店/nt 北京/ns 社招/v 】/w 搜索/v 研发/j 工程师/n
    融360/nt -/unk 互联网/n 金融/n 搜索/vn 服务/vn 平台/n 招聘/v 大数据/n 开发/vn 工程师/n
    【/w c轮/n 图片/n 社交/n 】/w nice/nt -/w 数据/n 仓库/n 研发/j 工程师/n
    【/w 微店/nt 北京/ns 社招/v 】/w 推荐/v 研发/j 工程师/n
    【/w 微店/nt 北京/ns 社招/v 】/w 广告/n 系统/n //unk 算法/n 研发/j 工程师/n
    【/w 一点资讯/nt 社招/v 】/w 大数据/n 方向/n :/w 大数据/n 、/w 分布式/b 系统/n 高级/a 研发/j 工程师/n
    【/w 一点资讯/nt 社招/v 】/w 后台/n 及/c 搜索/vn 方向/n :/w 后台/n 、/w 推送/v 后台/n 、/w 数据/n 抓取/v 处理/v
    ......

    按照《用MeCab打造一套实用的中文分词系统(三):MeCab-Chinese》文中的介绍,我们在MeCab-Chinese-V0.2-Script目录下分别执行:

    python make_mecab_seed_data.py nlpjob.dict nlpjob.csv
    python make_mecab_train_data.py nlpjob.data nlpjob.train

    分别得到两个用于Mecab训练用格式的词典(nlpjob.csv) 和训练句子文件(nlpjob.train),例如 nlpjob.csv:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    明略数据,0,0,0,n,nt,BMME,4,明略数据,ming_lve_shu_ju,明略數據
    大数据,0,0,0,n,n,BME,3,大数据,da_shu_ju,大數據
    挖掘,0,0,0,v,vn,BE,2,挖掘,wa_jue,挖掘
    工程师,0,0,0,n,n,BME,3,工程师,gong_cheng_shi,工程師
    美团,0,0,0,n,nt,BE,2,美团,mei_tuan,美團
    招聘,0,0,0,v,vn,BE,2,招聘,zhao_pin,招聘
    机器,0,0,0,n,n,BE,2,机器,ji_qi,機器
    学习,0,0,0,v,vn,BE,2,学习,xue_xi,學習
    技术,0,0,0,n,n,BE,2,技术,ji_zhu,技術
    专家,0,0,0,n,n,BE,2,专家,zhuan_jia,專家
    ......

    例如nlpjob.train:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    【 w,w,S,1,【,【,【
    明略数据    n,nt,BMME,4,明略数据,ming_lve_shu_ju,明略數據
    】 w,w,S,1,】,】,】
    大数据   n,n,BME,3,大数据,da_shu_ju,大數據
    挖掘  v,vn,BE,2,挖掘,wa_jue,挖掘
    工程师   n,n,BME,3,工程师,gong_cheng_shi,工程師
    EOS
    美团  n,nt,BE,2,美团,mei_tuan,美團
    招聘  v,vn,BE,2,招聘,zhao_pin,招聘
    机器  n,n,BE,2,机器,ji_qi,機器
    学习  v,vn,BE,2,学习,xue_xi,學習
    技术  n,n,BE,2,技术,ji_zhu,技術
    专家  n,n,BE,2,专家,zhuan_jia,專家
    EOS
    ......

    这里我们将上一期训练的Mecab中文处理工具包命名为mecab_chinese_data_v0.2,将nlpjob.csv和nlpjob.train拷贝进入这个目录,然后在上层目录执行如下命令,进行二进制词典的更新:

    $ /usr/local/libexec/mecab/mecab-dict-index -f utf8 -t utf8 -d mecab_chinese_data_v0.2 -o mecab_chinese_data_v0.2

    执行过程如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mecab_chinese_data_v0.2/pos-id.def is not found. minimum setting is used
    reading mecab_chinese_data_v0.2/unk.def ... 11
    emitting double-array: 100% |###########################################|
    mecab_chinese_data_v0.2/pos-id.def is not found. minimum setting is used
    reading mecab_chinese_data_v0.2/add.csv ... 9
    reading mecab_chinese_data_v0.2/company_name.csv ... 678
    reading mecab_chinese_data_v0.2/nlpjob.csv ... 203
    reading mecab_chinese_data_v0.2/words.csv ... 1101507
    emitting double-array: 100% |###########################################|
    reading mecab_chinese_data_v0.2/matrix.def ... 272x272
    emitting matrix      : 100% |###########################################|

    done!

    然后执行如下命令在原有CRF模型的基础上基于新的训练数据训练新的模型参数:
    /usr/local/libexec/mecab/mecab-cost-train -M mecab_chinese_data_v0.2/model.def -d mecab_chinese_data_v0.2 mecab_chinese_data_v0.2/nlpjob.train new_model

    执行过程如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Using previous model: mecab_chinese_data_v0.2/model.def
    --cost --freq and --eta options are overwritten.
    reading corpus ...adding virtual node: u,unk,S,1,-,-,-
    adding virtual node: u,unk,S,1,(,(,(
    ......
    adding virtual node: u,unk,BE,2,】-,_,】-
    100... 100...
    Number of sentences: 100
    Number of features:  5703547
    eta:                 0.00005
    freq:                1
    eval-size:           7
    unk-eval-size:       4
    threads:             1
    charset:             utf-8
    C(sigma^2):          1.00000

    iter=0 err=0.25000 F=0.97210 target=511.75767 diff=1.00000
    iter=1 err=0.24000 F=0.96818 target=520.81646 diff=0.01770
    iter=2 err=0.17000 F=0.97504 target=500.66250 diff=0.03870
    iter=3 err=0.17000 F=0.97993 target=493.89725 diff=0.01351
    iter=4 err=0.17000 F=0.98091 target=490.33833 diff=0.00721
    iter=5 err=0.16000 F=0.98287 target=480.14951 diff=0.02078
    iter=6 err=0.08000 F=0.99070 target=473.11797 diff=0.01464
    iter=7 err=0.07000 F=0.99168 target=468.60587 diff=0.00954
    iter=8 err=0.08000 F=0.99070 target=466.45814 diff=0.00458
    iter=9 err=0.07000 F=0.99266 target=465.97983 diff=0.00103
    iter=10 err=0.07000 F=0.99266 target=465.55008 diff=0.00092
    iter=11 err=0.06000 F=0.99364 target=465.29456 diff=0.00055
    iter=12 err=0.06000 F=0.99364 target=465.03189 diff=0.00056
    iter=13 err=0.06000 F=0.99364 target=464.84768 diff=0.00040
    iter=14 err=0.06000 F=0.99364 target=464.71818 diff=0.00028
    iter=15 err=0.06000 F=0.99364 target=464.59071 diff=0.00027
    iter=16 err=0.06000 F=0.99364 target=464.53703 diff=0.00012
    iter=17 err=0.06000 F=0.99364 target=464.50074 diff=0.00008
    iter=18 err=0.06000 F=0.99364 target=464.48284 diff=0.00004
    iter=19 err=0.06000 F=0.99364 target=464.45312 diff=0.00006
    iter=20 err=0.06000 F=0.99364 target=464.43718 diff=0.00003
    iter=21 err=0.06000 F=0.99364 target=464.43268 diff=0.00001
    iter=22 err=0.06000 F=0.99364 target=464.41177 diff=0.00005

    Done! writing model file ...

    接下来我们新建一个目录用于新的模型和词典数据发布:

    mkdir mecab_chinese_data_v0.3

    然后执行如下命令生成用于发布的词典:

    $ /usr/local/libexec/mecab/mecab-dict-gen -d mecab_chinese_data_v0.2 -o mecab_chinese_data_v0.3 -m new_model

    执行过程如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    new_model is not a binary model. reopen it as text mode...
    reading mecab_chinese_data_v0.2/unk.def ... 11
    reading mecab_chinese_data_v0.2/add.csv ... 9
    reading mecab_chinese_data_v0.2/company_name.csv ... 678
    reading mecab_chinese_data_v0.2/nlpjob.csv ... 203
    reading mecab_chinese_data_v0.2/words.csv ... 1101507
    emitting mecab_chinese_data_v0.3/left-id.def/ mecab_chinese_data_v0.3/right-id.def
    emitting mecab_chinese_data_v0.3/unk.def ... 11
    emitting mecab_chinese_data_v0.3/add.csv ... 9
    emitting mecab_chinese_data_v0.3/company_name.csv ... 678
    emitting mecab_chinese_data_v0.3/nlpjob.csv ... 203
    emitting mecab_chinese_data_v0.3/words.csv ... 1101507
    emitting matrix      : 100% |###########################################|
    copying mecab_chinese_data_v0.2/char.def to mecab_chinese_data_v0.3/char.def
    copying mecab_chinese_data_v0.2/rewrite.def to mecab_chinese_data_v0.3/rewrite.def
    copying mecab_chinese_data_v0.2/dicrc to mecab_chinese_data_v0.3/dicrc
    copying mecab_chinese_data_v0.2/feature.def to mecab_chinese_data_v0.3/feature.def
    copying new_model to mecab_chinese_data_v0.3/model.def

    done!

    最后我们建一个最终用于发布的二进制词典和模型的目录;
    mkdir mecab_chinese_data_binary_v0.3

    执行如下命令生成相关的二进制文件:

    /usr/local/libexec/mecab/mecab-dict-index -f utf8 -t utf8 -d mecab_chinese_data_v0.3 -o mecab_chinese_data_binary_v0.3
    执行过程如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mecab_chinese_data_v0.3/pos-id.def is not found. minimum setting is used
    reading mecab_chinese_data_v0.3/unk.def ... 11
    emitting double-array: 100% |###########################################|
    mecab_chinese_data_v0.3/pos-id.def is not found. minimum setting is used
    reading mecab_chinese_data_v0.3/add.csv ... 9
    reading mecab_chinese_data_v0.3/company_name.csv ... 678
    reading mecab_chinese_data_v0.3/nlpjob.csv ... 203
    reading mecab_chinese_data_v0.3/words.csv ... 1101507
    emitting double-array: 100% |###########################################|
    reading mecab_chinese_data_v0.3/matrix.def ... 275x275
    emitting matrix      : 100% |###########################################|

    done!

    注意在mecab_chinese_data_binary_v0.3目录下生成了5个二进制文件char.bin,matrix.bin,model.bin,sys.dic, unk.dic,但是还缺少一个dicrc方能使用,从mecab_chinese_data_v0.3下拷贝一个即可。这个时候,可以测试一下:

    mecab -d mecab_chinese_data_binary_v0.3/
    NLPJob关注“自然语言处理|机器学习|数据挖掘|搜索引擎|计算广告|推荐算法”等相关互联网领域的工作机会。
    NLPJob n,nt,BMMMME,6,NLPJob,_____,NLPJob
    关注 v,v,BE,2,关注,guan_zhu,關註
    “ w,w,S,1,“,“,“
    自然 a,a,BE,2,自然,zi_ran,自然
    语言 n,n,BE,2,语言,yu_yan,語言
    处理 v,v,BE,2,处理,chu_li,處理
    | unk,unk,*,*,*,*,*
    机器 n,n,BE,2,机器,ji_qi,機器
    学习 v,v,BE,2,学习,xue_xi,學習
    | unk,unk,*,*,*,*,*
    数据 n,n,BE,2,数据,shu_ju,數據
    挖掘 v,v,BE,2,挖掘,wa_jue,挖掘
    | unk,unk,*,*,*,*,*
    搜索引擎 n,n,BMME,4,搜索引擎,sou_suo_yin_qing,搜索引擎
    | unk,unk,*,*,*,*,*
    计算 v,v,BE,2,计算,ji_suan,計算
    广告 n,n,BE,2,广告,guang_gao,廣告
    | unk,unk,*,*,*,*,*
    推荐 v,v,BE,2,推荐,tui_jian,推薦
    算法 n,n,BE,2,算法,suan_fa,算法
    ” w,w,S,1,”,”,”
    等 u,u,S,1,等,deng,等
    相关 v,vn,BE,2,相关,xiang_guan,相關
    互联网 n,n,BME,3,互联网,hu_lian_wang,互聯網
    领域 n,n,BE,2,领域,ling_yu,領域
    的 u,u,S,1,的,de,的
    工作 v,vn,BE,2,工作,gong_zuo,工作
    机会 n,n,BE,2,机会,ji_hui,機會
    。 w,w,S,1,。,。,。
    EOS

    感兴趣的同学也可以在我们的demo上试用一下这个版本的效果:MeCab中文分词Demo

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

    本文链接地址:http://www.52nlp.cn/?p=8660

    相关文章:

    1. 用MeCab打造一套实用的中文分词系统(三):MeCab-Chinese
    2. 用MeCab打造一套实用的中文分词系统(二)
    3. 用MeCab打造一套实用的中文分词系统
    4. NLPJob 主站上线
    5. NLP Job-缘起
    6. 中文分词入门之文献
    7. 中文分词入门之字标注法全文文档
    8. Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器
    9. 推荐张华平老师的中文分词工具ICTCLAS2010
    10. 中文分词入门之篇外



沪ICP备19023445号-2号
友情链接