CRF+0.58训练NE模型失败

The failure in using CRF+0.58 train NE Model

当我使用CRF++0.58建模NE时程序出现问题:

"reading training data:tagger.cpp(399) [feature_index_->buildFeatures(this)] 0.00s"

  1. 开发环境:
    • 红帽 linux 6.5,gcc 5.0,CRF++0.58
  2. 书面特征模板:
    • 模板
  3. 数据集:
    • Boson_train.txt
    • Boson_test.txt
    • 第一列是words,第二列是pos,第三列是NER tagger
  4. 问题:
    • 当我想训练 NER 模型时,我输入这句话 "crf_learn -f 3 -c 4.0 template Boson_train crf_model",我得到了 此通知,"reading training data:tagger.cpp(399) [feature_index_->buildFeatures(this)] 0.00s"。我不明白 C++ 语言,所以我无法解决问题。
  5. 我试过的方法:
    • 1.change数据集的编码类型。我用notepad++把"utf-8 with no BOM"改成了"utf-8"。没用。
    • 2.change'\t'到''的分隔符(space)。没用。
    • 3.And 我认为模板可能是 wrong.So 我使用 crf++0.58/example/seg/template 进行测试。有效。但是这个模板 很简单,所以我用的是/example/JapaneseNE/template,和我的特征模板比较相似。它没有用。然后,我检查 JapaneseNE example 它运行良好。所以我很困惑。有没有人可以帮帮我。
  6. 模板

    • 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]

    • U10:%x[-2,1]/%x[0,1]

    • U11:%x[-2,1]/%x[1,1]
    • U11:%x[-1,1]/%x[0,1]
    • U12:%x[0,0]/%x[0,1]
    • U13:%x[0,1]/%x[1,1]
    • U14:%x[0,1]/%x[2,1]
    • U15:%x[-1,0]/%x[0,1]
    • U16:%x[-1,0]/%x[-1,1]
    • U17:%x[1,0]/%x[1,1]
    • U18:%x[1,0]/%x[1,1]
    • U19:%x[2,0]/%x[2,1]

    • U20:%x[-1,2]

    • U21:%x[-2,2]
    • U22:%x[0,1]/%x[-1,2]
    • U23:%x[0,1]/%x[-2,2]
    • U24:%x[0,0]/%x[-1,2]
    • U25:%x[0,0]/%x[-2,2]
    • U26:%x[-1,2]/%x[-2,2]/%x[0,1]
    • U27:%x[-2,2]/%x[0,1]/%x[1,1]
    • U28:%x[-1,1]/%x[-1,2]/%x[0,1]
    • U29:%x[-1,2]/%x[0,0]/%x[0,1]
  7. Boson_train
    • 浙江ns B_product_name
    • 在线b I_product_name
    • 杭州 ns I_product_name
    • 4米B_time
    • 月米I_time
    • 25米I_time
    • 日米I_time
    • 消息输出
    • ( x 输出
    • 记者n出
    • x 输出
    • x B_person_name
    • 施宇翔nr I_person_name
    • x 输出
    • 通讯员 n B_person_name
    • x 输出
    • 方英nr B_person_name
    • ) x 输出
    • 毒贩n出
    • 非常zg Out
    • “x输出
    • 时辰nr Out
    • ” x 输出
    • ,x输出
    • 用p输出
    • 微信 vn B_product_name
    • 交易n Out
    • 毒品n出
    • 。 x输出
    • 没v出
    • 料想v出
    • 警方n B_person_name
    • 也d出

您的调试方向正确。问题确实出在您的模板文件上。

您的训练数据有 3 列(第 0 列:word、第 1 列:pos-tag 和第 2 列:tag)。

您不能将 tag 用作特征,但您的模板文件在许多特征定义中都引用了它(即第 2 列)(参见 U20 至 U29)。你的训练应该在 removing/correcting 这些之后起作用。

希望这对您有所帮助:)

您还可以查看这些视频教程,以更好地理解模板文件和使用 CRF++ 训练 NER:

1) https://youtu.be/GJHeTvDkIaE

2) https://youtu.be/Ur5umC4BwN4