如何通过词向量技术来计算2个文档的向量相似度计算

&&&&word2vec词向量训练及中文文本相似度计算 【源码+语料】
word2vec词向量训练及中文文本相似度计算 【源码+语料】
该资源主要参考我的博客:word2vec词向量训练及中文文本相似度计算
http://blog.csdn.net/eastmount/article/details/
其中包括C语言的Word2vec源代码(从官网下载),自定义爬取的三大百科(百度百科、互动百科、维基百科)中文语料,涉及到国家、景区、动物和人物。
同时包括60M的腾讯新闻语料,是一个txt,每行相当于一个新闻。
国家包括了Python的Jieba分词代码,详见博客。
免费资源希望对你有所帮助~
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行I Love Natural Language Processing
我们介绍了一些背景知识以及 , 相信很多同学已经尝试过了。这一节将从gensim最基本的安装讲起,然后举一个非常简单的例子用以说明如何使用gensim,下一节再介绍其在上的应用。
二、gensim的安装和使用
gensim依赖和这两大Python科学计算工具包,一种简单的安装方法是pip install,但是国内因为网络的缘故常常失败。所以我是下载了gensim的源代码包安装的。gensim的这个很详细的列举了兼容的Python和NumPy, SciPy的版本号以及安装步骤,感兴趣的同学可以直接参考。下面我仅仅说明在Ubuntu和Mac OS下的安装:
1)我的VPS是64位的Ubuntu 12.04,所以安装numpy和scipy比较简单”sudo apt-get install python-numpy python-scipy”, 之后解压gensim的安装包,直接“sudo python setup.py install”即可;
2)我的本是macbook pro,在mac os上安装numpy和scipy的源码包废了一下周折,特别是后者,一直提示fortran相关的东西没有,google了一下,发现很多人在mac上安装scipy的时候都遇到了这个问题,最后通过homebrew安装了gfortran才搞定:“brew install gfortran”,之后仍然是“sudo python setpy.py install” numpy 和 scipy即可;
gensim的官方非常详细,英文ok的同学可以直接参考。以下我会按自己的理解举一个例子说明如何使用gensim,这个例子不同于gensim官方的例子,可以作为一个补充。上一节提到了一个文档: , 这个例子的来源就是这个文档所举的3个一句话doc。首先让我们在命令行中打开python,做一些准备工作:
>>> from gensim import corpora, models, similarities
>>> import logging
>>> logging.basicConfig(format=’%(asctime)s : %(levelname)s : %(message)s’, )
然后将上面那个文档中的例子作为文档输入,在Python中用document list表示:
>>> documents = [“Shipment of gold damaged in a fire”,
… “Delivery of silver arrived in a silver truck”,
… “Shipment of gold arrived in a truck”]
正常情况下,需要对英文文本做一些预处理工作,譬如去停用词,对文本进行tokenize,stemming以及过滤掉低频的词,但是为了说明问题,也是为了和这篇”LSI Fast Track Tutorial”保持一致,以下的预处理仅仅是将英文单词小写化:
>>> texts = [[word for word in document.lower().split()] for document in documents]
>>> print texts
[[‘shipment’, ‘of’, ‘gold’, ‘damaged’, ‘in’, ‘a’, ‘fire’], [‘delivery’, ‘of’, ‘silver’, ‘arrived’, ‘in’, ‘a’, ‘silver’, ‘truck’], [‘shipment’, ‘of’, ‘gold’, ‘arrived’, ‘in’, ‘a’, ‘truck’]]
我们可以通过这些文档抽取一个““,将文档的token映射为id:
>>> dictionary = corpora.Dictionary(texts)
>>> print dictionary
Dictionary(11 unique tokens)
>>> print dictionary.token2id
{‘a’: 0, ‘damaged’: 1, ‘gold’: 3, ‘fire’: 2, ‘of’: 5, ‘delivery’: 8, ‘arrived’: 7, ‘shipment’: 6, ‘in’: 4, ‘truck’: 10, ‘silver’: 9}
然后就可以将用字符串表示的文档转换为用id表示的文档向量:
>>> corpus = [dictionary.doc2bow(text) for text in texts]
>>> print corpus
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)], [(0, 1), (4, 1), (5, 1), (7, 1), (8, 1), (9, 2), (10, 1)], [(0, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (10, 1)]]
例如(9,2)这个元素代表第二篇文档中id为9的单词“silver”出现了2次。
有了这些信息,我们就可以基于这些“训练文档”计算一个TF-IDF“模型”:
>>> tfidf = models.TfidfModel(corpus)
18:58:15,831 : INFO : collecting document frequencies
18:58:15,881 : INFO : PROGRESS: processing document #0
18:58:15,881 : INFO : calculating IDF weights for 3 documents and 11 features (21 matrix non-zeros)
基于这个TF-IDF模型,我们可以将上述用词频表示文档向量表示为一个用tf-idf值表示的文档向量:
>>> corpus_tfidf = tfidf[corpus]
>>> for doc in corpus_tfidf:
[(1, 0.4505), (2, 0.4505), (3, 0.8463), (6, 0.8463)]
[(7, 0.56623), (8, 0.3605), (9, 0.721), (10, 0.56623)]
[(3, 0.5), (6, 0.5), (7, 0.5), (10, 0.5)]
发现一些token貌似丢失了,我们打印一下tfidf模型中的信息:
>>> print tfidf.dfs
{0: 3, 1: 1, 2: 1, 3: 2, 4: 3, 5: 3, 6: 2, 7: 2, 8: 1, 9: 1, 10: 2}
>>> print tfidf.idfs
{0: 0.0, 1: 1....0, 5: 0.0, 6: 0.....1562}
我们发现由于包含id为0, 4, 5这3个单词的文档数(df)为3,而文档总数也为3,所以idf被计算为0了,看来gensim没有对分子加1,做一个平滑。不过我们同时也发现这3个单词分别为a, in, of这样的介词,完全可以在预处理时作为停用词干掉,这也从另一个方面说明TF-IDF的有效性。
有了tf-idf值表示的文档向量,我们就可以训练一个LSI模型,和中的例子相似,我们设置topic数为2:
>>> lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=2)
>>> lsi.print_topics(2)
19:15:26,467 : INFO : topic #0(1.137): 0.438*”gold” + 0.438*”shipment” + 0.366*”truck” + 0.366*”arrived” + 0.345*”damaged” + 0.345*”fire” + 0.297*”silver” + 0.149*”delivery” + 0.000*”in” + 0.000*”a”
19:15:26,468 : INFO : topic #1(1.000): 0.728*”silver” + 0.364*”delivery” + -0.364*”fire” + -0.364*”damaged” + 0.134*”truck” + 0.134*”arrived” + -0.134*”shipment” + -0.134*”gold” + -0.000*”a” + -0.000*”in”
lsi的物理意义不太好解释,不过最核心的意义是将训练文档向量组成的矩阵SVD分解,并做了一个秩为2的近似SVD分解,可以参考那篇英文tutorail。有了这个lsi模型,我们就可以将文档映射到一个二维的topic空间中:
>>> corpus_lsi = lsi[corpus_tfidf]
>>> for doc in corpus_lsi:
[(0, 0.78649), (1, -0.55917)]
[(0, 0.97727), (1, 0.39041)]
[(0, 0.92647)]
可以看出,文档1,3和topic1更相关,文档2和topic2更相关;
我们也可以顺手跑一个LDA模型:
>>> lda = models.LdaModel(copurs_tfidf, id2word=dictionary, num_topics=2)
>>> lda.print_topics(2)
19:44:40,026 : INFO : topic #0: 0.119*silver + 0.107*shipment + 0.104*truck + 0.103*gold + 0.102*fire + 0.101*arrived + 0.097*damaged + 0.085*delivery + 0.061*of + 0.061*in
19:44:40,026 : INFO : topic #1: 0.110*gold + 0.109*silver + 0.105*shipment + 0.105*damaged + 0.101*arrived + 0.101*fire + 0.098*truck + 0.090*delivery + 0.061*of + 0.061*in
lda模型中的每个主题单词都有概率意义,其加和为1,值越大权重越大,物理意义比较明确,不过反过来再看这三篇文档训练的2个主题的LDA模型太平均了,没有说服力。
好了,我们回到LSI模型,有了LSI模型,我们如何来计算文档直接的相思度,或者换个角度,给定一个查询Query,如何找到最相关的文档?当然首先是建索引了:
>>> index = similarities.MatrixSimilarity(lsi[corpus])
19:50:30,282 : INFO : scanning corpus to determine the number of features
19:50:30,282 : INFO : creating matrix for 3 documents and 2 features
还是以这篇英文tutorial中的查询Query为例:gold silver truck。首先将其向量化:
>>> query = “gold silver truck”
>>> query_bow = dictionary.doc2bow(query.lower().split())
>>> print query_bow
[(3, 1), (9, 1), (10, 1)]
再用之前训练好的LSI模型将其映射到二维的topic空间:
>>> query_lsi = lsi[query_bow]
>>> print query_lsi
[(0, 1.8467), (1, 0.49593)]
最后就是计算其和index中doc的余弦相似度了:
>>> sims = index[query_lsi]
>>> print list(enumerate(sims))
[(0, 0.), (1, 0.), (2, 0.)]
当然,我们也可以按相似度进行排序:
>>> sort_sims = sorted(enumerate(sims), key=lambda item: -item[1])
>>> print sort_sims
[(1, 0.), (2, 0.), (0, 0.)]
可以看出,这个查询的结果是doc2 > doc3 > doc1,和fast tutorial是一致的,虽然数值上有一些差别:
好了,这个例子就到此为止,下一节我们将主要说明如何基于gensim计算上课程之间的主题相似度,同时考虑一些改进方法,包括借助英文的自然语言处理工具包以及用更大的维基百科的语料来看看效果。
未完待续…
注:原创文章,转载请注明出处“”:
本文链接地址:
此条目发表在, , 分类目录,贴了, , , , , , , , , , , , , , , , , , , , , 标签。将加入收藏夹。
Pingback引用通告:
NLP相关网站
本站架设在
上, 采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.I Love Natural Language Processing
前几天,我发布了一个和在线教育相关的网站:,这个网站的目的通过对公开课的导航、推荐和点评等功能方便大家找到感兴趣的公开课,特别是目前最火的Coursera,Udacity等公开课平台上的课程。在发布之前,遇到的一个问题是如何找到两个相关的公开课,最早的计划是通过用户对课程的关注和用户对用户的关注来做推荐,譬如“你关注的朋友也关注这些课程”,但是问题是网站发布之前,我还没有积累用户关注的数据。另外一个想法是提前给课程打好标签,通过标签来计算它门之间的相似度,不过这是一个人工标注的过程,需要一定的时间。当然,另一个很自然的想法是通过课程的文本内容来计算课程之间的相似度,公开课相对来说有很多的文本描述信息,从文本分析的角度来处理这种推荐系统的冷启动问题应该不失为一个好的处理方法。通过一些调研和之前的一些工作经验,最终考虑采用Topic model来解决这个问题,其实方案很简单,就是将两个公开课的文本内容映射到topic的维度,然后再计算其相似度。然后的然后就通过google发现了这个强大的Python工具包,它的简介只有一句话:topic modelling for humans, 用过之后,只能由衷的说一句:感谢上帝,感谢Google,感谢开源!
当前中所有课程之间的相似度全部基于gensim计算,自己写的调用代码不到一百行,topic模型采用(Latent semantic indexing, 中文译为浅层语义索引),LSI和(Latent semantic analysis,中文译为浅层语义分析)这两个名词常常混在一起,事实上,在维基百科上,有建议将这两个名词合二为一。以下是的一个效果图,课程为著名的机器学习专家Andrew Ng教授在,图片显示的是主题模型计算后排名前10的相关课程,Andrew Ng教授同时也是Coursera的创始人之一:
     
