第N2周:构建词典

任务:

使用N1周的.txt文件构建词典,停用词请自定义。

N1周的.txt文件名称是“任务文件.txt”,内容如下所示:

比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。
为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码:

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("./N2/my_dict.txt")

jieba 是一个由 Python 编写的中文分词库,用于对中文文本进行分词(知道这个就可以了,没有必要深入),其安装方法如下:

●cmd命令:pip install jieba

my_dict.txt文件内容如下:
在这里插入图片描述

3.清除标点符号与停用词
在使用 jieba 进行分词时,可以通过去除标点符号来减少分词结果中的噪音。

# 去除标点符号的函数
def remove_punctuation(text):
    return re.sub(r'[^\w\s]', '', text)

在使用 jieba 进行分词时,可以通过去除停用词(即没有具体含义、对文本语义没有影响的词汇,如“的”、“是”、“这”)来减少分词结果中的噪音。标点符号与停用词的去除通常有助于提高文本分类任务的效果。

# 假设我们有一个停用词表,内容如下:
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>"])

# 将未知的词汇索引为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/ 标记,比如最常用的 ‘< unk >’ ,用于代表词汇字典中未存在的 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 = "这是我的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])

代码输出:

词典大小: 16
词典内部映射: {'<unk>': 0, 'K同学啊': 2, '你': 5, '可以': 8, '我': 1, '博主': 7, '关键字': 6, '365天深度学习训练营': 3, '一个': 4, '微信': 9, '找到': 10, '搜索': 11, '教案': 12, '深度学习': 13, '百度': 14, '通过': 15}


jieba分词后的文本: ['这', '是', '我', '的', '365天深度学习训练营', '教案']
去除停用词后的文本: ['我', '365天深度学习训练营', '教案']
数字化后的文本: [1, 3, 12]
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值