文本预处理
基本概念
文本是一类序列数据,一篇文章可以看作是字符或单词的序列,在将其输入到模型中之前需要对其进行预处理,处理成为模型可以接收的格式,一般来说,模型预处理包括以下几个步骤:
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为输出层的变量。
具体实现
来源:CSDN
作者:.Harole
链接:https://blog.csdn.net/baidu_19518247/article/details/104319661