思路来自caoz的分享:http://www.seoqx.com/post/81
简述即,“星巴克团购”很明显能看出是团购相关的,因为包含“团购”。由此也可以反推“星巴克”也很可能和团购有一定关联性。
通过这样的方法,能挖掘出不少潜在相关的词。根据我这边的数据,挖出的词量和直接相关的词量处于同一量级。
但这个思路,代码实现起来并不是太容易,逐个遍历词的方法效率过于低。因此我写了下通过倒排索引来匹配的代码。
进行了几回优化,将运行效率从初版大幅提升。我这边实测300W+关键词,半小时内处理完毕。此代码应该能支持千万级的分析挖掘。
运行方式为:python [脚本名称] [输入文件] [输出文件] [特征词项]
输入文件,需两列数据,第二列为搜索量
输出文件,有四列数据,关键词、搜索量、是否直接相关、是否间接相关
特征词项,在前面的举例中,即应设置为“团购”
注:运行前需先行安装jieba模块,用于分词
- # coding:utf-8
- import jieba
- import sys
- # 输入文件 输出文件 特征词项
- input_file, output_file, feature = sys.argv[1:4]
- # 建立倒排索引
- posting_list = {}
- for kw_id, line in enumerate(open(input_file)):
- if kw_id % 10000==0:
- print kw_id
- kw, searches = line.rstrip().split('\t', 1)
-
- segs = jieba.cut(kw)
- for seg in segs:
- try:
- posting_list[seg].append(kw_id)
- except:
- posting_list[seg] = [kw_id]
- for seg, doc_list in posting_list.iteritems():
- posting_list[seg] = set(doc_list)
- feature_set = posting_list[feature.decode('utf-8')]
- f = open(output_file, 'w')
- for kw_id, line in enumerate(open(input_file)):
- if kw_id % 10000==0:
- print kw_id
- kw, searches = line.rstrip().split('\t', 1)
- relate, indirect_relate = '0', '0'
- # 直接相关词
- if feature in kw:
- relate = '1'
- else:
- sets = [ posting_list[seg] for seg in jieba.cut(kw) ]
- extend_kw_ids = set.intersection(*sets)
- if len(feature_set & extend_kw_ids) >= 1:
- indirect_relate = '1'
- print >>f, '\t'.join([kw, searches, relate, indirect_relate])
- f.close()
复制代码 |