我将使用lilinear做一些基于转换的依赖解析工作。但我不知道如何利用它。如下:
我为基于转换的依赖解析的训练和测试过程设置了3个特征模板:
1. the word in the top of the stack
2. the word in the front of the queue
3. information from the current tree formed with the steps
而liblilinear中定义的特征为:
FeatureNode(int index, double value)
例如:
LABEL ATTR1 ATTR2 ATTR3 ATTR4 ATTR5
----- ----- ----- ----- ----- -----
1 0 0.1 0.2 0 0
2 0 0.1 0.3 -1.2 0
1 0.4 0 0 0 0
2 0 0.1 0 1.4 0.5
3 -0.1 -0.2 0.1 1.1 0.1
但我想在某个阶段定义我的特征(一句'我爱你'):
feature template 1: the word is 'love'
feature template 2: the word is 'you'
feature template 3: the information is - the left son of 'love' is 'I'
这是否意味着我必须用LIBLINEAR定义特性,如:-------FORMAT 1(词汇索引:0-I, 1-love, 2-you)
LABEL ATTR1(template1) ATTR2(template2) ATTR3(template3)
----- ----- ----- -----
SHIFT 1 2 0
(or LEFT-arc,
RIGHT-arc)
但是我想到了其他人的一些陈述,我似乎用二进制来定义特征,所以我必须定义一个词向量:('I', 'love', 'you'),例如,当'you'出现时,向量将为(0,0,1)
所以liblilinear的特性可能是:-------FORMAT 2
LABEL ATTR1('I') ATTR2('love') ATTR3('love')
----- ----- ----- -----
SHIFT 0 1 0 ->denoting the feature template 1
(or LEFT-arc,
RIGHT-arc)
SHIFT 0 0 1 ->denoting the feature template 2
(or LEFT-arc,
RIGHT-arc)
SHIFT 1 0 0 ->denoting the feature template 3
(or LEFT-arc,
RIGHT-arc)
FORMAT 1和FORMAT 2哪个是正确的?
是我搞错了什么吗?
基本上你有一个形式的特征向量:
LABEL RESULT_OF_FEATURE_TEMPLATE_1 RESULT_OF_FEATURE_TEMPLATE_2 RESULT_OF_FEATURE_TEMPLATE_3
Liblinear或LibSVM希望您将其转换为整数表示:
1 1:1 2:1 3:1
现在,根据你使用的语言,有很多包/库,可以自动将字符串向量转换成libsvm格式,而无需你知道细节。
然而,如果出于任何原因你想自己做,最简单的事情是维护两个映射:一个映射标签('shift' -> 1, '左弧' -> 2,'右弧' -> 3,'reduce' -> 4)。一个为你的特征模板结果('f1=I' -> 1, 'f2=love' -> 2, 'f3=you' -> 3)。基本上每次你的算法应用一个特征模板你检查结果是否已经在映射中,如果不是你添加一个新的索引。
请记住,Liblinear或Libsvm期望一个按升序排序的列表。
在处理过程中,你首先将你的特性模板应用到堆栈的当前状态,然后将字符串转换为libsvm/线性整数表示,并按升序对索引进行排序。