在crf模型中添加数字特征是否可行/好?例如在序列中的位置。
我正在使用CRFsuite。似乎所有功能都将转换为字符串,例如'pos = 0','pos = 1',然后它失去了它作为欧氏距离的含义。
或者我应该用它们训练另一种模型,例如svm,然后与crf模型合奏?
答案 0 :(得分:7)
我发现CRFsuite确实处理数字特征,至少根据this documentation:
- {“string_key”:float_weight,...} dict在哪里观察到键的特征,值是它们的权重;
- {“string_key”:bool,...} dict; True转换为1.0重量,False - 转换为0.0;
- {“string_key”:“string_value”,...} dict;这与{“string_key = string_value”:1.0,...}
相同- [“string_key1”,“string_key2”,...]列表;这与{“string_key1”:1.0,“string_key2”:1.0,...}
相同- {“string_prefix”:{...}} dicts:处理嵌套的dict,并为每个键添加“string_prefix”。
- {“string_prefix”:[...]} dicts:处理嵌套列表,并为每个键添加“string_prefix”。
- {“string_prefix”:set([...])} dicts:处理嵌套列表,并为每个键添加“string_prefix”。
只要:
答案 1 :(得分:4)
CRF本身可以使用数字功能,你应该使用它们,但是如果你的实现将它们转换为字符串(通过&#34编码二进制形式;一个热点编码")那么它可能会减少意义。我建议寻找更多"纯粹"允许连续变量的CRF。
一个有趣的事实是CRF的核心只是结构化的MaxEnt(LogisticRegression),它在连续域中工作,这种字符串编码实际上是从分类的方式值为连续域,因此您的问题实际上是"过度设计" CRFSuite忘记了CRF模型的实际功能。
答案 2 :(得分:0)
仅需澄清一下Lishu的答案(这是正确的,但可能会使其他读者感到困惑,直到我尝试为止)。这个:
{“ string_key”:float_weight,...} dict,其中观察到键的特征和值是其权重
本来可以写成
{“ feature_template_name”:feature_value,...}字典,其中键是要素名称,值是它们的值
即使用此功能,您无需设置与此Feature_template对应的CRF的权重,而可以设置此功能的值。我更喜欢使用具有特征值的特征模板,以使所有内容都比“特征”更清晰。然后,CRF将学习与此feature_template的每个可能feature_value相关的权重