最后回到这篇文章的主题,我将会分3个部分介绍,首先介绍一些相关知识点,不过不会详细介绍每个知识点的细节,主要是简要的描述一下同时提供一些互联网上现有的不错的参考资料,如果读者已经很熟悉,可以直接跳过去;第二部分我会介绍gensim的安装和使用,特别是如何计算上课程之间的相似度的;第三部分包括如何基于全量的英文维基百科(400多万文章,压缩后9个多G的语料)在一个4g内存的macbook上训练LSI模型和LDA模型,以及如何将其应用到课程图谱上来改进课程之前的相似度的效果,注意课程图谱的课程内容主要是英文,目前的效果还是第二部分的结果,第三部分我们一起来实现。如果你的英文没问题,第二,第三部分可以直接阅读gensim的,我所做的事情主要是基于这个tutorail在上做了一些验证。
一、相关的知识点及参考资料
这篇文章不会写很长,但是涉及的知识点蛮多,所以首先会在这里介绍相关的知识点,了解的同学可以一笑而过,不了解的同学最好能做一些预习,这对于你了解topic model以及gensim更有好处。如果以后时间允许,我可能会基于其中的某几个点写一篇比较详细的介绍性的文章。不过任何知识点首推维基百科,然后才是下面我所罗列的参考资料。
1) TF-IDF,余弦相似度,向量空间模型
这几个知识点在信息检索中是最基本的,入门级的参考资料可以看看吴军老师在《》中第11章“如何确定网页和查询的相关性”和第14章“余弦定理和新闻的分类”中的通俗介绍或者阮一峰老师写的两篇科普文章“”和“”。
专业一点的参考资料推荐王斌老师在中科院所授的研究生课程“”的课件,其中“第六讲向量模型及权重计算”和该主题相关。或者更详细的可参考王斌老师翻译的经典的《》第6章或者其它相关的信息检索书籍。
2)SVD和LSI
想了解LSI一定要知道SVD(, 中文译为奇异值分解),而SVD的作用不仅仅局限于LSI,在很多地方都能见到其身影,SVD自诞生之后,其应用领域不断被发掘,可以不夸张的说如果学了线性代数而不明白SVD,基本上等于没学。想快速了解或复习SVD的同学可以参考这个英文tutorial:
, 当然更推荐MIT教授和相关书籍,你可以直接在网易公开课看相关章节的视频。
关于LSI,简单说两句,一种情况下我们考察两个词的关系常常考虑的是它们在一个窗口长度(譬如一句话,一段话或一个文章)里的共现情况,在语料库语言学里有个专业点叫法叫,中文译为搭配或词语搭配。而LSI所做的是挖掘如下这层词语关系:A和C共现,B和C共现,目标是找到A和B的隐含关系,学术一点的叫法是second-order co-ocurrence。以下引用上一篇介绍相关参考资料时的简要描述:
LSI本质上识别了以文档为单位的second-order co-ocurrence的单词并归入同一个子空间。因此:
1)落在同一子空间的单词不一定是同义词,甚至不一定是在同情景下出现的单词,对于长篇文档尤其如是。
2)LSI根本无法处理一词多义的单词(多义词),多义词会导致LSI效果变差。
A persistent myth in search marketing circles is that LSI
i.e., terms occurring in the same context. This is not always the case. Consider two documents X and Y and three terms A, B and C and wherein:
A and B do not co-occur.
X mentions terms A and C
Y mentions terms B and C.
:. A—C—B
The common denominator is C, so we define this relation as an in-transit co-occurrence since both A and B occur while in transit with C. This is called second-order co-occurrence and is a special case of high-order co-occurrence.
其实我也推荐国外这篇由Dr. E. Garcia所写的SVD与LSI的通俗教程,这个系列最早是微博上有朋友推荐,不过发现英文原始网站上内容已经被其主人下架了,原因不得而知。幸好还有Google,在CSDN上我找到了这个系列“”,不过很可惜很多图片都看不见了,如果哪位同学发现更好的版本或有原始的完整版本,可以告诉我,不甚感激!
不过幸好原文作者写了两个简要的PDF Tutorial版本:
这两个简明版本主要是通过简单的例子直观告诉你什么是SVD,什么是LSI,非常不错。
这几个版本的pdf文件我在微盘上上传了一个打包文件,也可以从这里下载:
这个啥也不说了,隆重推荐我曾经在腾讯工作时的leader 的”“系列,通俗易懂,娓娓道来,另外rick的也是非常值得一读的。
未完待续…
注:原创文章,转载请注明出处“”:
本文链接地址:
此条目发表在, , 分类目录,贴了, , , , , , , , , , , , , , , 标签。将加入收藏夹。
NLP相关网站
本站架设在
上, 采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.word2vec词向量训练及中文文本相似度计算
本文是讲述如何使用word2vec的基础教程,文章比较基础,希望对你有所帮助!
官网C语言下载地址:
官网下载地址:
1.简单介绍
参考:《Word2vec的核心架构及其应用 & 熊富林,邓怡豪,唐晓晟 & 北邮2015年》
《Word2vec的工作原理及应用探究 & 周练 & 西安电子科技大学2014年》
《Word2vec对中文词进行聚类的研究 & 郑文超,徐鹏 & 北京邮电大学2013年》
PS:第一部分主要是给大家引入基础内容作铺垫,这类文章很多,希望大家自己去学习更多更好的基础内容,这篇博客主要是介绍Word2Vec对中文文本的用法。
(1) 统计语言模型
统计语言模型的一般形式是给定已知的一组词,求解下一个词的条件概率。形式如下:
统计语言模型的一般形式直观、准确,n元模型中假设在不改变词语在上下文中的顺序前提下,距离相近的词语关系越近,距离较远的关联度越远,当距离足够远时,词语之间则没有关联度。
但该模型没有完全利用语料的信息:
1) 没有考虑距离更远的词语与当前词的关系,即超出范围n的词被忽略了,而这两者很可能有关系的。
例如,&华盛顿是美国的首都&是当前语句,隔了大于n个词的地方又出现了&北京是中国的首都&,在n元模型中&华盛顿&和&北京&是没有关系的,然而这两个句子却隐含了语法及语义关系,即&华盛顿&和&北京&都是名词,并且分别是美国和中国的首都。
2) 忽略了词语之间的相似性,即上述模型无法考虑词语的语法关系。
例如,语料中的&鱼在水中游&应该能够帮助我们产生&马在草原上跑&这样的句子,因为两个句子中&鱼&和&马&、&水&和&草原&、&游&和&跑&、&中&和&上&具有相同的语法特性。
而在神经网络概率语言模型中,这两种信息将充分利用到。
(2) 神经网络概率语言模型
神经网络概率语言模型是一种新兴的自然语言处理算法,该模型通过学习训练语料获取词向量和概率密度函数,词向量是多维实数向量,向量中包含了自然语言中的语义和语法关系,词向量之间余弦距离的大小代表了词语之间关系的远近,词向量的加减运算则是计算机在&遣词造句&。
神经网络概率语言模型经历了很长的发展阶段,由Bengio等人2003年提出的神经网络语言模型NNLM(Neural networklanguage model)最为知名,以后的发展工作都参照此模型进行。历经十余年的研究,神经网络概率语言模型有了很大发展。
如今在架构方面有比NNLM更简单的CBOW模型、Skip-gram模型;其次在训练方面,出现了Hierarchical Softmax算法、负采样算法(Negative Sampling),以及为了减小频繁词对结果准确性和训练速度的影响而引入的欠采样(Subsumpling)技术。
上图是基于三层神经网络的自然语言估计模型NNLM(Neural Network Language Model)。NNLM可以计算某一个上下文的下一个词为wi的概率,即(wi=i|context),词向量是其训练的副产物。NNLM根据语料库C生成对应的词汇表V。
近年来,神经网络概率语言模型发展迅速,Word2vec是最新技术理论的合集。
Word2vec是Google公司在2013年开放的一款用于训练词向量的软件工具。所以,在讲述word2vec之前,先给大家介绍词向量的概念。
(3) 词向量
正如作者所说:Deep Learning 算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果。有一种说法是,语言(词、句子、篇章等)属于人类认知过程中产生的高层认知抽象实体,而语音和图像属于较为底层的原始输入信号,所以后两者更适合做deep learning来学习特征。
但是将词用&词向量&的方式表示可谓是将 Deep Learning 算法引入 NLP 领域的一个核心技术。自然语言理解问题转化为机器学习问题的第一步都是通过一种方法把这些符号数学化。
词向量具有良好的语义特性,是表示词语特征的常用方式。词向量的每一维的值代表一个具有一定的语义和语法上解释的特征。故可以将词向量的每一维称为一个词语特征。词向量用Distributed Representation表示,一种低维实数向量。
例如,NLP中最直观、最常用的词表示方法是One-hot Representation。每个词用一个很长的向量表示,向量的维度表示词表大小,绝大多数是0,只有一个维度是1,代表当前词。
&话筒&表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 &] 即从0开始话筒记为3。
但这种One-hot Representation采用稀疏矩阵的方式表示词,在解决某些任务时会造成维数灾难,而使用低维的词向量就很好的解决了该问题。同时从实践上看,高维的特征如果要套用Deep Learning,其复杂度几乎是难以接受的,因此低维的词向量在这里也饱受追捧。
Distributed Representation低维实数向量,如:[0.792, ?0.177, ?0.107, 0.109, ?0.542, &]。它让相似或相关的词在距离上更加接近。
总之,Distributed Representation是一个稠密、低维的实数限量,它的每一维表示词语的一个潜在特征,该特征捕获了有用的句法和语义特征。其特点是将词语的不同句法和语义特征分布到它的每一个维度上去表示。
推荐我前面的基础文章:
(4) Word2vec
参考:Word2vec的核心架构及其应用 & 熊富林,邓怡豪,唐晓晟 & 北邮2015年
Word2vec是Google公司在2013年开放的一款用于训练词向量的软件工具。它根据给定的语料库,通过优化后的训练模型快速有效的将一个词语表达成向量形式,其核心架构包括CBOW和Skip-gram。
在开始之前,引入模型复杂度,定义如下:
O = E * T * Q
其中,E表示训练的次数,T表示训练语料中词的个数,Q因模型而异。E值不是我们关心的内容,T与训练语料有关,其值越大模型就越准确,Q在下面讲述具体模型是讨论。
NNLM模型是神经网络概率语言模型的基础模型。在NNLM模型中,从隐含层到输出层的计算时主要影响训练效率的地方,CBOW和Skip-gram模型考虑去掉隐含层。实践证明新训练的词向量的精确度可能不如NNLM模型(具有隐含层),但可以通过增加训练语料的方法来完善。
Word2vec包含两种训练模型,分别是CBOW和Skip_gram(输入层、发射层、输出层),如下图所示:
CBOW模型:
理解为上下文决定当前词出现的概率。在CBOW模型中,上下文所有的词对当前词出现概率的影响的权重是一样的,因此叫CBOW(continuous bag-of-words model)模型。如在袋子中取词,取出数量足够的词就可以了,至于取出的先后顺序是无关紧要的。
Skip-gram模型:
Skip-gram模型是一个简单实用的模型。为什么会提出该问题呢?
在NLP中,语料的选取是一个相当重要的问题。
首先,语料必须充分。一方面词典的词量要足够大,另一方面尽可能地包含反映词语之间关系的句子,如&鱼在水中游&这种句式在语料中尽可能地多,模型才能学习到该句中的语义和语法关系,这和人类学习自然语言是一个道理,重复次数多了,也就会模型了。
其次,语料必须准确。所选取的语料能够正确反映该语言的语义和语法关系。如中文的《人民日报》比较准确。但更多时候不是语料选取引发准确性问题,而是处理的方法。
由于窗口大小的限制,这会导致超出窗口的词语与当前词之间的关系不能正确地反映到模型中,如果单纯扩大窗口大小会增加训练的复杂度。Skip-gram模型的提出很好解决了这些问题。
Skip-gram表示&跳过某些符号&。例如句子&中国足球踢得真是太烂了&有4个3元词组,分别是&中国足球踢得&、&足球踢得真是&、&踢得真是太烂&、&真是太烂了&,句子的本意都是&中国足球太烂&,可是上面4个3元组并不能反映出这个信息。
此时,使用Skip-gram模型允许某些词被跳过,因此可组成&中国足球太烂&这个3元词组。如果允许跳过2个词,即2-Skip-gram,那么上句话组成的3元词组为:
由上表可知:一方面Skip-gram反映了句子的真实意思,在新组成的这18个3元词组中,有8个词组能够正确反映例句中的真实意思;另一方面,扩大了语料,3元词组由原来的4个扩展到了18个。
语料的扩展能够提高训练的准确度,获得的词向量更能反映真实的文本含义。
下载地址:
使用SVN Checkout源代码,如下图所示。
3.中文语料
PS:最后附有word2vec源码、三大百科语料、腾讯新闻语料和分词python代码。
中文语料可以参考我的文章,通过Python下载百度百科、互动百科、维基百科的内容。
下载结果如下图所示,共300个国家,百度百科、互动百科、维基百科各自100个,对应的编号都是0001.txt~0100.txt,每个txt中包含一个实体(国家)的信息。
然后再使用Jieba分词工具对齐进行中文分词和文档合并。
#encoding=utf-8
import sys
import codecs
import shutil
import jieba
import jieba.analyse
#导入自定义词典
jieba.load_userdict(&dict_all.txt&)
#Read file and cut
def read_file_cut():
#create path
pathBaidu = &BaiduSpiderCountry\\&
resName = &Result_Country.txt&
if os.path.exists(resName):
os.remove(resName)
result = codecs.open(resName, 'w', 'utf-8')
while num&=100:
#5A 200 其它100
name = &%04d& % num
fileName = pathBaidu + str(name) + &.txt&
source = open(fileName, 'r')
line = source.readline()
while line!=&&:
line = line.rstrip('\n')
#line = unicode(line, &utf-8&)
seglist = jieba.cut(line,cut_all=False)
output = ' '.join(list(seglist))
#print output
result.write(output + ' ')
#空格取代换行'\r\n'
line = source.readline()
print 'End file: ' + str(num)
result.write('\r\n')
source.close()
num = num + 1
print 'End Baidu'
result.close()
#Run function
if __name__ == '__main__':
read_file_cut()
上面只显示了对百度百科100个国家进行分词的代码,但核心代码一样。同时,如果需要对停用词过滤或标点符号过滤可以自定义实现。
分词详见:[python] 使用Jieba工具中文分词及文本聚类概念
分词合并后的结果为Result_Country.txt,相当于600行,每行对应一个分词后的国家。
4.运行源码
强烈推荐三篇大神介绍word2vec处理中文语料的文章,其中Felven好像是师兄。
Windows下使用Word2vec继续词向量训练 - 一只鸟的天空
利用word2vec对关键词进行聚类 - Felven
/中英文维基百科语料上的word2vec实验
因为word2vec需要linux环境,所有首先在windows下安装linux环境模拟器,推荐cygwin。然后把语料Result_Country.txt放入word2vec目录下,修改demo-word.sh文件,该文件默认情况下使用自带的text8数据进行训练,如果训练数据不存在,则会进行下载,因为需要使用自己的数据进行训练,故注释掉下载代码。
demo-word.sh文件修改如下:
#if [ ! -e text8 ]; then
wget http://mattmahoney.net/dc/text8.zip -O text8.gz
gzip -d text8.gz -f
time ./word2vec -train Result_Country.txt -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15
./distance vectors.bin
下图参数源自文章:
运行命令sh demo-word.sh,等待训练完成。模型训练完成之后,得到了vectors.bin这个词向量文件,可以直接运用。
5.结果展示
通过训练得到的词向量我们可以进行相应的自然语言处理工作,比如求相似词、关键词聚类等。其中word2vec中提供了distance求词的cosine相似度,并排序。也可以在训练时,设置-classes参数来指定聚类的簇个数,使用kmeans进行聚类。
cd C:/Users/dell/Desktop/word2vec
sh demo-word.sh
./distance vectors.bin
输入阿富汗:喀布尔(首都)、坎大哈(主要城市)、吉尔吉斯斯坦、伊拉克等。
输入国歌:
输入首都:
最后希望文章对你有所帮助,主要是使用的方法。同时更多应用需要你自己去研究学习。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 词向量计算句子相似度 的文章

 

随机推荐