从jieba分词到BERT-wwm——中文自然语言处理(NLP)基础分享系列(7)

从『词袋』到『词序列』

我们之前对于文档的数字化表示,采用的是向量空间模型(例如TF-IDF),又被形象地称为『词袋』模型(Bag-of-words model)。就像是把文档里的词汇,放入到以词典作为标签的袋子里。
我们可以看到,基于词袋模型的文档表示方法,虽然考虑了词的重要程度,但它只是根据词的统计特性表示一个文档,而没有考虑到词在文中的次序。
比方说有这样两句话:
•“熊二/的/哥哥/是/熊大。”
•“熊二/是/熊大/的/哥哥。”
这两句话的TF-IDF数据表示形式是一样的,但它们的语义是截然相反的。

究其原因,是因为词袋模型丢失了文档中的上下文信息。

这样就有了一个新的思路:将文档表示成词编码的一个序列,这样词在文档上下文关系信息就能够保留下来。

建立词典并将文本转成数字序列

接下来我们尝试将文档转换成一个数字序列,方便电脑处理。
首先我们要根据语料库中出现的词建立一个词典,建立数字索引(Index),分别对应到特定的词汇。实际上,这个建立词典的步骤在之前的TF-IDF模型训练函数TfidfVectorizer中已经隐含地做过。但现在我们不再使用TF-IDF,因此需要把这一过程单独拿出来显性实现一下。

在李孟博士的原博客里,后续演示使用的是TensorFlow.Keras相关包,我们改为全部使用Pytorch演示相关功能的实现。

首先,把Jieba分词结果和语料库调入内存。

import pandas as pd 
import pickle 
 
pkl_file_rb = open(r'./save_file', 'rb') 
train =pickle.load(pkl_file_rb) 
 
corpus = pd.concat([train . title1_tokenized, train . title2_tokenized]) 
corpus = [c for c in corpus] 
type(train[0:1])
pandas.core.frame.DataFrame
corpus[16].strip().split() 
['男人', '在', '机舱', '口', '跪下', '原来', '一切', '都', '只', '因为', '爱']

定义一个迭代器对语料库中的分词数据进行预处理:

def yield_tokens(corpus): 
    for i in range(len(corpus)): 
        yield corpus[i].strip().split() 

使用 torchtextbuild_vocab_from_iterator 函数建立词典。

from torchtext.vocab import build_vocab_from_iterator 
 
vocab = build_vocab_from_iterator(yield_tokens(corpus), min_freq=
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值