大概一年前开始研究nlp(自然语言处理)时,就接触过word2vec这个强大的文本聚类开源项目(见《自然语言处理方面的一些待好好研读的文章笔记》),当时就意识到这东西对SEO来说肯定特别有帮助,只因我不够专注,没能继续深入研究下去。今天去逛@GoGo闯大神的博客时,突然发现他发了下面这篇文章,竟然把word2vec与实际项目结合得如此完美,忍不住第一时间转过来跟大家分享一下。这里不得不吐槽一下,这篇文章是我有史以来最难转的文章!排版太难搞了,以前都是直接用为知笔记或者印象笔记一键剪藏后发布,这回却行不通了,原因是会破坏掉源代码结构,只能我手动一段段复制粘贴了,简直逆天!!!

----------以下是GoGo闯原文,有重新排版,无文字删改,原文章版权归GoGo闯所有----------

手上有份职位词表,数万职位,现在想给每个职位找出相关职位来做推荐。

相关职位,指的是相同职类但不同职位,如:java工程师 – php开发、python工程师、C++开发…..,会计师 – 经济师、统计师、审计师…..,UI设计 – 平面设计、海报设计、广告设计师….

由于职位表是没有职类这层逻辑的,现有的数据也没办法给职位做关联的参考,人工把数万个职位做关联也不现实,所以需要有一个快速简单粗暴的办法。

之前了解过google的开源项目word2vec在聚类、找关联方面效果不错,常用做广告推荐,原理如下:

在A公司的多个页面中,电商公司B有他们的一个主页,专门介绍他们公司一些产品促销,抢购和发布会什么的。

公司A目前有很多用户的浏览数据,如用户u浏览了公司A的页面a1,a2,a3等。

把这些数据处理一下,整合成word2vec能处理的数据,如下

U1  a1,a2,a3……

U2  a2,a3,a5,……

U3  a1,a3,a6,……

其中u1,u2,u3表示不同的用户,后面的一串表示这些用户的浏览记录,如U1  a1,a2,a3表示用户u1先浏览了页面a1,再浏览a2,然后浏览了a3,……

这些数据还不符合word2vec的输入数据格式,把第一列去掉,变成下面的样子

a1,a2,a3……

a2,a3,a5,……

a1,a3,a6,……

这些数据就可以作为word2vec的输入数据了。

就把这些数据作为word2vec的训练数据,词向量维度为3,进行训练,完成后得到下面的输出

A1  (0.3,-0.5,0.1)

A2  (0.1,0.4,0.2)

A3  (-0.3,0.7,0.8)

……

An  (0.7,-0.1,0.3)

就得到了每个页面的向量。

这些向量有啥意义呢?其实单个向量的意义不大,只是用这些向量可以计算一个东西——距离,这个距离是页面之间的距离,如页面a1和a2可以用欧式距离或者cos距离计算公式来计算一个距离,这个距离是有意义的,表示的是两个网页在用户浏览的过程中的相似程度(也可以认为是这两个页面的距离越近,被同一个人浏览的概率越大)。注意这个距离的绝对值本身也是没有意义的,但是这个距离的相对大小是有意义的,意思就是说,假设页面a1跟a2、a3、a4的距离分别是0.3、0.4、0.5,这0.3、0.4、0.5没啥意义,但是相对来说,页面a2与a1的相似程度就要比a3和a4要大。

那么这里就有玄机了,如果页面a1是电商公司B的主页,页面a2、a3、a4与a1的距离在所有页面里面是最小的,其他都比这三个距离要大,那么就可以认为同一个用户u浏览a1的同时,浏览a2、a3、a4的概率也比较大,那么反过来,一个用户经常浏览a2、a3、a4,那么浏览a1的概率是不是也比较大呢?从实验看来可以这么认为的。同时还可以得到一个推论,就是用户可能会喜欢a1这个页面对应的广告主的广告。

这个在实验中实际上也出现过的。这里模拟一个例子吧,如a1是匹克体育用品公司在媒体公司A上的官网,a2是湖人队比赛数据页,a3是热火队的灌水讨论区,a4是小牛队的球员讨论区。这个结果看起来是相当激动人心的。

根据这样的一个结果,就可以在广告主下单的那个页面上增加一个条件——经常浏览的相似页面推荐,功能就是——在广告主过来选条件的时候,可以选择那些经常浏览跟自己主页相似的页面的用户。举个例子就是,当匹克体育用品公司来下单的时候,页面上给它推荐了几个经常浏览页面的粉丝:湖人队比赛数据页,热火队的灌水讨论区,小牛队的球员讨论区。意思是说,目标人群中包括了经常浏览这三个页面的人。

这个功能上线后是获得过很多广告主的好评的。

