CRF++: Yet Another CRF toolkit

Introduction

CRF++ is a simple, customizable, and open source implementation of Conditional Random Fields (CRFs) for segmenting/labeling sequential data. CRF++ is designed for generic purpose and will be applied to a variety of NLP tasks, such as Named Entity Recognition, Information Extraction and Text Chunking.

Table of contents

Features

News

Download

Installation

Usage

Training and Test file formats

Both the training file and the test file need to be in a particular format for CRF++ to work properly. Generally speaking, training and test file must consist of multiple tokens. In addition, a token consists of multiple (but fixed-numbers) columns. The definition of tokens depends on tasks, however, in most of typical cases, they simply correspond to words. Each token must be represented in one line, with the columns separated by white space (spaces or tabular characters). A sequence of token becomes a sentence. To identify the boundary between sentences, an empty line is put.

You can give as many columns as you like, however the number of columns must be fixed through all tokens. Furthermore, there are some kinds of "semantics" among the columns. For example, 1st column is 'word', second column is 'POS tag' third column is 'sub-category of POS' and so on.

The last column represents a true answer tag which is going to be trained by CRF.

Here's an example of such a file: (data for CoNLL shared task)

He        PRP  B-NP
reckons   VBZ  B-VP
the       DT   B-NP
current   JJ   I-NP
account   NN   I-NP
deficit   NN   I-NP
will      MD   B-VP
narrow    VB   I-VP
to        TO   B-PP
only      RB   B-NP
#         #    I-NP
1.8       CD   I-NP
billion   CD   I-NP
in        IN   B-PP
September NNP  B-NP
.         .    O

He        PRP  B-NP
reckons   VBZ  B-VP
..

There are 3 columns for each token.

The following data is invalid, since the number of columns of second and third are 2. (They have no POS column.) The number of columns should be fixed.

He        PRP  B-NP
reckons   B-VP
the       B-NP
current   JJ   I-NP
account   NN   I-NP
..

Preparing feature templates

As CRF++ is designed as a general purpose tool, you have to specify the feature templates in advance. This file describes which features are used in training and testing.

Input: Data
He        PRP  B-NP
reckons   VBZ  B-VP
the       DT   B-NP << CURRENT TOKEN
current   JJ   I-NP 
account   NN   I-NP

