目录
1.常见流程
将文本作为字符串加载到内存中。
将字符串拆分为词元(如单词和字符)。
建立一个词汇表,将拆分的词元映射到数字索引。
将文本转换为数字索引序列,方便模型操作。
整合所有功能
#知识点1:词汇表-->语料、<unk>、pad、bos、eos
1 <unk> :未知词元
2 pad :若两句话长短不一致,补充pad使每一句话长度一致
#知识点2:
#若是把一个英文的字符串放入列表中,是以char(一个字母一个字母)的形式放进去的
# s = 'the time machine by h g wells'
# list(s)
#知识点3:
#dict().item() 返回字典的key和value
2.导包
#python自带的两个包
import collections #该库提供了一些集合对象的实现,包括Counter、deque、defaultdict等
import re #正则表达式的模块库
3.定义函数:读取本地的数据集
def read_time_machine():
with open('./article.txt', 'r') as f: #'r'只读
lines = f.readlines() #读取每一行数据
#re.sub参数:pattern表示正则表达式; repl:用什么替代;string:对什么文本操作, +加号表示重复
return [re.sub('[^A-Za-z]+', ' ',line).strip().lower() for line in lines] #不符合正则的用空格表示, strip():去掉空格, lower():把大写字母变成小写
4.定义函数:文本词元化
def tokenize(lines, token='word'): #token='word'相当于设置判断标志
"""将文本行拆分成单词或者字符词元
lines:需要传入的数据
token = 'word' 或者 token = 'char'两种形式
"""
if token == 'word':
return [line.split() for line in lines]
elif token == 'char':
return [list(line) for line in lines] #list(line)将一整行英文文本的字符串放入列表中,会每个字母单独成为一个列表元素
else:
print('错误:未知词元类型:' + token)
5.定义函数:统计词元频率¶
def count_corpus(tokens):
#判断tokens是否为空 或者 tokens里面的第一个元素是否为一个列表
if len(tokens) == 0 or isinstance(tokens[0], list):
#把词元列表展平使用词元填充的一个列表
tokens = [token for line in tokens for token in line]
#上一句代码 相当于 下面四句代码
# temp = []
# for line in tokens:
# for token in line:
# temp.append(token)
return collections.Counter(tokens) #统计一维数据的文本词频
6.定义类:构建词汇表¶
# 构建词汇表
class Vocab:
"""文本词汇表"""
def __init__(self, tokens=None, min_freq=0, reserved_token=None):
if tokens is None:
tokens = []
if reserved_token is None:
reserved_token = []
counter = count_corpus(tokens)
# 按照出现频率进行排序
self.token_freqs = sorted(counter.items(), key=lambda x: x[1], reverse=True)
# 未知词元索引为0
self.unk, uniq_tokens = 0, ['<unk>'] + reserved_token
uniq_tokens += [token for token, freq in self.token_freqs if freq >= min_freq and token not in uniq_tokens]
self.idx_to_token, self.token_to_idx = [], dict()
for token in uniq_tokens:
self.idx_to_token.append(token)
self.token_to_idx[token] = len(self.idx_to_token) - 1
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]
7.定义函数:整合所有的功能
def load_corpus_time_machine(max_tokens=-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 corpus, vocab
8.调用代码执行
corpus, vocab = load_corpus_time_machine()