首页 > 编程知识 正文

python计算文本相似度,挑战程序设计竞赛pdf

时间:2023-05-05 22:33:18 阅读:23199 作者:4727

达观杯文本智能处理(三) ——Word2vec原理与实践一、Word Embedding背景介绍二、Word2vec1.Word2vec理论2.Word2vec原理3.CBOW与Skip-Gram模式4 .培训

一、word嵌入式背景介绍

在NLP (自然语言处理)中,最精细的粒度为词语,词构成句子,句子构成段落、章节和文档。 所以要处理NLP的问题,首先需要对语言开刀。

举个简单的例子,判断语言的感情是正面的还是负面的。 在机器学习的想法中,有一系列的样本(x,y )。 其中x是语言,y是它们的情感类别。 f ) x ) -构建y的映射,但这里的数学模型f )只接受神经网络和SVM等数值型输入。 NLP的语言是人类抽象的总结,是符号形式。 (例如,中文、英语、拉丁语等,或者——嵌入数学空间。 这种嵌入方法称为字嵌入(word embedding ),是Word2vec ,就是词嵌入( word embedding)的一种。

也就是说,我们如何把一堆电脑不知道的语言表示为它知道,从而继续为我们人类服务,达到人类的目的呢? 这种方法是语言嵌入(word embedding )。 把人类理解的语言表示为数学空间中的“语言”,这个数学空间中的“语言”有助于理解我们人类的意思。 也就是说,可以知道哪个词的意思相近。 这体现在数学空间中的距离和概率等概念上。

以上,我了解了word embedding在NLP领域的理由和重要性。

二、Word2vec 1.Word2vec理论word2vec又称word embeddings,中文名称“词向量”用于将自然语言中的词转换为计算机能理解的稠密向量(Dense Vector )。 word2vec出现之前,自然语言处理常常将单词转化为离散的单独符号,即One-Hot Encoder。

杭州[ 0,0,0,0,0,0,1,0,…,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

上海[ 0,0,0,0,1,0,0,0,…,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]

宁波[ 0,0,0,1,0,0,0,0,0,…,0,0,0,0,0,0,0,0,0,0,0,0,0

北京[ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]

例如,在上面的例子中,语料库中杭州、上海、宁波、北京分别对应一个向量,向量中只有一个值是1,剩下的都是0。 但是,One-Hot Encoder的使用存在以下问题。 另一方面,城市代码是随机的,向量之间相互独立,看不到城市之间可能存在的关联关系。 其次,向量维的大小取决于语料库中单词的数量。 如果将与世界所有城市名称相对应的向量组合成一个矩阵,则该矩阵过于稀疏,会引起维数灾难。

使用Vector Representations可以有效解决此问题。 Word2Vec可以将One-Hot Encoder转换为低维的连续值,即密集的向量,其中意义相近的词被映射到向量空间相近的位置。

如果将embed后的城市向量在PCA中去掉维度,进行可视化显示,就会变成这样。

华盛顿和纽约聚集在一起,京沪聚集在一起,你会发现北京到上海的距离接近华盛顿到纽约的距离。 也就是说,模型学习了城市的地理位置,也学习了城市地位的关系。

2.Word2vec原理Wordvec的目标是将一个词表示为一个向量Word2vec中的两个重要模型是CBOW和Skip-gram模型word2vec模型其实就是简单化的神经网络

输入是One-Hot Vector,隐藏层没有激活函数或线性单元。 输出层的维与输入层的维相同,使用的是Softmax回归。 我们获取的dense vector实际上是隐藏层的输出单元。 虽然也有被规定为输入层和隐藏层之间的权重的地方,但其实是在说同样的话。

3.CBOW和Skip-Gram模式word2vec主要分为CBOW(continuousbagofwords )和Skip-Gram两种模式。 CBOW是根据原句子推测目标单词; Skip-Gram正好相反,是从目标单词推测原来的语句。 CBOW适用于小型数据库,而Skip-Gram在大型数据中更好。 对于同一个句子: Hangzhou is a nice city。 我们要构建上下文和目标词汇的映射关系,其实就是input和label的关系。 这里将幻灯片窗口的大小设为1。 (幻灯片窗口的大小……这个……你不知道自己的谷歌吧-_-||| ) )。

CBOW可以制造的映射关系为[Hangzhou,a]—is、[is,nice]—a、[a,city]—nice

Skip-Gram可以制造的映射关系为is、Hangzhou、is、a、a、is、a、nice、nice、a、ni

ce,city)CBOW
CBOW(Continuous Bag-of-Word Model)又称连续词袋模型,是一个三层神经网络。如下图所示,该模型的特点是输入已知上下文,输出对当前单词的预测。

其学习目标是最大化对数似然函数:

其中,w表示语料库C中任意一个词。
首先输入的是one-hot向量,第一层是一个全连接层,然后没有激活函数,输出层是一个softmax层,输出一个概率分布,表示词典中每个词出现的概率。
我们并不关心输出的内容,训练完成后第一个全连接层的参数就是word embedding。

Skip-gram
Skip-gram只是逆转了CBOW的因果关系而已,即已知当前词语,预测上下文.
4.训练注意事项

在第一部分讲解完成后,我们会发现Word2Vec模型是一个超级大的神经网络(权重矩阵规模非常大)。

举个栗子,我们拥有10000个单词的词汇表,我们如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层-输出层的权重矩阵都会有 10000 x 300 = 300万个权重,在如此庞大的神经网络中进行梯度下降是相当慢的。更糟糕的是,你需要大量的训练数据来调整这些权重并且避免过拟合。百万数量级的权重矩阵和亿万数量级的训练样本意味着训练这个模型将会是个灾难。
下面主要介绍两种方法优化训练过程。

1.负采样(negative sampling)
负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。
2.层序softmax也是解决这个问题的一种方法。

三.Word2vec实践 1. python实践 ##读取数据,数据太大,仅选5000条测试import pandas as pdimport numpy as nptrain_data=pd.read_csv('datalab/14936/train_set.csv',nrows=5000)##将训练集拆分成训练集和测试集x=train_data.drop('class',axis=1)y=train_data['class']from sklearn.model_selection import train_test_split#x:要划分的样本集 y:要划分的样本结果#test_size:测试集占比 random_state:随机数的种子x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=123).....................................................................................##word2vec处理##.import gensimimport picklevector_size = 100##辅助函数def sentence2list(sentence): return sentence.strip().split()print("准备数据................ ")sentences_train = list(x_train.loc[:, 'word_seg'].apply(sentence2list))sentences_test = list(x_test.loc[:, 'word_seg'].apply(sentence2list))sentences = sentences_train + sentences_testprint("准备数据完成! ")print("开始训练................ ")model = gensim.models.Word2Vec(sentences=sentences,size=vector_size, window=5, min_count=5, workers=8, sg=1, iter=5)print("训练完成! ")##保存结果wv = model.wvvocab_list = wv.index2wordword_idx_dict = {}for idx, word in enumerate(vocab_list): word_idx_dict[word] = idxvectors_arr = wv.vectorsvectors_arr = np.concatenate((np.zeros(100)[np.newaxis, :], vectors_arr), axis=0) # 第0位置的vector为'unk'的vectorprint(word_idx_dict)print(vectors_arr)f_wordidx = open('word_seg_word_idx_dict.pkl', 'wb')f_vectors = open('word_seg_vectors_arr.pkl', 'wb')pickle.dump(word_idx_dict, f_wordidx)pickle.dump(vectors_arr, f_vectors)f_wordidx.close()f_vectors.close()

结果:展示了词的字典及向量数组

2.word2Vec参数详解

在Python中,我们可以使用gensim库中的word2vec。
函数中的参数如下所示:

sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。

size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为cc,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。

sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。

hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xwxw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xwxw,默认值也是1,不推荐修改默认值。

min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为ηη,默认是0.025。

min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

参考文献

1)CS224:https://www.bilibili.com/video/av41393758/?p=2
2)https://github.com/Heitao5200/DGB/blob/master/feature/feature_code/train_word2vec.py
3)https://blog.csdn.net/sinat_23133783/article/details/89136415

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。