template expanded feature
%x[0,0] the
%x[0,1] DT
%x[-1,0] reckons
%x[-2,1] PRP
%x[0,0]/%x[0,1] the/DT
ABC%x[0,1]123 ABCDT123

  • Template type
  • Note also that there are two types of templates. The types are specified with the first character of templates.

    func1 = if (output = B-NP and feature="U01:DT") return 1 else return 0
    func2 = if (output = I-NP and feature="U01:DT") return 1 else return 0
    func3 = if (output = O and feature="U01:DT") return 1  else return 0
    ....
    funcXX = if (output = B-NP and feature="U01:NN") return 1  else return 0
    funcXY = if (output = O and feature="U01:NN") return 1  else return 0
    ...

    The number of feature functions generated by a template amounts to (L * N), where L is the number of output classes and N is the number of unique string expanded from the given template.

  • Bigram template: first character, 'B'
  • This is a template to describe bigram features. With this template, a combination of the current output token and previous output token (bigram) is automatically generated. Note that this type of template generates a total of (L * L * N) distinct features, where L is the number of output classes and N is the number of unique features generated by the templates. When the number of classes is large, this type of templates would produce a tons of distinct features that would cause inefficiency both in training/testing.

  • What is the diffrence between unigram and bigram features?
  • The words unigram/bigram are confusing, since a macro for unigram-features does allow you to write word-level bigram like %x[-1,0]%x[0,0]. Here, unigram and bigram features mean uni/bigrams of output tags.

  • Identifiers for distinguishing relative positions
  • You also need to put an identifier in templates when relative positions of tokens must be distinguished.

    In the following case, the macro "%x[-2,1]" and "%x[1,1]" will be replaced into "DT". But they indicates different "DT".

    The       DT  B-NP
    pen       NN  I-NP
    is        VB  B-VP << CURRENT TOKEN
    a         DT  B-NP
    

    To distinguish both two, put an unique identifier (U01: or U02:) in the template:

    U01:%x[-2,1]
    U02:%x[1,1]
    

    In this case both two templates are regarded as different ones, as they are expanded into different features, "U01:DT" and "U02:DT". You can use any identifier whatever you like, but it is useful to use numerical numbers to manage them, because they simply correspond to feature IDs.

    If you want to use "bag-of-words" feature, in other words, not to care the relative position of features, You don't need to put such identifiers.

  • Example
  • Here is the template example for CoNLL 2000 shared task and Base-NP chunking task. Only one bigram template ('B') is used. This means that only combinations of previous output token and current token are used as bigram features. The lines starting from # or empty lines are discarded as comments

    # 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]
    
    # Bigram
    B
    

    Training (encoding)

    Use crf_learn command:

    % crf_learn template_file train_file model_file
    

    where template_file and train_file are the files you need to prepare in advance. crf_learn generates the trained model file in model_file.

    crf_learn outputs the following information.

    CRF++: Yet Another CRF Tool Kit
    Copyright(C) 2005 Taku Kudo, All rights reserved.
    
    reading training data: 100.. 200.. 300.. 400.. 500.. 600.. 700.. 800.. 
    Done! 1.94 s
    
    Number of sentences: 823
    Number of features:  1075862
    Number of thread(s): 1
    Freq:                1
    eta:                 0.00010
    C:                   1.00000
    shrinking size:      20
    Algorithm:           CRF
    
    iter=0 terr=0.99103 serr=1.00000 obj=54318.36623 diff=1.00000
    iter=1 terr=0.35260 serr=0.98177 obj=44996.53537 diff=0.17161
    iter=2 terr=0.35260 serr=0.98177 obj=21032.70195 diff=0.53257
    iter=3 terr=0.23879 serr=0.94532 obj=13642.32067 diff=0.35138
    iter=4 terr=0.15324 serr=0.88700 obj=8985.70071 diff=0.34134
    iter=5 terr=0.11605 serr=0.80680 obj=7118.89846 diff=0.20775
    iter=6 terr=0.09305 serr=0.72175 obj=5531.31015 diff=0.22301
    iter=7 terr=0.08132 serr=0.68408 obj=4618.24644 diff=0.16507
    iter=8 terr=0.06228 serr=0.59174 obj=3742.93171 diff=0.18953
    

    There are 4 major parameters to control the training condition

    Here is the example where these two parameters are used.

    % crf_learn -f 3 -c 1.5 template_file train_file model_file
    

    Since version 0.45, CRF++ supports single-best MIRA training. MIRA training is used when -a MIRA option is set.

    % crf_learn -a MIRA template train.data model
    CRF++: Yet Another CRF Tool Kit
    Copyright(C) 2005 Taku Kudo, All rights reserved.
    
    reading training data: 100.. 200.. 300.. 400.. 500.. 600.. 700.. 800.. 
    Done! 1.92 s
    
    Number of sentences: 823
    Number of features:  1075862
    Number of thread(s): 1
    Freq:                1
    eta:                 0.00010
    C:                   1.00000
    shrinking size:      20
    Algorithm:           MIRA
    
    iter=0 terr=0.11381 serr=0.74605 act=823 uact=0 obj=24.13498 kkt=28.00000
    iter=1 terr=0.04710 serr=0.49818 act=823 uact=0 obj=35.42289 kkt=7.60929
    iter=2 terr=0.02352 serr=0.30741 act=823 uact=0 obj=41.86775 kkt=5.74464
    iter=3 terr=0.01836 serr=0.25881 act=823 uact=0 obj=47.29565 kkt=6.64895
    iter=4 terr=0.01106 serr=0.17011 act=823 uact=0 obj=50.68792 kkt=3.81902
    iter=5 terr=0.00610 serr=0.10085 act=823 uact=0 obj=52.58096 kkt=3.98915
    iter=0 terr=0.11381 serr=0.74605 act=823 uact=0 obj=24.13498 kkt=28.00000
    ...
    

    There are some parameters to control the MIRA training condition

    Testing (decoding)

    Use crf_test command:

    % crf_test -m model_file test_files ...
    

    where model_file is the file crf_learncreates. In the testing, you don't need to specify the template file, because the model file has the same information for the template. test_file is the test data you want to assign sequential tags. This file has to be written in the same format as training file.

    Here is an output of crf_test:

    % crf_test -m model test.data
    Rockwell        NNP     B       B
    International   NNP     I       I
    Corp.   NNP     I       I
    's      POS     B       B
    Tulsa   NNP     I       I
    unit    NN      I       I
    ..
    

    The last column is given (estimated) tag. If the 3rd column is true answer tag , you can evaluate the accuracy by simply seeing the difference between the 3rd and 4th columns.

    % crf_test -n 20 -m model test.data
    # 0 0.478113
    Rockwell        NNP     B       B
    International   NNP     I       I
    Corp.   NNP     I       I
    's      POS     B       B
    ...
    
    # 1 0.194335
    Rockwell        NNP     B       B
    International   NNP     I       I
    

    Tips

    Case studies

    In the example directories, you can find three case studies, baseNP chunking, Text Chunking, and Japanese named entity recognition, to use CRF++.

    In each directory, please try the following commands

     % crf_learn template train model
     % crf_test  -m model test 

    To Do

    References


    $Id: index.html,v 1.23 2003/01/06 13:11:21 taku-ku Exp $;

    [email protected]