0

我正在尝试使用 CRF++ 将产品字符串解析为各种属性类,以便我可以执行类似于此问题的产品匹配。

然而,我遇到的一个问题是,当产品字符串中的单词顺序尚未在训练文件中看到时,CRF 无法准确预测标签。

例如,我只是使用一个词袋模板文件:

#Unigrams
U00:%x[-1,0]
U00:%x[0,0]
U00:%x[1,0]

#Bigrams
B

我运行crf_learn包括以下示例训练数据:

panasonic  NOUN  B-BRAND
digital  ADJ  B-PRODUCT
monitor  NOUN  I-PRODUCT
17  #  B-SIZE
inch  #  I-SIZE

使用此训练数据时,模型将测试字符串“panasonic digital monitor 17 inch”正确解析为正确的输出标签。但是,当我在诸如“panasonic monitor digital 17 inch”之类的字符串上使用该模型时,该模型无法识别正确的标签,而是将“digital”和“monitor”的标签更改为如下所示:

panasonic  NOUN  B-BRAND
monitor  NOUN  B-PRODUCT
digital  ADJ  I-PRODUCT
17  #  B-SIZE
inch  #  I-SIZE

但是,我需要的是以下内容:

panasonic  NOUN  B-BRAND
monitor  NOUN  I-PRODUCT
digital  ADJ  B-PRODUCT
17  #  B-SIZE
inch  #  I-SIZE

这是我的模板文件的问题,还是 CRF 本身就受语法限制?或者我可以以某种方式修改模板文件或训练数据列以捕获/忽略产品字符串中单词的顺序?

4

1 回答 1

0

首先,模板文件中的特征定义错误。

所有要素模板均标识为U00。这意味着本质上只有 1 个功能,而不是 3 个。

其次,我认为您应该尝试更多功能模板,例如:

#context of 3 words
U00:%x[-1,0]
U01:%x[0,0]
U02:%x[1,0]

#for POS Tag
U03:%x[0,1]

希望这有助于提高性能:)

PS:对CRF++模板文件的理解可以看https://youtu.be/GJHeTvDkIaE

于 2017-05-08T17:33:51.000 回答