我将使用LIBLINEAR为基于过渡的依赖项解析做一些工作。但是我很困惑如何利用它。如下:
我为基于过渡的依赖项解析的培训和测试过程设置了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
LIBLINEAR中定义的功能是:
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)
因此,LIBLINEAR中的功能可能是:------- 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)
格式1和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,1,'left-arc'-> 2,'right-arc'-> 3,“减少”-> 4)。还有一个用于您的特征模板结果('f1 = I'-> 1,'f2 = love'-> 2,'f3 = you'-> 3)。基本上,每次算法应用特征模板时,您都要检查结果是否已经在映射中,如果没有,则使用新索引将其添加。
请记住,Liblinear或Libsvm期望按升序排列列表。
在处理过程中,您将首先将特征模板应用于堆栈的当前状态,然后将字符串转换为libsvm / liblinear整数表示形式,并以升序对索引进行排序。