这一节极其重要,重要到本来是d2l的内容我也要归到pyhon封面,这里面class的操作很多,让我娓娓道来!
目录
4.2.1 _token_freqs是经过sorted排序后的list
4.2.2 token_to_idx是{token:idx}的字典
4.2.4 idx_to_token是所有token按出现次数多到少排列的list
1.要实现的函数
整文都是围绕以下这个函数来展开的,因为后续就直接用了。包括返回的Vocab类:
def load_corpus_time_machine(max_tokens=-1): #@save
"""返回时光机器数据集的词元索引列表和词表"""
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
corpus, vocab = d2l.load_corpus_time_machine()
len(corpus), len(vocab)
'''
(170580, 28)
'''
2.读取数据集
re.sub('[^A-Za-z]+',' ', line).strip().lower()
re.sub表示将字符串中除了A-Z和a-z之外的所有字符用空格替换
.strip()表示去掉每一行首尾的换行符、空格、缩进等。注意只有首尾!!
.lower()表示结果转换为小写
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])
'''
# ⽂本总⾏数: 3221
the time machine by h g wells
twinkled and his usually pale face was flushed and animated the
'''
3.词元化
输入的是原txt中,每一行为元素组成的list(['1','2',...])

将每个文本序列拆分成词元列表,看下处理代码:
def tokenize(lines, token='word'): #@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])

文章详细介绍了如何使用Python处理文本数据,特别是构建Vocab类进行词元化操作,包括读取数据集、清洗文本、统计词频以及Vocab类的内部结构如token_to_idx和idx_to_token等。Vocab类在自然语言处理中用于管理词汇和它们的索引。
最低0.47元/天 解锁文章
745

被折叠的 条评论
为什么被折叠?



