使用字符级特征来增强 LSTM 词性标注器
教程给出的模型只使用词向量作为序列模型的输入,相当于只考虑词级别的特征,而像词缀这样的字符级信息对于词性有很大的影响。比如说, 像包含词缀 -ly 的单词基本上都是被标注为副词。因此,接下来我们会在刚刚代码的基础上考虑加入每个的单词的字符级别的特征来增强词嵌入。
教程中给出的思路为:
新模型中需要两个 LSTM, 一个跟之前一样, 用来输出词性标注的得分, 另外一个新增加的用来获取每个单词的字符级别表达;
为了在字符级别上运行序列模型,你需要用嵌入的字符来作为字符 LSTM 的输入。
基本思想是将一个单词拆分为字符,然后得到字符向量,将字符向量输入到一个LSTM 网络中得到最后一个隐层的输出,然后将这个输出和对应的单词的词向量结合起来,得到一个单词的新的表示向量,从而进一步得到整个句子的向量,然后再输入到下一个LSTM中就得到了整个的句子的单词的词性预测结果。
代码部分
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
EMBEDDING_DIM = 6
HIDDEN_DIM = 6
CHAR_EMBEDDING_DIM = 6
CHAR_HIDDEN_DIM = 3
training_data = [
("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),
("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
]
tag_to_idx = {
'DET': 0, 'NN': 1, 'V': 2}
# 字符的idx
character_to_idx = {
}
for sent, tags in training_data:
for word in sent:
for char in word:
if char not in character_to_idx:
character_to_idx[char] = len(character_to_idx)
print(character_to_idx)
# 单词的idx
word_to_idx = {
}
for sent, tags in training_data:
for word in sent