当前位置: 首页 > news >正文

文本预处理:从词元到数字索引

文本是最常见的序列数据,一本书、一篇文章可以被认为是一串单词序列,甚至是一串字符序列。

常见的预处理步骤:

  1. 将文本作为字符串加载到内存;
  2. 将字符串拆分为词元(eg:单词与字符);
  3. 构建词表,将拆分的词元映射到唯一对应的数字索引
  4. 将文本转换为数字索引序列,形成语料库方便模型操作。

1.读取数据集

选择 H.G.Well 的《时光机器》The Time Machine作为数据集输入。

The Project Gutenberg eBook of The Time Machine, by H. G. Wells

该数据集仅包含30多万个单词,是一个相当小的语料库。

# load 文本数据(一本书) d2l.DATA_HUB['time_machine'] = (d2l.DATA_URL + 'timemachine.txt', '090b5e7e70c295757f55df93cb0a180b9691891a') def read_time_machine(): """将时间机器数据集加载到文本行的列表中""" 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])

在处理中仅考虑小写字母和空格,不考虑其余标点符号。

2.词元化处理

将上面处理的文本行数据 lines 作为输入,列表的每一个元素都是一个文本行,将其拆分为词元列表 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('错误:未知词元类型:' + token) tokens = tokenize(lines) for i in range(11): print(tokens[i])

文本拆分两种常见的方式就是单词与字符拆分:

主要区别
特性wordchar
基本单位以空格分割的单词单个字符
示例"hello world" ->['hello','world']"hello"->['h','e','l','l','o']
词表大小较大很小
未知词处理要特殊处理(<unk>标记)几乎没有未知字符
序列长度较短较长

3.词表的构建

为了便于模型的使用,将字符串对应到数字,因此构建一个字典用于将字符串类型的词元映射到从0开始的数字索引。

# 构建字典 class Vocab: """文本词表""" def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):# min_freq最小出现频次 if tokens is None: tokens = [] if reserved_tokens is None: reserved_tokens = [] # 按出现频率排序 counter = count_corpus(tokens) self._token_freqs = sorted(counter.items(), key=lambda x: x[1], reverse=True) # 未知词元的索引为0 self.idx_to_token = ['<unk>'] + reserved_tokens self.token_to_idx = {token: idx for idx, token 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 __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): # index-》tokens if not isinstance(indices, (list, tuple)): return self.idx_to_token[indices] return [self.idx_to_token[index] for index in indices] def unk(self): # 未知词元的索引为0 return 0 def token_freqs(self): return self._token_freqs def count_corpus(tokens): """统计词元的频率""" # 这里的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) # 记录次数

对唯一词元进行统计,得到的结果为语料库(corpus);在创建词表的过程中将很少出现的词元进行移除处理,语料库中不存在或已被移除的任意词元都映射到特定的未知词元(unk)。

实例化Vocab类,使用时光机器数据集作为语料库构建词表,打印前十个高频词及其索引。

vocab = Vocab(tokens) # 调用Vocab类 print(list(vocab.token_to_idx.items())[:10])

将文本行转为数字索引列表以第一行与第十一行为例:

# 文本转为数字索引 for i in [0, 10]: print('文本:', tokens[i]) print('索引:', vocab[tokens[i]])

4.功能的整合

将上述函数整合进总函数 load_corpus_time_machine 中,返回corpus(词元索引列表)以及vocab(时光机器语料库的词表)。此处使用字符而非单词实现文本的词元化。

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 corpus, vocab = load_corpus_time_machine() len(corpus), len(vocab) # vocab 26+1(空格)+1(未知unk) # (170580, 28)

如果是以单词实现的文本词元化,则结果为(32775, 4580),这也对应了前文表中提到的特性。

5.小结

  • 文本是序列数据最常见的形式之一;
  • 对文本进行预处理,我们将文本拆分为词元,构建词表将词元字符串映射为数字索引,并将文本数据转换为词元索引供模型操作。

http://www.jsqmd.com/news/361412/

相关文章:

  • 2026年河南热门的净水设备公司排名,水之流专业不专业? - 工业设备
  • 网站出现访问卡顿或频繁崩溃,高防 CDN 如何解决?
  • 老旧小区配电箱改造怎么选公司,看这篇就够了 - mypinpai
  • 全国靠谱的新能源铝合金管材供应商排名,看看国强和茂产品更新换代快吗 - 工业品网
  • 定稿前必看!10个AI论文软件测评:专科生毕业论文写作必备工具推荐
  • 二叉树遍历思维实战
  • 分析2026年全国正宗散白酒招商,实力雄厚的公司有哪些 - 工业推荐榜
  • NVRC 论文阅读
  • 2026年质量好的动植物蛋白肽提取浓缩设备/酶制剂浓缩设备生产商实力参考哪家质量好(更新) - 行业平台推荐
  • 2026年靠谱的纸箱包装设计/纸箱包装定制哪家专业工厂直供推荐 - 行业平台推荐
  • Java面试八股文 - 掌握面试必备知识(目录篇)
  • 2026年高性价比国产PCB设计软件推荐:聚焦AI自动化与仿真能力,对标国际主流工具 - 品牌2025
  • 分析太原欧米奇西点西餐学校招生情况,学费多少钱报哪个专业好 - 工业品网
  • 解析!Protobuf JSON解析递归深度绕过漏洞 (CVE-2026-0994)
  • 聚焦放化疗引起吞咽功能改善用药,速舒助力肿瘤患者科学护理口腔 - 资讯焦点
  • 一文搞定Android Studio 2025下载安装和汉化图解指南(2026最新实测) - xiema
  • 这次终于选对!9个AI论文平台测评:本科生毕业论文写作全攻略
  • 腾讯宣布推出全新AI软件,正式开启内测了
  • 【IEEE出版,往届已见刊并完成EI检索 | 杭州市仪器仪表学会主办 | 】第二届信号处理、通信与控制系统国际学术会议(SPCCS 2026)
  • 2026年热门的乙炔三型瓶四型瓶检测设备/无缝三型瓶四型瓶检测设备实力厂家综合评估推荐几家 - 行业平台推荐
  • 向量的正交分解和标准正交基
  • 2026年比较好的氨基酸分离设备/分离设备源头厂家推荐帮我推荐几家 - 行业平台推荐
  • 计算机毕业设计springboot基于Java的哈佛大学在线考试系统 基于SpringBoot框架的高校智能考务管理平台设计与实现 Java Web技术驱动的顶尖学府数字化测评系统开发研究
  • 收藏级Multi-LoRA(低秩适配)详解|小白也能看懂,程序员必学的大模型微调省流技术
  • 【齐鲁工业大学(山东省科学院)主办 | ACM 出版,EI ,Scopus检索快速稳定,往届已见刊检索 | 经济、管理、计算机相关主题稿件均可】第三届创新管理与信息系统国际会议(ICIIS 2026)
  • 2026 国产高端 EDA 工具:芯片封装与 PCB 协同仿真设计工具及国产替代方案推荐 - 品牌2025
  • 计算机毕业设计springboot赛事报名系统 基于SpringBoot的竞赛活动管理平台 SpringBoot高校学科竞赛管理系统
  • 2026 西南公装装修价值指南:办公室 / 茶楼 / 商业 / 餐饮装修实力企业甄选 - 深度智识库
  • HoRain云--Markdown实时预览优化全攻略
  • 2026年比较好的长管钢瓶检测设备/丙烷钢瓶检测设备生产商采购建议怎么选 - 行业平台推荐