zoukankan      html  css  js  c++  java
  • 用CRF++开源工具做文本序列标注教程

    本文只介绍如何快速的使用CRF++做序列标注,对其中的原理和训练测试参数不做介绍。

    官网地址:CRF++: Yet Another CRF toolkit

    主要完成如下功能:

    输入 -> "周杰伦是谁"
    输出 -> "[周杰伦:artist]是谁"
    

    以下所有内容均为原创,如果觉得本教程不错的话,点个赞再走呗~

    一、资源准备

    下载链接中的内容:

    链接:https://pan.baidu.com/s/16iw3WBSHI1U5U1G_xbikDA 密码:cfqi
    

    该文件夹里面包含了以下内容:

    1、CRF++-0.58.tar.gz,CRF++开源工具,这个是从CRF++官网上下载的。

    2、data文件夹,训练和测试需要的数据,这个是我自己写的,其中:

    • input文件夹,存放所需要的数据:
      train_data.txt,训练数据,这里只有几条作为示例,实际工程中,需要上万条数据;
      test_data.txt,测试数据;
      crf.template,特征模板。
    • output文件夹 -> 输出的模型和测试结果。

    3、code文件夹,C++调用CRF++接口的代码示例,这个是我自己写的。

    二、CRF++的编译

    按照如下命令进行:

    tar zxvf CRF++-0.58.tar.gz
    cd CRF++-0.58
    ./configure
    make
    sudo make install
    

    这时候就编译安装成功了。

    cd /usr/local/bin      
    cd /usr/local/lib                      
    

    切换到上面这两个目录,bin目录下可以看到crf_learn和crf_test两个可执行程序,分别用于模型的训练和测试; lib目录下是生成的CRF++库。

    //备注1:CRF++-0.58/.libs,这个目录下也有生成上述可执行程序和库。
    //备注2:如果不想安装到上述目录,或者没有root权限,在configure的时候指定安装目录即可。
    

    三、模型训练

    按照如下命令进行:

    cd CRF++_tutorial/data
    ./train.sh
    

    这样,我们就得到了模型,即output/crf.mdl文件,这个文件是二进制的没办法查看。

    train.sh脚本内容如下:

    #/usr/local/bin/crf_learn: 前面编译生成的crf++的训练工具
    #input/crf.template: 特征模板
    #input/train_data.txt: 训练数据
    #output/crf.mdl: 训练输出的模型
    
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
    /usr/local/bin/crf_learn input/crf.template input/train_data.txt output/crf.mdl
    

    训练数据格式如下:

    四、测试

    按照如下命令进行:

    cd CRF++_tutorial/data 
    ./test.sh 
    

    这样,我们就得到了预测的结果,即output/test_result.txt文件,可以打开看下预测结果。

    test.sh脚本内容如下:

    #/usr/local/bin/crf_test: 前面编译生成的crf++的测试工具
    #-m output/crf.mdl: train.sh脚本训练输出的crf模型
    #input/test_data.txt: 测试数据
    #-o output/test_result.txt: 输出测试结果 
    
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
    /usr/local/bin/crf_test -m output/crf.mdl input/test_data.txt -o output/test_result.txt
    

    测试数据格式如下(testdata和traindata需要用相同的编码格式,不然没法解析):

    测试结果如下,虽然训练数据只有几条,但测试结果还是挺准的哈:

    五、C++接口调用示例

    按照如下命令进行:

    cd CRF++_tutorial/code
    cmake .
    make
    ./crf_test
    

    程序输出结果如下:

    具体调用流程请参考CRF++_tutorial/code/main.cpp

    代码如下:

    #include <iostream>
    #include <string>
    #include <vector>
    #include "crfpp.h"
    
    using namespace std;
    
    int main()
    {
        //> 0.测试输入
        vector<string> query;
        query.push_back("周");
        query.push_back("杰");
        query.push_back("伦");
        query.push_back("是");
        query.push_back("谁");
    
        //> 1.模型加载
        cout << ">>>>>> Begin to load crf++ model……" << endl;
        CRFPP::Model* crf_model_ = CRFPP::createModel("-m ../data/output/crf.mdl -v 3");
        cout << ">>>>>> Success to load crf++ model !" << endl;
        
        //> 2.创建CRF++对象
        CRFPP::Tagger* tagger = crf_model_->createTagger();
    
        //> 3.add query
        vector<string>::iterator it = query.begin();
        for ( ; it != query.end(); it++){
            tagger->add((*it).c_str());
        }
    
        //< 4.对query进行标注
        if (!tagger->parse()){
            cout << ">>>>>> Fail to parse !" << endl;
            return -1;
        }
    
        //> 5.打印标注结果
        cout << "标注结果: " << endl;
        for (size_t i = 0; i < tagger->size(); i++){
            cout << query[i] << " " << tagger->y2(i) << endl;
        }
    
        return 0;
    }

    from: https://zhuanlan.zhihu.com/p/39695509
  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/9960517.html
Copyright © 2011-2022 走看看