在基于转换的依赖关系解析中使用LIBLINEAR

时间:2014-05-31 04:04:38

标签: machine-learning nlp libsvm text-mining liblinear

我将使用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)

但我已经考虑过其他人的一些陈述,我似乎在二进制中定义了特征,所以我必须定义一个单词向量,如:     ('我','爱','你'),当你'你'例如,矢量将是(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之间哪个是正确的?

有什么我错的吗?

1 个答案:

答案 0 :(得分:1)

基本上你有一个形式的特征向量:

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,' left-arc& #39; - > 2,'右弧' - > 3,'减少' - > 4)。一个用于您的要素模板结果(' f1 =我' - > 1,' f2 =爱情' - > 2,' f3 =您' - > ; 3)。基本上每次算法应用特征模板时,都会检查结果是否已经存在于映射中,如果不是,则使用新索引添加它。

请记住,Liblinear或Libsvm期望按升序排序列表。

在处理过程中,您首先将要素模板应用于堆栈的当前状态,然后将字符串转换为libsvm / liblinear整数表示并按升序对索引进行排序。