产品展示网站系统,展厅设计参考图,手机网站开发框架php,电商设计素材网站推荐之——nlp基础
目录
之——nlp基础
杂谈
正文
1.文本预处理
2.语言模型
3.语言模型实现 杂谈 在语言模型中#xff0c;需要对文本进行预处理#xff0c;进行数字化的一系列操作#xff0c;而后才能进行网络的拟合。 以前的相关#xff1a;词性判断 正文
1.文本预处…之——nlp基础
目录
之——nlp基础
杂谈
正文
1.文本预处理
2.语言模型
3.语言模型实现 杂谈 在语言模型中需要对文本进行预处理进行数字化的一系列操作而后才能进行网络的拟合。 以前的相关词性判断 正文
1.文本预处理 将文本作为时序信息看待前后的字词连贯性带来了时序信息。 文本预处理就是要怎么把这些字词变成我们能够训练的数据。 import collections
import re
from d2l import torch as d2l 首先读取数据集
d2l.DATA_HUB[time_machine] (d2l.DATA_URL timemachine.txt,090b5e7e70c295757f55df93cb0a180b9691891a)def read_time_machine(): #save将时间机器数据集加载到文本行的列表中with open(d2l.download(time_machine), r) as f:lines f.readlines()为了简单除去字母外其他都变成空格且都变成小写return [re.sub([^A-Za-z], , line).strip().lower() for line in lines]lines read_time_machine()
print(f# 文本总行数: {len(lines)})
print(lines[0])
print(lines[10])
####
Downloading ../data/timemachine.txt from http://d2l-data.s3-accelerate.amazonaws.com/timemachine.txt...
文本总行数: 3221
the time machine by h g wells
twinkled and his usually pale face was flushed and animated the这样得到的句子是没办法训练的要变成单独的词元token来作为基本单元。以下是一些常用的基本单元
def tokenize(lines, tokenword): #save将文本行拆分为单词或字符词元if token word:return [line.split() for line in lines]elif token char:return [list(line) for line in lines]else:print(错误未知词元类型 token)tokens tokenize(lines)
for i in range(11):print(tokens[i]) 构建词汇表
class Vocab: #save文本词表def __init__(self, tokensNone, min_freq0, reserved_tokensNone):if tokens is None:tokens []if reserved_tokens is None:reserved_tokens []# 按出现频率排序counter count_corpus(tokens)self._token_freqs sorted(counter.items(), keylambda x: x[1],reverseTrue)# 未知词元的索引为0self.idx_to_token [unk] reserved_tokensself.token_to_idx {token: idxfor idx, token in enumerate(self.idx_to_token)}for token, freq in self._token_freqs:if freq min_freq:breakif token not in self.token_to_idx:self.idx_to_token.append(token)self.token_to_idx[token] len(self.idx_to_token) - 1def __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]propertydef unk(self): # 未知词元的索引为0return 0propertydef token_freqs(self):return self._token_freqsdef count_corpus(tokens): #save统计词元的频率# 这里的tokens是1D列表或2D列表if len(tokens) 0 or isinstance(tokens[0], list):# 将词元列表展平成一个列表tokens [token for line in tokens for token in line]return collections.Counter(tokens)
vocab Vocab(tokens)
print(list(vocab.token_to_idx.items())[:10])[(unk, 0), (the, 1), (i, 2), (and, 3), (of, 4), (a, 5), (to, 6), (was, 7), (in, 8), (that, 9)]这样我们就把所有的词都数字化了
for i in [0, 10]:print(文本:, tokens[i])print(索引:, vocab[tokens[i]])文本: [the, time, machine, by, h, g, wells]
索引: [1, 19, 50, 40, 2183, 2184, 400]
文本: [twinkled, and, his, usually, pale, face, was, flushed, and, animated, the]
索引: [2186, 3, 25, 1044, 362, 113, 7, 1421, 3, 1045, 1]词元的类型是字符串而模型需要的输入是数字因此这种类型不方便模型使用。 现在构建一个字典通常也叫做词表vocabulary 用来将字符串类型的词元映射到从0开始的数字索引中。 我们先将训练集中的所有文档合并在一起对它们的唯一词元进行统计 得到的统计结果称之为语料corpus。 然后根据每个唯一词元的出现频率为其分配一个数字索引。 很少出现的词元通常被移除低于min_freq这可以降低复杂性。 另外语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元“unk”。 我们可以选择增加一个列表用于保存那些被保留的词元 例如填充词元“pad” 序列开始词元“bos” 序列结束词元“eos”。 所有的打包
def load_corpus_time_machine(max_tokens-1): #save返回时光机器数据集的词元索引列表和词表lines read_time_machine()tokens tokenize(lines, word)vocab Vocab(tokens)# 因为时光机器数据集中的每个文本行不一定是一个句子或一个段落# 所以将所有文本行展平到一个列表中corpus [vocab[token] for line in tokens for token in line]if max_tokens 0:corpus corpus[:max_tokens]return corpus, vocabcorpus, vocab load_corpus_time_machine()
len(corpus), len(vocab) 2.语言模型 语言模型的目标预测整个文本序列出现的概率 其应用①做预训练、②生成文本给定前面的对话不断使用这一估计来生成新的后续文本、③判断哪个语言序列更合适。 基本的先验概率是基于词数的贝叶斯 但如果特别长的句子就会导致特别小所以引入马尔科夫思想进行一定的简化 受限于复杂度与大小一般会用二元或者三元。 3.语言模型实现 运用之前的词库调用统计的freq发现大多数其实都是stop words就是大量出现但没有太多意义的词
import random
from mxnet import np, npx
from d2l import mxnet as d2lnpx.set_np()tokens d2l.tokenize(d2l.read_time_machine())
# 因为每个文本行不一定是一个句子或一个段落因此我们把所有文本行拼接到一起
corpus [token for line in tokens for token in line]
vocab d2l.Vocab(corpus)
vocab.token_freqs[:10][(the, 2261),(i, 1267),(and, 1245),(of, 1155),(a, 816),(to, 695),(was, 552),(in, 541),(that, 443),(my, 440)]可以可视化一下token图
freqs [freq for token, freq in vocab.token_freqs]
d2l.plot(freqs, xlabeltoken: x, ylabelfrequency: n(x),xscalelog, yscalelog) 小部分的词占据了大部分的出现频率 二元组合用zip压缩下
bigram_tokens [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_vocab d2l.Vocab(bigram_tokens)
bigram_vocab.token_freqs[:10][((of, the), 309),((in, the), 169),((i, had), 130),((i, was), 112),((and, the), 109),((the, time), 102),((it, was), 99),((to, the), 85),((as, i), 78),((of, a), 73)]发现还是有很多stop words而三元出现进一步的改观
trigram_tokens [triple for triple in zip(corpus[:-2], corpus[1:-1], corpus[2:])]
trigram_vocab d2l.Vocab(trigram_tokens)
trigram_vocab.token_freqs[:10][((the, time, traveller), 59),((the, time, machine), 30),((the, medical, man), 24),((it, seemed, to), 16),((it, was, a), 15),((here, and, there), 15),((seemed, to, me), 14),((i, did, not), 14),((i, saw, the), 13),((i, began, to), 13)]对比一下
bigram_freqs [freq for token, freq in bigram_vocab.token_freqs]
trigram_freqs [freq for token, freq in trigram_vocab.token_freqs]
d2l.plot([freqs, bigram_freqs, trigram_freqs], xlabeltoken: x,ylabelfrequency: n(x), xscalelog, yscalelog,legend[unigram, bigram, trigram])