N8 - 使用Word2Vec进行文本分类



由于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中用于数据加载和预处理的模块,其中包含DatasetDataLoader两个类,通常结合使用来加载和处理数据。

1. Dataset

torch.utils.data.Dataset是一个抽象类,用于表示数据集。

自定义Dataset需要继承这个基类,并实现两个方法__len____getitem__

其中__len__返回的是数据集的大小,__getitem__</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值