如何做到这一点有很多变化,它们取决于您拥有的数据量和您想要投入的时间。我将尝试为您提供主流路径,您可以在引用一些替代方案的同时改进自己。我不会假设具有深度学习的文本建模的先验知识。
一种方法是将问题建模为多类分类,其中类/标签类型都是可能的 POS 标签。有两种最常见的方法来构建深度学习模型:一种是窗口模型。另一种是使用循环单元的序列标注器。
让我们假设两者中最简单的一个,窗口模型。然后您可以执行以下操作:
结构化数据
- 将您的语料库切成
W
单词窗口(例如 3 个单词),其中中心单词是您要分类的单词,其他单词是上下文。我们称这部分数据为X
。
- 对于每个窗口,获取中心词的 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
在这里,Embedding 的输出被用于馈送到 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'])