这样word2vec这个算法在这里就有了第一种用途。

referer:http://itindex.net/detail/50749-%E5%AD%A6%E4%B9%A0-word2vec-%E7%AC%94%E8%AE%B0

以上的逻辑简单说是这样的,如果用户平均访问深度为5个商品,A、B两个用户经常访问a、b、c这三个商品,则可以判定这两个用户喜好是一样的,所以可以给A用户推荐B经常浏览的另外两个商品,反之一样。

于是联想到可以把这几万个职位词在搜索结果页前50名的url对应的主域拿出来,如果两个职位50个主域重合度特别高,则可以认为这两个职位是相关的。然后就乎开始爬百度了,结果同样整理成word2vec需要的格式,然后分析:

WORD1    url1    url2    ….   url50 WORD2    url1    url2    ….   url50 ….. WORD50000 url1 url2 …. url50

无奈所有职位重合度都很高,因为经常出现的总是那么几个网站,分不出来。。。于是打算用文本语料来试下,word2vec分析的效果,取决于语料质量。质量主要是语料选取的范围、量级和粒度。

比如好搜query为“注册会计师”的搜索结果页右侧,通过word2vec是可以找出这种关系的,但我只需要职称、职业这两个div对应的内容,其他证书、考试啥的虽然与注册会计师有关,但不是我所要的。所以如果语料选的很宽泛,会跑出来很多不需要的关联词,同时如果语料范围定的合理但量级很小,那相关职位会找的不全。综上考虑,把几万个职位词丢到百度商情,循环跑上十几轮,用跑出来的词做分析,500w。。。

【GoGo闯】【折腾】通过word2vec结合SEO做关键词分类-Python 技术分享 Java技术分享 Python 爬虫技术_微信公众号:zeropython—昊天博客

安装google word2vec解析器

出现报错:找不到malloc.h

【GoGo闯】【折腾】通过word2vec结合SEO做关键词分类-Python 技术分享 Java技术分享 Python 爬虫技术_微信公众号:zeropython—昊天博客

将word2vec几个文件中的 “#include <malloc.h>”替换成“#include <stdlib.h>”之后,再重新执行make

【GoGo闯】【折腾】通过word2vec结合SEO做关键词分类-Python 技术分享 Java技术分享 Python 爬虫技术_微信公众号:zeropython—昊天博客

运行成功!

将从商情跑出来的词进行分词并删除停止词,每个词之间用空格隔开,保存为一个文件,这里的文件名为:shiyan,然后执行:./word2vec -train shiyan -output vectors.bin -cbow 0 -size 200 -window 10 -negative 0 -hs 1 -sample 1e-3 -threads 8 -binary 1

分词训练参数:

-train:输入文件 -output:输出的词向量(或聚类) -cbow 0:0表示使用skip-gram模型(慢,对罕见词有利),1表示使用continuous bag-of-words模型(速度快)。 -size 200:每个单词的向量维度是200 -window 10:窗口大小,skip-gram通常在10附近,cbow通常在5附近。 -negative 0:采样使用hierarchical softmax方法(负采样,对常见词有利),不使用negative sampling方法(对罕见词有利)。 -sample 1e-3:采样阈值,如果一个词语在训练样本中出现的频率越大,那么就越会被采样。 -binary 1:1表示模型存储为二进制,0表示模型存储为文本。

还有其他一些默认参数:

-alpha:学习速率,默认为0.025 -min-count:最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃。 -classes 5:输出单词聚类(聚类个数为5),此时将不再输出词向量。

加载和测试这个模型:

trunk ./distance vectors.bin

随便敲几个词,结果靠谱,但是结果貌似无法导出来。好在python有实现word2vec功能的库:gensim,在python自然语言处理常用的库,依赖于NumPy和SciPy,内嵌word2vec,于是安装gensim

执行:sudo pip install gensim

安装成功后,配置python下word2vec训练模型:

执行:python dp.py shiyan.txt shiyan.txt.model shiyan.txt.vector

通过gensim来加载和测试这个模型

执行:python xiangsi.py 软件开发

之后可以根据表中的职位词和跑出的相关词组成一行字符串,加上id,不同职位交叉计算相关词的重合度,如果>50%都算是相同职类的。

总的来讲word2vec对于SEO的使用成本挺高的,需要不断修改很多东西,如分词的词典、word2vec参数设置、大量语料的抓取等,但过了这个坎,还是可以结合SEO做很多东西。

参考资料:

http://www.cnblogs.com/hebin/p/3507609.html

http://radimrehurek.com/gensim/models/word2vec.html

http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C

文章来源:GoGo闯博客

HTTPX 基础教程-新乡seo|网站优化,网站建设_微信公众号:zeropython—昊天博客