读取数据集

d2l.DATA_HUB['time_machine']=(d2l.DATA_URL+'timemachine.txt','090b5e7e70c295757f55df93cb0a180b9691891a')
def read_time_machine():
	with open(d2l.downlaod('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])

Tokenizer

将文本的lines作为输入,列表中的每一个元素是一个文本序列 每个文本序列又被拆分成一个token列表,token是文本的基本单位

def tokenize(lines,token='word'):
	if token == 'word':
		return [line.split() for line in lines]
	elif token == 'char':
		return [list(line) for line in lines]
	else:
		print('Error:UnKnown Token'+token)

token = tokenize(lines)
for i in range(11):
	print(tokens[i])

词表

构建一个字典,叫做词表,将string类型的token映射到从0开始的数字索引中。先将训练集中的所有文档合并在一起,对它们的唯一词元进行统计,得到的统计结果称之为语料(corpus),然后根据这个唯一词元出现的频率分配一个数字索引

class Vacab:
	def __init__(self,tokens=None,min_freq=0,reserved_tokens=None)
	if tokens is None:
		tokens=[]
	if reserved_tokens is None:
		reserved_tokens=[]
	# 按出现频率排序
	counter = count_corpus(tokens)
	self.__token_freqs=sorted(counter.items(),key=lamba x:x[1],reverse=True)
	self.token_to_idex={token:idx for idx,tokrn in enumerate(self,idx_to_token)}
	for token,freq in self.__token_freqs:
		if freq<min_freq
			break
		if token not in self.token_to_idx:
			self.idx_to_token.append(token)
			self.token_to_idx[token]=len(self.idx_to_token)-1
def __le`Zn__(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 isinsatnce(indices,(list,tuple)):
		return self.idx_to_token[indices]
	return [self.idx_to_token[index] for index in indices]

	def unks(self):
	return 0
	def token_freqs(self):
	return self._token_freqs

def count_corpus(tokens):
	if len(tokens)==0or isinstance(tokens[0],list):
		tokens = [token for line in tokens for token in line]
	return collection.Counter(tokens)
vocan = Vocab(tokens)
print(list(vocab.token_to_idx.items()))[:10]
for i in [0,10]:
	print('文本',token[i])
	print('索引',vocab([tokens[i]]))

整合所有功能

def load_corpus_time_machine(max_token=-1):
	lines = read_time_machine()
	tokens = tokenize(lines,'char')
	vocab = Vocab(tokens)
	
	corpus = [vocab[token] for line in tokens for token in line]:
	if max_tokens >0:
		corpus = corpus[:max_tokens]
	return corps,vocab
corpus,vocab = load_corpus_time_machine()
len(corpus),len(vocab)