语言模型与循环神经网络

时光怂恿深爱的人放手 提交于 2020-02-15 03:23:03

文本预处理

基本概念

文本是一类序列数据,一篇文章可以看作是字符或单词的序列,在将其输入到模型中之前需要对其进行预处理,处理成为模型可以接收的格式,一般来说,模型预处理包括以下几个步骤:
1.读入文本
2.分词
3.建立字典,将每个词映射到一个唯一的索引(index)
4.将文本从词的序列转换为索引的序列,方便输入模型

具体实现

文本预处理当中较为关键的是建立字典以及转换索引的过程,为了方便模型处理,我们需要将字符串转换为数字。因此我们需要先构建一个字典(vocabulary),将每个词映射到一个唯一的索引编号。
实现方法如下:

class Vocab(object):
    def __init__(self, tokens, min_freq=0, use_special_tokens=False):
        counter = count_corpus(tokens)  # : 
        self.token_freqs = list(counter.items())
        self.idx_to_token = []
        if use_special_tokens:
            # padding, begin of sentence, end of sentence, unknown
            self.pad, self.bos, self.eos, self.unk = (0, 1, 2, 3)
            self.idx_to_token += ['', '', '', '']
        else:
            self.unk = 0
            self.idx_to_token += ['']
        self.idx_to_token += [token for token, freq in self.token_freqs
                        if freq >= min_freq and token not in self.idx_to_token]
        self.token_to_idx = dict()
        for idx, token in enumerate(self.idx_to_token):
            self.token_to_idx[token] = idx

    def __len__(self):
        return len(self.idx_to_token)

    def __getitem__(self, tokens):
        if not isinstance(tokens, (list, tuple)):
            return self.token_to_idx.get(tokens, self.unk)
        return [self.__getitem__(token) for token in tokens]

    def to_tokens(self, indices):
        if not isinstance(indices, (list, tuple)):
            return self.idx_to_token[indices]
        return [self.idx_to_token[index] for index in indices]

def count_corpus(sentences):
    tokens = [tk for st in sentences for tk in st]
    return collections.Counter(tokens)  # 返回一个字典,记录每个词的出现次数

通过这种方式即可构建字典,将字符输入就可转化为索引。

语言模型

基本概念

一段自然语言文本可以看作是一个离散时间序列,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
在这里插入图片描述
随着序列长度增加时,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。通过马尔科夫假设,可以对其进行简化,马尔科夫假设是指一个词的出现只与前面n个词相关。基于n-1阶马尔可夫链,我们可以将语言模型改写为:
在这里插入图片描述
一般来说n <= 4,n较大时,会造成参数空间过大、数据稀疏的问题。

循环神经网络

基本概念

循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。基本结构如下:
在这里插入图片描述
公式表示为:
在这里插入图片描述
在这里插入图片描述
其中H是时间步的隐藏变量,O为输出层的变量。

具体实现

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!