【ZERO】无特征关键词分类

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

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

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

进行了几回优化,将运行效率从初版大幅提升。我这边实测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下运行,编码会出问题;本人运行效果如下:
无特征词分类效果

Leave a Comment