1. 词语特征表示
代码上,下面针对的都是1个batch(多个序列)进行优化时,如何获取batch中的不同序列(单词or句子)中的特征。
1.1 提取字符级别特征:
将单词看成序列,序列由字符构成,字符看成序列不同时刻的观测输入。
1)CNN for Character-level Representation
2)Bi-LSTM for Character-level Representation
下图是使用Bi-LSTM提取字符级别的特征。对于某个单词wi(例如CAT),w=[c1,…,cp],每个字符ci都有一个向量化表示。使用Bi-LSTM建模单词字符词向量序列,并将Bi-LSTM最后输出的隐藏层h1、h2向量(前向、后向各一个)连接起来,作为该词wi字符级别的特征,该特征能够捕获wi形态学特点。
然后,再将提取到的字符级别的特征和Glove预训练好的词语级别的特征连接起来,作为该词最终的特征。
1.2 Glove/Word2vec提取词向量,即词级别特征
将句子看成序列,序列由词语构成,词语看成序列不同时刻的观测输入。
- 为不同时刻的观测输入设置id,这里也就是为词语设置id。目的是查找观测(某个句子的某个词)的向量化表示。
# shape = (batch size, max length of sentence in batch)
word_ids = tf.placehold
这里针对的是1个batch,batch由多个序列(句子)构成。要设置不同序列不同时刻的观测的id,也就是不同句子不同单词的id。因此word_ids的shape是二维的,Batch Size×Sentence LengthBatch Size×Sentence Length,Batch Size是这个Batch中序列的数量,Sentence Length是序列的最大长度,每个元素代表某个序列某个词语的id。
- 为不同序列设置有效长度,这里也就是句子的单词数目。目的是记录batch中不同序列的有效长度。
# shape = (batch size)
sequence_lengths = tf.placeholder(tf.int32, shape=[None])
根据上述的id查询观测词语的向量化表示:
L = tf.Variable(embeddings, dtype=tf.float32, trainable=False)
# shape = (batch size, sentence, word_vector_size)
pretrained_embeddings = tf.nn.embedding_lookup(L, word_ids)
L就是词向量矩阵,shape为Dictionary Size×Word Vector Size,即词语总数量乘以词的维数。注意trainable=False,我们不需要训练词向量,使用预训练好的Glove词向量,并借助Tensorflow自带的embedding_lookup来查找词向量。
这里直接查询到每个batch每个句子中不同单词的词向量。pretrained_embeddings的最后一维就是词向量的维数,因此pretrained_embeddings是3维的(Batch size × Sequence size × word vector size)
1.3 将两种特征concat到一起,作为BiLSTM-CRF的输入
reference:
http://xtf615.com/2018/11/27/ner/
《End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF》