use*_*402 5 python nlp lstm keras word-embedding
我正在尝试在 Keras中实现本文中描述的字符级嵌入类型。字符嵌入是使用双向 LSTM 计算的。
为了重新创建这个,我首先创建了一个矩阵,其中包含每个单词的组成单词的字符的索引:
char2ind = {char: index for index, char in enumerate(chars)}
max_word_len = max([len(word) for sentence in sentences for word in sentence])
X_char = []
for sentence in X:
for word in sentence:
word_chars = []
for character in word:
word_chars.append(char2ind[character])
X_char.append(word_chars)
X_char = sequence.pad_sequences(X_char, maxlen = max_word_len)
Run Code Online (Sandbox Code Playgroud)
然后我定义了一个 BiLSTM 模型,其中包含一个词-字符矩阵的嵌入层。我假设 input_dimension 必须等于字符数。我希望字符嵌入的大小为 64,因此我将 BiLSTM 的隐藏大小设置为 32:
char_lstm = Sequential()
char_lstm.add(Embedding(len(char2ind) + 1, 64))
char_lstm.add(Bidirectional(LSTM(hidden_size, return_sequences=True)))
Run Code Online (Sandbox Code Playgroud)
这就是我感到困惑的地方。如何从模型中检索嵌入?我猜我必须编译模型并拟合它然后检索权重以获得嵌入,但是我应该使用什么参数来拟合它?
额外细节:
这是针对 NER 任务的,因此数据集在技术上可以是 word-label 格式的任何内容,尽管我专门使用此处提供的 WikiGold ConLL 语料库:https : //github.com/pritishuplavikar/Resume-NER/blob /master/wikigold.conll.txt 网络的预期输出是标签(I-MISC、O、I-PER...)
我希望数据集足够大,可以直接从中训练字符嵌入。所有单词都以其构成字符的索引进行编码,字母大小约为 200 个字符。这些单词被填充/剪切为 20 个字符。数据集中有大约 30 000 个不同的单词。
我希望能够根据来自不同单词的信息为每个字符学习嵌入。然后,就像在论文中一样,在输入具有最终 CRF 层的 Bi-LSTM 网络之前,我会将字符嵌入与单词的手套嵌入连接起来。
我还希望能够保存嵌入,以便我可以将它们重用于其他类似的 NLP 任务。
一般来说,Keras 构建模型的方法(即使是看似复杂的模型)非常简单。例如,您想要构建的模型类型看起来就像这样(注意这是针对二元分类问题):
model = Sequential()
model.add(Embedding(max_features, out_dims, input_length=maxlen))
model.add(Bidirectional(LSTM(32)))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))
model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
这与普通的 NN 没有什么不同,只是在密集层中添加了嵌入层和双向层。这是让 Keras 令人惊叹的事情之一。
通常,寻找一个与您尝试做的事情或多或少相同的工作示例(Keras 有负载)会很有帮助。在这种情况下,您可以首先查看该模型,然后对其工作原理进行“逆向工程”以回答您的问题。通常,事情归结为以正确的方式格式化数据,其中工作示例模型会产生奇迹,因为您可以仔细研究其使用的数据格式。