序列分类的任务是为整个输入序列预测一个类别标签。在许多领域中,包括基因和金融领域,这样的问题都极为常见。NLP中的一个突出例子是情绪分析。
使用国际电影数据库的影评数据集,该数据集的目标值是二元的---正面的和负面的。将逐个单词地查看每条评论。依据最后的那个单词的活性值,将训练一个用于预测整条评论的情绪的分类器。由于是按照端到端的方式训练模型,RNN将从单词中收集那些对于最终分类最有价值的信息,并进行编码。
Imdb影评数据集:http://ai.stanford.edu/~amaas/data/sentiment/,它是一个经过压缩的tar文档,其中正面的和负面的评论可从分列于两个文件夹中的文本文件中获取。利用正则表达式提取纯文本,并将其中的字母全部转换为小写。
使用词向量嵌入:词向量嵌入表示比one-hot具有更丰富的语义。因此,如果使RNN工作在影评的被嵌入的而非one-hot的单词上,则有助于RNN获取更好的性能。
import bz2
import numpy as np
class Embedding:
def __init__(self, vocabulary_path, embedding_path, length):
self._embedding = np.load(embedding_path)
with bz2.open(vocabulary_path, 'rt') as file_:
self.vocabulary = {k.strip(): i for i, k in enumerate(file_)}
self._length = length
def __call__(self, sequence):
data = np.zeros((self._length, self._embedding.shape[1]))
indices = [self._vocabulary.get(x, 0) for x in sequence]
embedded = self._embedding[indices]
data[:len(sequence)] = embedded
return data
def dimensions(self):
return self._embedding.shape[1]
序列标注模型: