- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
一、实验目的
- 使用N1周的.txt文件构建词典,并自定义停用词
二、实验环境
- 语言环境:python 3.8
- 编译器:Jupyter notebook
- 深度学习环境:Pytorch
- torch==2.1.0+cu118
- torchvision==0.16.0+cu118
三、构建词典
概念:
构建词典(Vocabulary Building)是指在自然语言处理(NLP)任务中,从文本数据中提取词汇并建立一个词汇表的过程。这个词汇表包含了所有需要被识别和处理的单词或词汇单元,以及它们对应的索引或标识符。词典是许多文本处理任务的基础,如文本分类、情感分析、机器翻译等。
意义:
- 标准化处理: 词典使得文本数据的标准化处理成为可能,为后续的文本分析和模型训练提供了统一的输入格式。
- 词汇索引: 词典为每个词汇分配一个唯一的索引,这有助于将文本转换为数值形式,使机器学习模型能够处理文本数据。
- 减少噪音: 通过去除停用词和标点符号,词典有助于减少分词结果中的噪音,提高文本处理的准确性。
- 词汇频次统计: 词典可以统计词汇的频次,这对于识别关键词、进行词频分析等任务至关重要。
- 上下文理解: 词典有助于理解词汇在特定上下文中的含义,尤其是在深度学习模型中,词汇的上下文信息对于模型性能至关重要。
- 模型性能: 一个高质量的词典可以显著提高NLP模型的性能,因为它直接影响到特征提取和模型训练的质量。
- 多语言支持: 在多语言环境中,词典的构建对于跨语言的文本处理任务尤为重要,它支持不同语言之间的翻译和比较分析。
构建词典是NLP中的一个基础且关键步骤,它直接影响到文本数据的处理质量和模型的性能。
四、实验流程
1. 导入数据
# 从torchtext.vocab模块中导入build_vocab_from_iterator函数,用于从迭代器中构建词汇表
from torchtext.vocab import build_vocab_from_iterator
# 从collections模块中导入Counter类,用于计数
from collections import Counter
# 从torchtext.data.utils模块中导入get_tokenizer函数,用于获取分词器
from torchtext.data.utils import get_tokenizer
# 导入jieba库,用于中文分词
import jieba
# 导入re库,用于正则表达式
import re
# 导入torch库,用于深度学习
import torch
# 定义一个包含一些中文文本的列表
data = [
"我是小王啊!",
"我是一名麻醉医生,",
"现在是一个学习敲代码的牛马",
"欢迎参加365深度学习训练营"
]
2. 设置分词器
# 中文分词方法
tokenizer = jieba.lcut
# 加载自定义词典
jieba.load_userdict("任务文件.txt")
3. 清除标点符号与停用词
# 去除标点符号的函数
def remove_punctuation(text):
return re.sub(r'[^\w\s]', '', text)
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>"])
# 将未知的词汇索引为0
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/标记,比如最常用的’',用于代表词汇字典中未存在的token,当然也可以用自己喜欢的符号来代替,具体的意义也取决于用的人
- special_first:表示是否将specials放到字典的最前面,默认是True
- max_tokens:即限制一下这个词汇字典的最大长度。且这个长度包含的specials列表的长度
以上需要注意的几点:
- 若是specials设置为了False,则直接默认加在末尾
- 通过该方法建立的vocab默认按照频次从大到小的顺序排列,若specials_first为True,则specials在最前面
- max_tokens也是按照vocab的顺序,从前往后的保存,也就是说如果两个token出现的频次一样,那么在是按照出现的顺序来决定vocab中两个单词的顺序
- 一般使用时,通常配合set_default_index()一起使用
6. 文本数字化
# 打印词汇表中的内容
print("词典大小:", len(vocab))
print("词典内部映射:", vocab.get_stoi())
text = "现在是一个学习敲代码的牛马"
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])
五、总结
本周主要内容包括:
- 设置分词器和自定义词典:使用jieba进行中文分词,并加载自定义词典。
- 去除标点符号和停用词:定义了
remove_punctuation()
和remove_stopwords()
两个函数,以减少分词结果中的噪音。 - 构建词典:通过
build_vocab_from_iterator()
函数构建词汇表,该函数统计token频次并返回词汇字典。 - 文本数字化:展示了jieba分词后的文本、去除停用词后的文本以及数字化后的文本。。
通过本周的学习,我了解到在深度学习项目中,构建词典和进行文本预处理是至关重要的步骤。使用jieba分词库可以有效地对中文文本进行分词,而自定义词典和停用词的设置则有助于提高分词的准确性和文本处理的质量。
此外,build_vocab_from_iterator()
函数的使用让我认识到了如何从大量文本数据中提取和构建词汇表,这对于后续的模型训练和文本分析工作至关重要。数字化文本的过程也让我更加理解了如何将文本数据转换为模型可处理的数值形式,这是自然语言处理中不可或缺的一环。