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

时间:2016-11-14 16:55:21

标签: neural-network deep-learning keras pos-tagger part-of-speech

我试图在Keras的帮助下使用神经网络实现词性标记。

我使用Sequential模型,并从NLTK的Penn Treebank语料库(即来自nltk.corpus import treebank)训练数据。根据我的理解,与Keras形成神经网络 包括以下步骤:

  • 加载数据
  • 定义 - >编译 - >适合模特
  • 评估模型

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

准确地说,我不知道如何安排数据"数据"和"标签"以下代码中的变量:

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

有人可以给我一些提示吗?非常感谢您的时间,我非常感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

如何做到这一点有很多变化,它们取决于你拥有的数据量和你想投入的时间。我会尝试给你一条主流路径,你可以在引用一些替代方案的同时改进自己。我不会假设有深度学习的文本建模的先验知识。

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

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

构建数据

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

    将X编码为矢量

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

    首先,您需要对文本进行标记,并将每个单词编码为整数单词ID(例如,#34; cat"将为数字7的每一次出现)。如果您没有自己的标记生成器,则可以使用the one bundled with Keras。这将获取文本并返回整数/单词ID的序列。

    其次,你可能想要填充和截断每个单词id序列,以便每个实例具有相同的长度(注意:还有其他处理方法)。 example from the 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_ 跟随{{3}中的任何示例}。这些实际上是二进制文本分类示例。要使它们成为多类,您需要使用softmax而不是sigmoid作为最终激活函数而使用categorical_crossentropy而不是像keras examples mnist_中的binary_crossentropy:

    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'])