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

第N2周:构建词典

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

因为我安装的pytorch2.7.0+cpu,最多能安装成功torchtext版本是0.6.0,总是报错,所以就手动构建词汇表类。

# 导入必要的库
from collections import Counter  # 用于词频统计
import jieba  # 中文分词库
import re  # 正则表达式库
import torch  # PyTorch 库
import datetimeprint(datetime.datetime.now())
# 示例文本数据
data = ["孤城鏖战数万兵","十三将士归玉门"]# 中文分词方法,使用 jieba 分词工具
tokenizer = jieba.lcut# 如果有自定义词典,可以通过此方法加载
# jieba.load_userdict("my_dict.txt")# 去除标点符号的函数
def remove_punctuation(text):"""使用正则表达式去除文本中的标点符号。"""return re.sub(r'[^\w\s]', '', text)  # 匹配所有非字母、数字或空格的字符,替换为空# 假设我们有一个简单的停用词表,包含一些无意义的常用词
stopwords = set(["的", "这", "是"  # 停用词示例
])# 去除停用词的函数
def remove_stopwords(words):"""从分词后的列表中去除停用词。"""return [word for word in words if word not in stopwords]  # 保留不在停用词表中的词# 生成分词迭代器,用于构建词汇表
def yield_tokens(data):"""对文本数据进行分词并去除停用词和标点符号,生成词汇列表。"""for text in data:# 使用 jieba 对文本进行分词words = tokenizer(text)# 去除停用词words = remove_stopwords(words)# 去除标点符号words = [remove_punctuation(word) for word in words]# 过滤掉空字符串words = [word for word in words if word]# 生成一个词汇列表,供词汇表构建使用yield words# 手动构建词汇表类
class Vocab:def __init__(self, tokens_iterator, specials=["<unk>"], min_freq=1):"""手动构建词汇表参数:tokens_iterator: 分词后的迭代器specials: 特殊标记列表min_freq: 最小词频阈值"""# 统计词频counter = Counter()for tokens in tokens_iterator:counter.update(tokens)# 构建词汇表self.itos = []  # index to stringself.stoi = {}  # string to index# 添加特殊标记for special in specials:if special not in self.stoi:self.itos.append(special)self.stoi[special] = len(self.itos) - 1# 添加满足最小词频的词for token, freq in counter.items():if freq >= min_freq and token not in self.stoi:self.itos.append(token)self.stoi[token] = len(self.itos) - 1# 设置默认索引(未知词索引)self.unk_index = self.stoi.get("<unk>", 0)def __getitem__(self, token):"""获取token的索引,如果token不存在则返回未知词索引"""return self.stoi.get(token, self.unk_index)def __len__(self):"""返回词汇表大小"""return len(self.itos)def get_stoi(self):"""返回词到索引的映射字典"""return self.stoidef get_itos(self):"""返回索引到词的映射列表"""return self.itos# 使用自定义的Vocab类来构建词汇表
vocab = Vocab(yield_tokens(data), specials=["<unk>"])# 打印词汇表的大小和词汇表内部的映射关系
print("词典大小:", len(vocab))  # 输出词汇表中不同词汇的数量
print("词典内部映射:", vocab.get_stoi())  # 输出词到索引的映射# 示例文本
text = "一生何求百岁名,四海皆兄弟。"
# 使用 jieba 对示例文本进行分词
words = remove_stopwords(jieba.lcut(text))  # 去除停用词后的词汇列表
words = [remove_punctuation(word) for word in words]  # 去除标点符号
words = [word for word in words if word]  # 过滤空字符串print("\n")
# 打印分词后的文本
print("jieba分词后的文本:", jieba.lcut(text))  # 输出分词结果
# 打印去除停用词后的文本
print("去除停用词后的文本:", words)  # 输出去除停用词后的结果
# 将文本中的词转换成数字索引
print("数字化后的文本:", [vocab[word] for word in words])  # 输出数字化后的词汇索引

运行结果如下

2025-10-31 21:47:07.653140
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\pozhen\AppData\Local\Temp\jieba.cache
Loading model cost 0.476 seconds.
Prefix dict has been built successfully.
词典大小: 9
词典内部映射: {'<unk>': 0, '孤城': 1, '鏖战': 2, '数万': 3, '兵': 4, '十三': 5, '将士': 6, '归': 7, '玉门': 8}jieba分词后的文本: ['一生何求', '百岁', '名', ',', '四海', '皆', '兄弟', '。']
去除停用词后的文本: ['一生何求', '百岁', '名', '四海', '皆', '兄弟']
数字化后的文本: [0, 0, 0, 0, 0, 0]进程已结束,退出代码为 0
http://www.dtcms.com/a/553526.html

相关文章:

  • 德意志飞机D328eco携手ADS:CMS+IETM双引擎,点燃通用航空效率革命
  • c#获取当前程序所在目录避坑
  • day59-Shell编程(第五部分)
  • 网站建设客户需求分析调查表江苏国泰做的网站案例
  • VUE3+element plus el-table上下拖拽
  • 【模拟面试|豆包模拟面试-1 Java基础】
  • AI优化亚马逊广告:DeepBI智能化托管让广告运营从负担变轻松,ACOS优化至23%以下
  • 关键词解释:梯度消失(Vanishing Gradient)与 梯度爆炸(Exploding Gradient)
  • 天津网站建设如何最近火爆的新闻
  • Maven内核探秘:从启动到构建全流程
  • CNCC 2025|开源AI基础设施论坛成功举办
  • 开源可信MCP,AICC机密计算新升级!
  • 混元图像3.0开源原生多模态生图新篇章
  • 环境搭建与第一个程序:Hello, Rust!
  • [论文阅读] AI | 大语言模型服务系统服务级目标和系统级指标优化研究
  • 帝国网站管理系统视频教程asp网站开发
  • 自己做的网站申请软著物联网是干嘛的
  • 企业形象破局指南——缺乏专业线上展示?官网SEO优化重构品牌信任
  • webgl 变换矩阵:旋转、平移、缩放
  • 怎么做婚介网站襄阳php网站开发
  • 网站建设规划书案例济南做网站互联网公司有哪些
  • float为什么会丢失精度?
  • 网站产品后台界面怎么做微信朋友圈广告推广
  • 香港科技大学广州|可持续能源与环境学域博士招生宣讲会—吉林大学专场
  • LaTeX 重点表格文字对不齐(有些列文字和其他列差一行才显示)的原因和解决办法
  • 网站推广必做百度云打开的wordpress
  • soular零基础学习,如何统一管理TikLab帐号体系
  • kanass零基础学习:创建第一个项目
  • 【C语言实战(66)】筑牢防线:C语言安全编码之输入与错误处理
  • 【机器学习11】决策树进阶、随机森林、XGBoost、模型对比