简述即,“星巴克团购”很明显能看出是团购相关的,因为包含“团购”。由此也可以反推“星巴克”也很可能和团购有一定关联性。
通过这样的方法,能挖掘出不少潜在相关的词。根据我这边的数据,挖出的词量和直接相关的词量处于同一量级。
但这个思路,代码实现起来并不是太容易,逐个遍历词的方法效率过于低。因此我写了下通过倒排索引来匹配的代码。
进行了几回优化,将运行效率从初版大幅提升。我这边实测300W+关键词,半小时内处理完毕。此代码应该能支持千万级的分析挖掘。
运行方式为:python [脚本名称] [输入文件] [输出文件] [特征词项]
输入文件,需两列数据,第二列为搜索量
输出文件,有四列数据,关键词、搜索量、是否直接相关、是否间接相关
特征词项,在前面的举例中,即应设置为“团购”
注:运行前需先行安装jieba模块,用于分词
#encoding=utf-8 import jieba import sys # 输入文件 输出文件 特征词项 input_file, output_file, feature = sys.argv[1:4] # feature='大全' # 建立倒排索引 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) # print kw,searches segs = jieba.cut(kw) for seg in segs: try: posting_list[seg].append(kw_id) except: posting_list[seg] = [kw_id] # print posting_list for seg, doc_list in posting_list.iteritems(): # print seg,doc_list posting_list[seg] = set(doc_list) # print posting_list feature_set = posting_list[feature.decode('utf-8')] # print feature_set 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()
脚本直接从seo前线创始人zero那里趴过来,不同只是在缩进上对比原代码有所改动,因为原码貌似不能直接使用,其它无,提示不要在windows下运行,编码会出问题;本人运行效果如下: