• 用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
  • 相关阅读:
    HttpClient
    Android子线程访问网络
    PhoneURLConnectGEt
    PhoneHttpGet
    PhoneNote
    SQLite
    书单
    通过Web预测网页出版日期的学习
    LeetCode-Maximum Subarray[dp]
    LeetCode-Triangle[dp]
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/9960517.html
Copyright © 2020-2023  润新知