【ZERO】无特征关键词分类

简述即,“星巴克团购”很明显能看出是团购相关的,因为包含“团购”。由此也可以反推“星巴克”也很可能和团购有一定关联性。

通过这样的方法,能挖掘出不少潜在相关的词。根据我这边的数据,挖出的词量和直接相关的词量处于同一量级。

但这个思路,代码实现起来并不是太容易,逐个遍历词的方法效率过于低。因此我写了下通过倒排索引来匹配的代码。

进行了几回优化,将运行效率从初版大幅提升。我这边实测300W+关键词,半小时内处理完毕。此代码应该能支持千万级的分析挖掘。

运行方式为:python [脚本名称] [输入文件] [输出文件] [特征词项]

输入文件,需两列数据,第二列为搜索量

输出文件,有四列数据,关键词、搜索量、是否直接相关、是否间接相关

特征词项,在前面的举例中,即应设置为“团购”

注:运行前需先行安装jieba模块,用于分词

 1 #encoding=utf-8
 2  
 3 import jieba
 4 import sys
 5  
 6 # 输入文件 输出文件 特征词项
 7 input_file, output_file, feature = sys.argv[1:4]
 8 # feature='大全'
 9 # 建立倒排索引
10 posting_list = {}
11 for kw_id, line in enumerate(open(input_file)):
12     if kw_id % 10000==0:
13         print kw_id
14     kw, searches = line.rstrip().split('\t', 1)
15     # print kw,searches
16          
17     segs = jieba.cut(kw)
18     for seg in segs:
19         try:   
20             posting_list[seg].append(kw_id)
21         except:
22             posting_list[seg] = [kw_id]
23 # print posting_list
24 for seg, doc_list in posting_list.iteritems():
25     # print seg,doc_list
26     posting_list[seg] = set(doc_list)
27     # print posting_list
28  
29 feature_set = posting_list[feature.decode('utf-8')]
30 # print feature_set
31  
32  
33 f = open(output_file, 'w')
34 for kw_id, line in enumerate(open(input_file)):
35     if kw_id % 10000==0:
36         print kw_id
37  
38     kw, searches = line.rstrip().split('\t', 1)
39  
40     relate, indirect_relate = '0', '0'
41  
42     # 直接相关词
43     if feature in kw:
44         relate = '1'
45     else:
46         sets = [ posting_list[seg] for seg in jieba.cut(kw) ]
47         extend_kw_ids = set.intersection(*sets)
48         if len(feature_set & extend_kw_ids) >= 1:
49             indirect_relate = '1'
50  
51     print >>f, '\t'.join([kw, searches, relate, indirect_relate])
52 f.close()

脚本直接从seo前线创始人zero那里趴过来,不同只是在缩进上对比原代码有所改动,因为原码貌似不能直接使用,其它无,提示不要在windows下运行,编码会出问题;本人运行效果如下:
无特征词分类效果

posted @ 2017-04-13 16:12  l4617  阅读(191)  评论(0)    收藏  举报