- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊
本周任务:
使用N1周的.txt 文件构建词典,停用词请自定义
1. 导入数据
from torchtext.vocab import build_vocab_from_iterator
from collections import Counter
from torchtext.data.utils import get_tokenizer
import jieba, re, torch
data = [
"我是K同学啊!",
"我是一个深度学习博主,",
"这是我的365天深度学习训练营教案,",
"你可以通过百度、微信搜索关键字【K同学啊】找到我"
]
2. 设置分词器
# 中文分词方法
tokenizer = jieba.lcut
# 加载自定义词典
jieba.load_userdict("/root/365_DL/n2/my_dict.txt")
my_dict.txt内容如下:
K同学啊
365天深度学习训练营
深度学习
3. 清除标点符号与停用词
分词过程中可以通过清除标点符号与停用词(对文本语义没有影响的词,例如"的、是、这")来减少分词结果的噪音
# 去除标点符号的函数
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]
4. 设置迭代器
# 定义一个迭代器来返回文本数据中的词汇
def yield_tokens(data_iter):
for text in data_iter:
# 去除标点符号
text = remove_punctuation(text)
# 分词并生成词汇
text = tokenizer(text)
# 去除停用词
text = remove_stopwords(text)
yield text
5. 构建词典
# 使用 build_vocab_from_iterator 来构建词汇表
vocab = build_vocab_from_iterator(yield_tokens(data), specials=["<unk>"])
# 将未知的词汇索引为 <unk>
vocab.set_default_index(vocab["<unk>"])
build_vocab_from_iterator()函数:从一个可迭代对象中统计token的频次并返回一个vocab
build_vocab_from_iterator(iterator: Iterable,
min_freq: int = 1,
specials: Optional[List[str]] = None,
special_first: bool = True,
max_tokens: Optional[int] = None)
参数详解:
· iterator:用于创建 vocab(词汇字典)的可迭代对象。
· min_freq:最小频数。只有在文本中出现频率大于等于 min_freq 的 token 才会被保留下来。
· specials:特殊标志,字符串列表。用于在词汇字典中添加一些特殊的 token/标记,比如最常用的 <unk>,用于代表词汇字典中未存在的 token,当然也可以用自己喜欢的符号来代替,具体的意义也取决于用的人。
· special_first:表示是否将 specials 放到字典的最前面,默认是 True。
· max_tokens:即限制一下这个词汇字典的最大长度。且这个长度包含的 specials 列表的长度。
以上需要注意的几点:
· 若是 specials 设置为了 False,则直接默认加在末尾。
· 通过该方法建立的 vocab 默认按照频次从大到小的顺序排列,若 specials_first 为 True,则 specials 在最前面。
· max_tokens 也是按照 vocab 的顺序,从前往后的保存,也就是说如果两个 token 出现的频次一样,那么是按照出现的顺序来决定 vocab 中两个单词的顺序。
· 一般使用 <unk> 时,通常配合 set_default_index() 一起使用。
6. 文本数字化
# 打印词汇表中的内容
print("词典大小:", len(vocab))
print("词典内部映射:", vocab.get_stoi())
text = "这是我的365天深度学习训练营教案"
words = remove_stopwords(jieba.lcut(text))
print("\n")
print("jieba分词后的文本: ", jieba.lcut(text))
print("去除停用词后的文本: ", remove_stopwords(jieba.lcut(text)))
print("数字化后的文本: ", [vocab[word] for word in words])
7. 个人学习总结
通过本周的深度学习训练营项目,我学到了如何使用自然语言处理(NLP)中的基本技术来构建词典,并对文本进行预处理。首先,我掌握了如何从文本数据中提取词汇,并通过去除标点符号和停用词来减少噪音。这一步骤非常重要,因为干净的文本数据能够显著提高模型的训练效果。例如,在去除“的”、“是”等停用词后,文本的语义更加突出,模型可以更好地捕捉关键信息。
其次,我学会了如何使用jieba
进行中文分词,并通过自定义词典来优化分词结果。例如,在项目中,我将“K同学啊”和“365天深度学习训练营”等专有名词添加到自定义词典中,确保这些词汇在分词时不会被错误地拆开。这一技巧在实际应用中非常有用,尤其是在处理特定领域的文本时,能够有效提高分词的准确性。
此外,我还学习了如何使用torchtext
库中的build_vocab_from_iterator
函数来构建词汇表,并将文本数据数字化。通过这一过程,我理解了如何将自然语言转换为模型可以处理的数字形式。例如,在项目中,我将“这是我的365天深度学习训练营教案”这句话分词后,去除停用词,并将其转换为数字序列,方便后续的模型输入。