美文网首页NLP
CRF++ for NER

CRF++ for NER

作者: ChiuChiu尖尖碰碰拳 | 来源:发表于2017-11-08 09:41 被阅读0次

    CRF++

    ( 空格分隔): nlp


    [TOC]

    http://x-algo.cn/index.php/2016/02/29/crf-name-entity-recognition/#i

    使用说明

    安装

    template

    模板说明: http://www.hankcs.com/nlp/the-crf-model-format-description.html

    jieba 结巴分词和词性标注:

    http://www.mamicode.com/info-detail-1889910.html

    训练模型

    • 不带参数:
      crf_learn template_file train_file model_file
      这个训练过程的时间、迭代次数等信息会输出到控制台上

    • 如果想保存这些信息,我们可以将这些标准输出流到文件上,命令格式如下:
      crf_learn template_file train_file model_file > train_info_file

    • 带参数
      crf_learn -a CRF-L2 -c 4.0 -f 3 -p 4 template train.data model

        -a CRF-L2 or CRF-L1     
        规范化算法选择。默认是CRF-L2。一般来说L2算法效果要比L1算法稍微好一点,虽然L1算法中非零特征的数值要比L2中大幅度的小。
        -c float
        这个参数设置CRF的hyper-parameter。c的数值越大,CRF拟合训练数据的程度越高。这个参数可以调整过度拟合和不拟合之间的平衡度。这个参数可以通过交叉验证等方法寻找较优的参数。
        -f NUM
        这个参数设置特征的cut-off threshold。CRF++使用训练数据中至少NUM次出现的特征。默认值为1。当使用CRF++到大规模数据时,只出现一次的特征可能会有几百万,这个选项就会在这样的情况下起到作用。
        -p NUM
        如果电脑有多个CPU,那么那么可以通过多线程提升训练速度。NUM是线程数量。
        -f, --freq=INT   使用属性的出现次数不少于INT(默认为1)
        -m, --maxiter=INT   设置INT为LBFGS的最大跌代次数(默认10k)
        -c, --cost=FLOAT   设置FLOAT为代价参数,过大会过度拟合(默认1.0)
        -e, --eta=FLOAT   设置终止标准FLOAT(默认0.0001)
        -C, --convert   将文本模式转为二进制模式
        -t, --textmodel   为调试建立文本模型文件
        -a, --algorithm=(CRF|MIRA)   选择训练算法,CRF-L2 or CRF-L1,默认为CRF-L2
        -p, --thread=INT   线程数(默认1),利用多个CPU减少训练时间
        -H, --shrinking-size=INT   设置INT为最适宜的跌代变量次数(默认20)
        -v, --version   显示版本号并退出
        -h, --help   显示帮助并退出
      

    测试

    • 不带参数:
      crf_test -m model_file test_files
      与crf_learn类似,输出的结果放到了标准输出流上
    • 而这个输出结果是最重要的预测结果信息(测试文件的内容+预测标注),同样可以使用重定向,将结果保存下来,命令行如下:
      crf_test -m model_file test_files >> result_file
    • 带参数:
      crf_test -v1 -m model test.data| head
      有两个参数-v和-n都是显示一些信息的,
      -v,可以显示预测标签的概率值
      -n,可以显示不同可能序列的概率值,对于准确率,召回率,运行效率,没有影响

    评估结果

    • 安装 perl strawberry 64bit for windows

    • 下载 conlleval.pl

    • 运行命令:
      perl conlleval.pl <result.txt
      result.txt是待评估的文件,是crf测试集输出的结果

    • 注意:
      conlleval.pl中代码my $delimiter = " "; # field delimiter要求待评估的文件,必须是以空格作为分隔符,否则运行命令出错:
      conlleval: unexpected number of features in line XXX XX XX
      参考说明:http://www.52ml.net/2463.html

    • 解决方法1:将conlleval.pl中的空格分隔符改为tab,即:my $delimiter = "[空格]"替换为my $delimiter = "[tab]"

    • 解决方法2:将result.txt中的tab分隔符改为空格

    实验结果

    Windows 10 , python 2.7
    处理步骤:

    1. 原始语料处理
      一句一行
      *可选:去除{{time:}}等标记
    2. 打标签 BMEUNS
    3. 切分训练集和测试集
    4. 调整crf++的template
    5. 训练,调参
    6. 测试
    7. 评估

    word+POS+Tag(B/M/E/U/NS)

    • 去掉了原始语料中的{{time:}}等符号 , pos+tag
    娃哈哈 nz  B
    集团  n   E
    在   p   NS
    黔   j   U
    发展  vn  NS
    近十年 l   U
    ,   x   NS
    见证  v   NS
    了   ul  NS
    贵州  ns  U
    发展  vn  NS
    取得  v   NS
    的   uj  NS
    巨大  a   NS
    成绩  n   NS
    。   x   NS
    
    
    • template
    # Unigram
    U00:%x[-2,0]
    U01:%x[-1,0]
    U02:%x[0,0]
    U03:%x[1,0]
    U04:%x[2,0]
    U05:%x[-1,0]/%x[0,0]
    U06:%x[0,0]/%x[1,0]
    
    U10:%x[-2,1]
    U11:%x[-1,1]
    U12:%x[0,1]
    U13:%x[1,1]
    U14:%x[2,1]
    U15:%x[-2,1]/%x[-1,1]
    U16:%x[-1,1]/%x[0,1]
    U17:%x[0,1]/%x[1,1]
    U18:%x[1,1]/%x[2,1]
    
    U20:%x[-2,1]/%x[-1,1]/%x[0,1]
    U21:%x[-1,1]/%x[0,1]/%x[1,1]
    U22:%x[0,1]/%x[1,1]/%x[2,1]
    
    U23:%x[0,1]
    
    # Bigram
    B
    
    

    Done!179.61 s

    image.png

    POS+dictionary

    • userDic

    浙江在线绍兴 100 nr
    福美来三代启停版 100 nr
    搜狗 100 nr
    岳飞 100 nr
    搜狐 100 nr

    • 原始语料未作清洗,POS+tag
    娃   nz  B
    哈   nz  I
    哈   nz  I
    集   n   O
    团   n   O
    }   x   O
    }   x   O
    在   p   O
    {   x   O
    {   x   O
    l   eng O
    o   eng O
    c   eng O
    a   eng O
    t   eng O
    i   eng O
    o   eng O
    n   eng O
    :   x   O
    黔   j   O
    }   x   O
    }   x   O
    发   vn  O
    展   vn  O
    
    • template 同上

    Done!70.12 s

    image.png

    分词没有添加词典

    template同上

    娃   nz  B
    哈   nz  I
    哈   nz  I
    集   n   O
    团   n   O
    }   x   O
    }   x   O
    在   p   O
    {   x   O
    {   x   O
    l   eng O
    o   eng O
    c   eng O
    a   eng O
    t   eng O
    i   eng O
    o   eng O
    n   eng O
    :   x   O
    黔   j   O
    }   x   O
    }   x   O
    发   vn  O
    展   vn  O
    

    ???词性标注和前面加载了词典一样

    Done!88.84 s

    image.png

    强行修改标签


    image.png

    noSeg , 词性POS

    娃   POS B
    哈   POS I
    哈   POS I
    集   POS I
    团   POS I
    }   POS 0
    }   POS 0
    在   POS 0
    {   POS 0
    {   POS 0
    l   POS 0
    o   POS 0
    c   POS 0
    a   POS 0
    t   POS 0
    i   POS 0
    o   POS 0
    n   POS 0
    :   POS 0
    黔   POS B
    }   POS 0
    }   POS 0
    发   POS 0
    展   POS 0
    

    template同上

    Done!175.85 s


    image.png

    noPOS+template

    娃   B
    哈   I
    哈   I
    集   I
    团   I
    }   0
    }   0
    在   0
    {   0
    {   0
    l   0
    o   0
    c   0
    a   0
    t   0
    i   0
    o   0
    n   0
    :   0
    黔   B
    }   0
    }   0
    发   0
    展   0
    

    设置template

    # Unigram
    U00:%x[-2,0]
    U01:%x[-1,0]
    U02:%x[0,0]
    U03:%x[1,0]
    U04:%x[2,0]
    U05:%x[-2,0]/%x[-1,0]/%x[0,0]
    U06:%x[-1,0]/%x[0,0]/%x[1,0]
    U07:%x[0,0]/%x[1,0]/%x[2,0]
    U08:%x[-1,0]/%x[0,0]
    U09:%x[0,0]/%x[1,0]
     
    # Bigram
    B
    

    结果:
    Done!77.47 s


    image.png

    总结

    feature time precision recall FB1
    c_noPOS-BIO 175.85s 86.46% 82.18% 84.26
    c_noPOS+template-BIO 77.47s 86.73% 84.16% 85.43
    c_POS(noDic)-BIO 88.84 92.08% 92.08% 92.08
    c_POS+dic-BIO 70.12s 98.96% 98.73% 98.85
    w_POS(noDic)-BMEUNs 179.61s 99.80% 99.52% 99.66

    c_表示一字一行处理的, w表示一词一行

    疑问

    添加词典与否事实上结果一样,上文的结果不相同是因为强行对训练集和测试集对的BIO标签进行了修改,命名实体的完全是BI。如果自动分词,粒度较细,实体标签不一定完全正确。

    • 修改标签以后,92.08
    n   eng 0
    a   eng 0
    m   eng 0
    e   eng 0
    :   x   0
    浙   nr  B
    江   nr  I
    在   nr  I
    线   nr  I
    杭   nr  I
    州   nr  I
    }   x   0
    }   x   0
    
    • 没有修改标签,98.85
    n   eng O
    a   eng O
    m   eng O
    e   eng O
    :   x   O
    浙   ns  B
    江   ns  I
    在   b   O
    线   b   O
    杭   ns  B
    州   ns  I
    }   x   O
    }   x   O
    
    • 预料中给定的NER是否是NER?

    {{location:河北省邯郸市火车站过街天桥南约100米}}的路西,十几个男子围成一团,气氛很是热烈。

    {{product_name:嘻嘻MACWE书包中学生女双肩包男女背包韩版潮学院风旅行包帆布电脑包}}{{product_name:http://t.cn/8sSfk0S}}

    嘻嘻{{company_name:MACWE}}书包中学生女双肩包男女背包{{location:韩}}版潮学院风旅行包帆布电脑包{{product_name:http://t.cn/8sSfk0S}}

    相关文章

      网友评论

        本文标题:CRF++ for NER

        本文链接:https://www.haomeiwen.com/subject/npermxtx.html