每个网站做SEO都需要一个关键词词库,这个词库如何才能得到?如何对网站关键词进行整理?

我整理词库用的是结巴分词(https://github.com/fxsjy/jieba/blob/master/README.md),具体分为4个步骤:

1、根据字典对词库进行分词

结巴分词自带词典,但是每个行业都有自己行业比较独特的词,所以我们就需要自定义词典。虽然结巴分词可以识别新词,但是添加自己行业独特的词进去可以增加分词的准确性。

关于如何自定义字典可以看下这边:https://github.com/fxsjy/jieba/issues/14

P(喵星人) =max{ P(喵)*P(星)*P(人), P(喵星)*P(人), P(喵)*P(星人), P(喵星人) }

举例说个词:5月25日雅思听力答案

我们理想的分词是要分成  5月|25日|雅思|听力|答案,但是因为字典里没有5月和25日这个词,所以就会被分成  5|月|25|日|雅思|听力|答案

一般而言,如果没有歧义的话,我们只要在字典里添加2个字段,字典里还有最后一位是设置词性的,但是因为现在利用的是tf-idf提取词语中识别力高的词,所以这边词性的话我没有加。

5月 3

25日 3

第二个字段是词频,一般设置2.3.4就行。

插播一下:因为结巴分词的字典是他自己用的语料库计算出来的词频,相对而言我觉得可以自己制作自己的词库的话,分词的准确性会更高,也不用这么麻烦给字典添加没有的词。可以参考下最大熵模型,用自己行业的文章计算出每个词出现的概率,具体可以参考下夜息哥哥的这篇文章(http://www.imyexi.com/?p=682),不过自己还没有搞出来。。。

2、根据结巴分词自带的的TOPK,计算出重要的词语

默认值是20,也就是计算出来的tf-idf值,把大于20的词排列出来,这样一些无意义的词就可以排除掉

3、添加无意义的词,进行排除

这边排除的话,主要是有一个注意点:排除的词需要根据分词后的单词完全匹配排除

举个例子:成都旅游怎么玩 

分词后就变成了: 成都|旅游|怎么|玩

“都”这个词,如果单独出现的话是没有啥意义的,所以需要排除掉。如果排除的时候不对分词后的单词进行完全匹配的话,就会错误的分词。

下面是我处理后的数据,一共分为四列,最后一列是最终结果

 

4、用shell对处理后的词库进行合并处理

接下来我们就要合并同类项,把分词是一样的原词整理到一起,用于后期审核是否正确的分词。

把原词和结果保存到txt文本里面,第一列放分词后的词,第二列放原词。

接下来强大的shell命令来了,合并同类项这个脚本是在夜息哥哥博客上偷来的,在一开始加了一段是用于在原词后面加”,”的

$ awk ‘{print $1″\t”$2″,”}’ fenci.txt | awk ‘{a[$1]= a[$1]“”$2} END {for (b in a) print b”\t”a[b]}’ > result.txt

效果就是这样,分词一样的原词放到一起,用逗号隔开

到这边词库就差不多整理完了,水平也就到此。具体怎么用,我的想法是把分词后的单词一一进行对比,然后取单词的交集数量,按照降序排列,计算出交集数量最多的原词。

还有一种方法还没试过,只是基于想法。计算出每个分词出来的单词的tf-idf值,如果2个原词有匹配的单词,就可以得到单词的tf-idf值,这样把交集的单词匹配到的tf-idf值加起来,就是2个词语之间的相似tf-idf值(自己胡乱叫的)

至于怎么没用编辑距离,我是这么考虑的,想法也只是个人想法。编辑距离中没有考虑单词的重要性,比如一些停词例如:怎么,如果在一个单词中出现很多次,比如”谁能和我说说SEO应该怎么学习”和”SEO学习”这两个词,如果计算编辑距离的话,肯定是一个比1大的数字,其实这两个词的意思是差不多的。所以我觉得计算编辑距离还是有点不妥。

当然肯定还有更好的方法,这只是我自己目前的想法。

最后再分享一个整理词库的shell脚本,因为挖词的时候会出现一个词出现多次,但是指数不一样的情况,我们要把指数最高的保留

awk ‘{print $1″\t”$2″,”}’ 词库.txt | awk ‘{a[$1]= a[$1]“”$2} END  {for (b in a) print b”\t”a[b]}’ | awk -F “,” ‘{print $1}’ |sort -nr -k2 > 词库.txt

作者:臭脚 丫丫 http://www.itseo.net/direction/show-146.html

留言