如何使用Keras构建词性标注器



我正在尝试在Keras的帮助下使用神经网络实现词性标注器。

我使用的是顺序模型,训练数据来自NLTK的Penn Treebank语料库(即。nltk。语料库导入树库)。根据我的理解,用Keras形成一个神经网络包括以下步骤:

  • Define -> compile -> fit a model
  • 评估模型

具体来说,我不确定如何预处理标记的训练数据,以便在我的模型中使用它?这些标记的数据来自nltk的语料库,它们是键值对,键是英语单词和值为对应的POS标记。

确切地说,我不知道如何在以下代码中的"data"one_answers"labels"变量中安排数据:

model.fit(data, labels, nb_epoch=50, batch_size=32)

谁能给我点提示吗?非常感谢你的时间,我真的很感谢你的帮助!

如何做到这一点有很多变化,它们取决于您拥有的数据量和您想要投入的时间。我会试着给你一些主流的途径,你可以通过它来改进自己,同时列举一些替代方法。我不会假设有深度学习的文本建模的先验知识。

一种方法是将问题建模为多类分类,其中类/标签类型是所有可能的POS标记。有两种最常见的方法来构建深度学习模型:一种是窗口模型。另一个是使用循环单元的序列标记器

让我们假设两者中最简单的,窗口模型。然后您可以执行以下操作:

构建数据

  1. 将语料库分成W词(例如3个词)的窗口,其中中心词是你想分类的词,其他词是上下文。我们称这部分数据为X
  2. 对于每个窗口,获取中心单词的POS标签。我们称这部分数据为y

数据编码

将X编码为向量

现在神经网络需要将X编码为向量序列。一种常见的选择是将每个单词编码为单词嵌入。

要做到这一点,首先你对文本进行标记,并将每个单词编码为整数单词id(例如,每次出现"cat"都会是数字7)。如果你没有自己的标记器,你可以使用Keras捆绑的标记器。它接受文本并返回整数/单词id序列。

其次,您可能希望填充和截断每个单词id序列,以便每个实例具有相同的长度(注意:还有其他处理此问题的方法)。imdb_lstm.py中的一个示例是

(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features)
print(len(X_train), 'train sequences')
print(len(X_test), 'test sequences')
print('Pad sequences (samples x time)')
X_train = sequence.pad_sequences(X_train, maxlen=maxlen)
X_test = sequence.pad_sequences(X_test, maxlen=maxlen)
print('X_train shape:', X_train.shape)
print('X_test shape:', X_test.shape)

然后您可以使用嵌入层将填充/截断的单词id序列转换为单词嵌入序列。示例来自imdb_lstm.py:

model = Sequential()
model.add(Embedding(max_features, 128, dropout=0.2))
model.add(LSTM(128, dropout_W=0.2, dropout_U=0.2))  # try using a GRU instead, for fun

这里嵌入的输出被馈送到LSTM。我在最后列出了其他型号的选项。

编码y

要使用Keras进行多类分类,通常使用categorical_crossentropy,它期望标签是一个单热向量,只要可能的类别数量(在您的情况下可能的POS标签数量)。您可以使用keras的to_categorical。注意,它期望一个整数向量,其中每个整数代表一个类(例如NNP可以是0,VBD可以是1,等等):

def to_categorical(y, nb_classes=None):
    '''Convert class vector (integers from 0 to nb_classes) to binary class matrix, for use with categorical_crossentropy.
    # Arguments
        y: class vector to be converted into a matrix
        nb_classes: total number of classes
    # Returns
        A binary matrix representation of the input.
    '''

模型选项

因为在这行解决方案中,你基本上可以做多类分类,你基本上可以作为imdb_遵循keras示例中的任何示例。这些实际上是二进制文本分类的例子。要使它们多类,您需要使用softmax而不是sigmoid作为最终激活函数,并使用categorical_crossentropy而不是binary_crossentropy,就像在mnist_示例中那样:

model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])

相关内容

  • 没有找到相关文章

最新更新