赞
踩
从『词袋』到『词序列』
我们之前对于文档的数字化表示,采用的是向量空间模型(例如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()
使用 torchtext 的 build_vocab_from_iterator 函数建立词典。
from torchtext.vocab import build_vocab_from_iterator
vocab = build_vocab_from_iterator(yield_tokens(corpus), min_freq=
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。