使用tensorflow进行序列标记:同步序列输入和输出

时间:2015-11-16 14:21:59

标签: tensorflow

我想使用Tensorflow进行序列标记,即语音标记。我尝试使用此处概述的相同模型:http://tensorflow.org/tutorials/seq2seq/index.md(其中概述了将英语翻译为法语的模型)。

由于在标记中,输入序列和输出序列具有完全相同的长度,因此我配置了桶以使输入和输出序列具有相同的长度,并尝试在ConLL 2000上使用此模型学习POS标记器。

然而,似乎解码器有时会输出比输入序列短的标记序列(似乎感觉EOS标签过早出现)

例如: 他估计9月经常账户赤字将缩减至仅18亿。

上面的句子被标记为有18个令牌被填充到20(由于分组)。

当要求解码上述内容时,解码器会发出以下信息:

PRP VBD DT JJ JJ NN MD VB到VB DT NN IN NN。 _EOS。 _EOS CD CD

所以这里它在15个令牌之后结束了序列(EOS)而不是18。

如何强制序列了解解码序列应与我的场景中编码序列的长度相同。

3 个答案:

答案 0 :(得分:1)

如果你的输入和输出序列长度相同,你可能想要比seq2seq模型更简单的东西(因为处理不同的序列长度是它的优势之一)

您是否尝试过培训(word - > tag)?

tokens to tags

注意:对于像pos标记这样的东西,任何一方都有来自令牌的清晰信号,你肯定会从双向网中获益。

bidir net

如果你想疯狂的话会有一些有趣的角色等级变体,你只会在令牌边界发出标签(理由是pos标记受益于角色等级特征;例如像词汇名称之类的东西) 。尝试这么多变种! :d

enter image description here

答案 1 :(得分:0)

有多种方法可以指定序列结束参数。 translate演示使用标志<EOS>来确定序列的结束。但是,您也可以通过计算输出中预期单词的数量来指定序列结束。在translate.py的第225-227行:

# If there is an EOS symbol in outputs, cut them at that point.
if data_utils.EOS_ID in outputs:
    outputs = outputs[:outputs.index(data_utils.EOS_ID)]

您可以看到,只要遇到<EOS>,输出就会被切断。您可以轻松调整它以限制输出字的数量。考虑到你的申请,你也可以考虑在训练时完全摆脱<EOS>旗帜。

答案 2 :(得分:0)

我遇到了同样的问题。最后,我发现tensorflow示例中的ptb_word_lm.py示例正是我们对标记化,NER和POS标记所需要的。

如果您查看语言模型示例的详细信息,您可以发现它将输入字符序列视为X,右移X将1个空格视为Y.这正是固定长度序列标签所需要的。

相关问题