本文只介绍如何快速的使用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

用CRF++开源工具做文本序列标注教程的更多相关文章

  1. Bi-LSTM+CRF在文本序列标注中的应用

    传统 CRF 中的输入 X 向量一般是 word 的 one-hot 形式,前面提到这种形式的输入损失了很多词语的语义信息.有了词嵌入方法之后,词向量形式的词表征一般效果比 one-hot 表示的特征 ...

  2. DevOps开源工具的三种分类整理

    原文地址:http://www.360doc.com/content/16/0322/07/31263000_544210096.shtml 随着开发运维一体化的DevOps运动在国内外蓬勃发展,De ...

  3. 序列标注(HMM/CRF)

    目录 简介 隐马尔可夫模型(HMM) 条件随机场(CRF) 马尔可夫随机场 条件随机场 条件随机场的特征函数 CRF与HMM的对比 维特比算法(Viterbi) 简介 序列标注(Sequence Ta ...

  4. 基于CRF序列标注的中文依存句法分析器的Java实现

    这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(DoubleArrayTrie)储存,解码采用特化的维特比后向算法.相较于<最大熵依存句法分析器的实现&g ...

  5. DL4NLP —— 序列标注:BiLSTM-CRF模型做基于字的中文命名实体识别

    三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...

  6. NLP之CRF应用篇(序列标注任务)

    1.CRF++的详细解析 完成的是学习和解码的过程:训练即为学习的过程,预测即为解码的过程. 模板的解析: 具体参考hanlp提供的: http://www.hankcs.com/nlp/the-cr ...

  7. TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载

    http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...

  8. ALBERT+BiLSTM+CRF实现序列标注

    一.模型框架图 二.分层介绍 1)ALBERT层 albert是以单个汉字作为输入的(本次配置最大为128个,短句做padding),两边分别加上开始标识CLS和结束标识SEP,输出的是每个输入wor ...

  9. CNN做序列标注问题(tensorflow)

    一.搭建简单的CNN做序列标注代码 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt TIME_ST ...

随机推荐

  1. Linux 各个版本之间的差别

    一直没有搞清楚RHEL,CentOS,,还有Ubuntu,fedora这些版本之间的差别,搜了一下,整理到这里,备忘吧. 我最关心的: 1, CentOS是在RHEL基础上的免费版: 2, Ubunt ...

  2. A Tutorial on Network Embeddings

    A Tutorial on Network Embeddings paper:https://arxiv.org/abs/1808.02590   NE 的中心思想就是找到一种映射函数,该函数将网络中 ...

  3. linux命令(13):kill/killall命令

    停止指定的进程名:kill 进程ID号 把所有httpd进程杀掉:killall httpd 强制停止进程mysqld:killall -9 mysqld

  4. Vuex ~ 初识

    状态:data中的属性需要共享给其他vue组件使用的部分(即data中需要共用的属性)   1.初识vuex直接来个小demo 下面操作都是基于vue-cli,如果不了解先学习下vue-cli 利用n ...

  5. centos7.5英文环境切换到中文环境,再切回中文环境后 ,terminal不能用

    1.查看系统日志 less /var/logs/message May 12 21:54:41 localhost python: SELinux is preventing /usr/libexec ...

  6. 《TDD》-火花

    1,规定对天才来说多余,对蠢才来说无效,只对中间这一部分有用(我至今没见到过天才,蠢才到是不少) 2,设计上顿悟的火花一闪而过,没有规律可循.良好的测试无法保证你在需要的时候灵感乍现,但是给人信心的良 ...

  7. PAT L3-001. 凑零钱

    $01$背包,路径记录,贪心. 可以将物品从大到小排序之后进行背包,同时记录路径. #include<map> #include<set> #include<ctime& ...

  8. go chapter 8 - 初始化对象

    http://blog.haohtml.com/archives/14239 struct定义的属性如果是小写开头的,那么该属性不是public的,不能跨包调用 (implicit assignmen ...

  9. POJ 3662 Telephone Lines (分层图)

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6785   Accepted: 2498 D ...

  10. Python开发基础-Day20继承实现原理、子类调用父类的方法、封装

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...