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

# 构建词汇表:自然语言处理中的关键步骤

构建词汇表:自然语言处理中的关键步骤

在自然语言处理(NLP)任务中,词汇表(Vocabulary)是文本数据预处理的核心组件之一。它将文本中的单词或字符映射为数值索引,从而让计算机能够理解和处理语言数据。本文将详细介绍如何使用 Python 构建一个基于字符的词汇表,并通过一个具体的例子展示其过程。

1. 词汇表的作用

在 NLP 中,文本数据通常是通过词汇表进行编码的。词汇表的作用是将文本中的每个单词或字符转换为一个唯一的数值索引,这样计算机就可以处理这些数据。例如,假设我们有一个词汇表:

{'今': 0, '天': 1, '气': 2, '真': 3, '好': 4, '<UNK>': 5, '<PAD>': 6}

那么,文本 “今天天气真好” 可以被编码为 [0, 1, 2, 3, 4]。如果文本中出现词汇表中不存在的字符,如 “明”,则可以用 <UNK>(未知字符)来代替,即索引 5。

2. 构建词汇表的步骤

2.1 准备数据

假设我们有一个 CSV 文件 simplifyweibo_4_moods.csv,其中包含了一些文本数据。文件的格式可能如下:

id,text
1,今天天气真好
2,我咁要去打球
3,明天会下雨

我们的目标是从这些文本中提取字符,统计它们的频率,并构建一个词汇表。

2.2 编写代码

以下是构建词汇表的完整代码:

from tqdm import tqdm
import pickle as pkl# 定义全局变量
MAX_VOCAB_SIZE = 4760  # 词表长度限制
UNK, PAD = '<UNK>', '<PAD>'  # 未知字,padding符号def build_vocab(file_path, max_size, min_freq):"""构建词汇表函数:param file_path: 输入文件路径:param max_size: 词汇表的最大大小:param min_freq: 单词的最小出现频率:return: 构建好的词汇表(字典形式)"""# 定义分词器,将输入字符串逐字分割为字符列表tokenizer = lambda x: [y for y in x]# 初始化词汇表字典vocab_dic = {}# 打开文件并逐行读取with open(file_path, 'r', encoding='UTF-8') as f:i = 0  # 初始化计数器,用于跳过文件的第一行for line in tqdm(f):  # 使用tqdm显示进度条if i == 0:  # 跳过文件的第一行(通常是表头)i += 1continuelin = line[2:].strip()  # 去掉每行的前两个字符,并去掉行首行尾的多余空格if not lin:  # 如果处理后的行为空,则跳过continue# 对当前行进行分字处理,并统计每个字符的出现频率for word in tokenizer(lin):vocab_dic[word] = vocab_dic.get(word, 0) + 1# 按照字符的出现频率从高到低排序,并过滤掉出现频率小于min_freq的字符# 只保留前max_size个字符vocab_list = sorted([_ for _ in vocab_dic.items() if _[1] > min_freq], key=lambda x: x[1], reverse=True)[:max_size]# 重新构建词汇表字典,将字符映射为索引值vocab_dic = {word_count[0]: idx for idx, word_count in enumerate(vocab_list)}# 将特殊符号UNK和PAD添加到词汇表中,并分配索引值vocab_dic.update({UNK: len(vocab_dic), PAD: len(vocab_dic) + 1})# 打印构建好的词汇表(可选,用于调试)print(vocab_dic)# 将词汇表保存为一个.pkl文件,方便后续使用pkl.dump(vocab_dic, open('simplifyweibo_4_moods.pkl', 'wb'))# 打印词汇表的大小print(f"Vocab size: {len(vocab_dic)}")return vocab_dic  # 返回构建好的词汇表if __name__ == "__main__":# 调用build_vocab函数,构建词汇表vocab = build_vocab('simplifyweibo_4_moods.csv', MAX_VOCAB_SIZE, 3)# 打印字符串'vocab',确认函数运行完成print('vocab')

2.3 代码解析

  1. 分词器tokenizer 是一个简单的函数,将输入字符串逐字分割为字符列表。
  2. 统计频率:逐行读取文件内容,统计每个字符的出现频率。
  3. 过滤和排序:过滤掉出现频率小于 min_freq 的字符,并按频率从高到低排序,只保留前 max_size 个字符。
  4. 构建词汇表:将字符映射为索引值,并添加特殊符号 <UNK><PAD>
  5. 保存词汇表:将词汇表保存为 .pkl 文件,方便后续加载和使用。

2.4 运行结果

输入文件 simplifyweibo_4_moods.csv 的内容如下:
在这里插入图片描述

运行代码后,输出如下:
在这里插入图片描述

同时,词汇表会被保存为 simplifyweibo_4_moods.pkl 文件。

3. 词汇表的应用

构建好的词汇表可以用于多种 NLP 任务,例如:

  • 文本分类:将文本编码为数值序列,输入到分类模型中。
  • 情感分析:分析文本的情感倾向。
  • 机器翻译:将源语言文本编码为数值序列,翻译为目标语言。

4. 总结

构建词汇表是 NLP 中的一个重要步骤。通过统计字符频率、过滤低频字符并映射为索引值,我们可以高效地处理文本数据。本文通过一个具体的例子展示了如何使用 Python 构建词汇表,并保存为 .pkl 文件以便后续使用。希望这篇文章对你有所帮助!

http://www.xdnf.cn/news/131221.html

相关文章:

  • 浏览器f12可以搜索接口的入参 和返回内容
  • 【Langchain】RAG 优化:提高语义完整性、向量相关性、召回率--从字符分割到语义分块 (SemanticChunker)
  • netcore8.0项目部署到windows服务器中(或个人windows电脑),利用nginx反向代理
  • 【c++11】c++11新特性(下)(可变参数模板、default和delete、容器新设定、包装器)
  • Browser-use使用教程
  • 智慧联络中心SaaS平台Java项目面试实战
  • Linux:进程间通信---匿名管道
  • 数字域残留频偏的补偿原理
  • 【Linux网络】:套接字之UDP
  • 精读27页健康医疗大数据安全管控分类分级实施指南
  • 常见游戏引擎介绍与对比
  • Python在AI虚拟教学视频开发中的核心技术与前景展望
  • uni-app 引入高德地图
  • 交叉编译paho.mqtt.c和paho.mqtt.cpp(MQTT客户端)
  • 【金仓数据库征文】金仓数据库KingbaseES:千行百业国产化征程中的璀璨之星
  • 【尚硅谷Redis6】自用学习笔记
  • leetcode0106. 从中序与后序遍历序列构造二叉树-medium
  • 巧记英语四级单词 Unit5-中【晓艳老师版】
  • 系统思考:看清问题背后的结构
  • 人工智能与机器学习,谁是谁的子集 —— 再谈智能的边界与演进路径
  • Action:Update your application‘s configuration
  • 【Harmony OS】组件
  • 高级java每日一道面试题-2025年4月25日-基础篇[反射篇]-在运行时,如何判断某个类是否实现了特定的接口或扩展了某个父类?
  • 动态规划(1)(java)(面试题)三步问题
  • 深度学习笔记22-RNN心脏病预测(Tensorflow)
  • Python torch.optim.lr_scheduler 常用学习率调度器使用方法
  • Vue3 路由
  • Windows与CasaOS跨平台文件同步:SyncThing本地部署与同步配置流程
  • WebGL2简介
  • Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)