- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
目录
由于K同学调整了目录,本来这应该是N6,现在是N8了,中间增加了两节内容,在这里一并打卡了。
N2 构建词典
其实在前面的章节打卡中,也涉及到了构建词典,但是没有一个完整的顺序,这节把构建词典的过程详细的梳理了一下。
1. 导入数据
使用自定义的数据,我直接从网络小说里面截取一段出来。然后按句拆开放到一个列表里。
# 数据
data = [
"我这才想起今天的米彩在上海参加了一天的商务会谈,后又不顾疲惫来酒吧救场,心中除了感谢更过意不去。",
"CC推了推我说道:“昭阳,你不送送米儿吗?”",
"我赶忙点头说道:“嗯,我送她出去。”说着便从米彩手中接过手提包帮她提着。",
"米彩说了声“谢谢”后在我之前向酒吧外走去,我跟上了她说道:“你老和我说谢谢,弄得我们之间多生分吶!”",
"“有吗?”"
"米彩心不在焉的回答,让我无从去接她的话,只是在沉默中跟着她的脚步向外面走着。",
"忽然我们的脚步止于酒吧外面的屋檐下,此刻天空竟然飘起了漫天的雪花,这个冬天终于下雪了。",
"我下意识的感叹,道:“下雪了!”",
"“嗯!”米彩应了一声,却比我更会珍惜这样的画面,从手提包里拿出卡片相机将眼前银装素裹的世界定格在了镜头里,然后离开屋檐,走进了漫天的雪花中。"
]
# 把人名弄成自定义字典
user_dictionary = [
"CC", "昭阳","米儿", "米彩"
]
2. 设置分词器
import jieba
tokenizer = jieba.lcut
jieba.load_userdict(user_dictionary)
3. 去除标点和停用词
编写一个过滤函数去除标点符号
import re
def remove_punctuation(text):
return re.sub(r'[^\w\s]', '', text)
维护一个停用词列表,编写停用词过滤函数
stopwords = ['的', '这', '是']
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)
# 分词
words = tokenizer(text)
# 去除停用词
words = remove_stopwords(words)
yield words
5. 构建词典
from torchtext.vocab import 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的频次,并返回一个词典
它的原型如下
def 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: 用于创建词典的可迭代对象
- min_freq: 最小频数,文本中的词汇只有频数大于min_freq的才会保留下来,出现在词典中
- specials: 特殊标志,值是一个字符串的列表。用于在词典中添加一些特殊的token,例如我们使用<unk>来代表字典中不存在的token。
- special_first: 表示是否将special token放在词典顺序的最前面(也就是Index小),默认是True
- max_tokens: 限制词典词汇的最大数量
备注:除了special_token之外的token是按词频来降序排列的,如果两个词的频次一样,则按出现顺序。
set_default_index可以设置默认使用的token,比如添加一个<unk>设置为默认。
6. 文本数字化
# 打印词典中的内容
print('词典大小:', len(vocab))
print('词典内部映射:', vocab.get_stoi())
text = "外面是冬天"
words = remove_stopwords(jieba.lcut(text))
print()
print('jieba分词后的文本:', jieba.lcut(text))
print('去除停用词后的文本:', words)
print('数字化后的文本:', [vocab[word] for word in words])
N3 NLP中的数据集构建
torch.utils.data
是pytorch中用于数据加载和预处理的模块,其中包含Dataset
和DataLoad