词袋模型、word2vec

发布时间 2023-08-23 11:23:47作者: wangssd

Bag-of-words模型,BOW模型(词袋模型)假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个词汇的出现都是独立的,不依赖于其它词汇是否出现。也就是说,文档中任意一个位置出现的任何单词,都不受该文档语意影响而独立选择的。

基于词袋模型的文本离散化表示存在着数据稀疏向量维度过高字词之间的关系无法度量的问题,适用于浅层的机器学习模型,不适用于深度学习模型。

 

Word2vec使用大量未注释的纯文本,word2vec自动学习到词汇之间的关系,输出是向量,每个词汇一个向量,具有显着的线性语义关系,由此我们可以做诸如vec(“king”) - vec(“man”)+ vec(“woman”)= ~vec(“queen”)之类的加减运算,或vec(“蒙特利尔加拿大人队”) - vec(“蒙特利尔”)+ vec(“多伦多”)等于“多伦多枫叶队”的向量。

 

在中文文本数据里常常会涉及一些外文词汇,尤其是科技领域包含有大量的英文词汇,这时就需要对英文文本数据进行规范化处理了,主要是小写化词干提取词形还原

小写化:lower()就可以转换

词干提取:Porter Stemming算法进行词干分析

词形还原:WordNet词法数据库进行词式化(词形还原就是去掉单词的词缀,提取单词的主干部分,通常提取后的词汇会是字典中的单词,不同于词干提取(stemming),提取后的单词不一定会出现在词汇中。)

 

Word2Vec接受几个影响训练速度和质量的参数,理解它们的大致原理对于训练出一个符合业务需要的Word2Vec模型是至关重要的。

word2Vec输入是词汇,输出是词向量

min_count:用于修剪内部字典(Prune the Internal Dictionary),设置记录词汇出现的最低次数,默认值为5

size:是gensim Word2Vec将词汇映射到的N维空间的维度数量(N),默认size是100,较大的size值需要更多的训练数据,但可以产生更好(更准确)的模型。 合理的size数值介于在几十到几百之间。 如果你拥有的数据较少,那就把维度值设置小一点,这将在一定程度上减少模型的过拟合,尽量提高模型的表现效果。

workers:workers是一个用于训练并行化的参数,可以加快训练速度,默认值3

iter:是模型训练时在整个训练语料库上的迭代次数,假如参与训练的文本量较少,就需要把这个参数调大一些。

sg:是模型训练所采用的的算法类型,默认值为0

1 代表 skip-gram,该模型从上下文语境(context)对目标词汇(target word)的预测中学习到其词向量的表达
0 代表 CBOW,该模型从目标词汇(target word)对上下文语境(context)的预测中学习到其词向量的表达

window:控制窗口,它指当前词和预测词之间的最大距离,默认值为5,如果设得较小,那么模型学习到的是词汇间的组合性关系(词性相异),比如“苹果”和“好红”,“主席”和“伟大”,后者对前者是一种修饰关系;如果设置得较大,会学习到词汇之间的聚合性关系(词性相同),比如“伟大”和“注明”、“可爱”和“卡哇伊”。

假如语料够多,笔者一般会设置得大一些,8~10,因为词汇间的聚合关系能很好的捕捉到词汇之间的相似性关系,能很好的解决词袋表示中多词一义的问题,发现词汇/语句之间的潜在语义相关性。

model = gensim.models.Word2Vec(
                             sentences, 
                             size = 50, 
                             sg=1, 
                             min_count= 3,
                             window = 8,
                             iter = 20 )

 

Word2Vec有一种更为高级的用法,即在线训练,也就是说,当有了新的数据,就可以直接在原来已经训练好的模型上接着训练,而不用从头再来,后续可以不断加入新的语句(经过文本预处理)来提升模型的表现效果。

model.build_vocab(more_sentences, update=True)  #注意该方法中的参数update,默认为False,增量更新模型时,需要设置为True
model.train(more_sentences, total_examples=model.corpus_count, epochs=model.epochs)

 

文本先用jieba进行分词,再对词进行规范化处理,再用word2rec进行词向量转化。