画外音:这几天苦于一直在苦逼的赶项目进度,一直没有什么时间来好好整理一下手头的工作。趁例会前的空隙和测试的时间,整一篇文章来。
新浪微博,2012年之后,是越来越火了。当然,其他诸如腾讯微博也是如此,在这里仅以新浪微博做例。针对微博的营销,成为时下一种热门。现在也已经有了不少试水的应用,比方说卖方控制的带有很直观名字的微博,有规律和导向性的发布一些商品的信息。这样的行为属于广撒网类型,很多用户会将这些微博视为垃圾微博,效果很难说好。如何更有说服力的将这些微博传达到用户那里,是领域的研究重点。现在,有一种方向被称作为精准营销,在这方面有着较好的前景。
那么什么是精准营销?引自百度百科上的解释:精准营销(Precision marketing)就是在精准定位的基础上,依托现代信息技术手段建立个性化的顾客沟通服务体系,实现企业可度量的低成本扩张之路。这个解释里面最吸引眼球的一个短语是“低成本扩张之路”,简而言之,就是省钱。对于那些刚起步或者资本不是很雄厚的企业,像那种铺天盖地做广告的做法显然是不可取的。不但开销甚大,而且也有可能造成弄巧成拙的后果:宣传带来的知名度和实际生产力不成正比,对公司形象的损坏。这个时候,通过关键微博用户对微博的转发或者原创,利用广大用户的从众跟风心理,更大限度的使用户关注到微博内容,获得微博所传达的产品信息,以期达到推销的作用。
好,说了一堆背景知识,下面回到正题。我们的目标是对微博的传播路径做出分析,得出路径中的关键节点。对于这些关键节点,可以想办法让他们来转发或者代发我们的有目的性的微博。
说到传播路径,最直观的还是图。利用gephi工具,可以画出如下所示直观的图形。
对上面的图,稍作解释:点代表微博用户,边代表转发关系。在这里是无向图,并不能看出谁转发谁。
在这里,我们介绍两种方法,来生成类似上图的分析图。第一种,是使用桌面应用gephi;第二种,是使用一个开源的js库——sigmajs。这两种方法都需要我们将分析的路径关系作为输入,所以接下来我们来具体的讲如何来得到输入。
首先,需要引入两种类型的文件:dot文件和gexf文件。dot文件可以说是office家族的成员,至少用office是可以打开的;gexf文件,变相来说应该算是xml文件的一个子变种。这里,我们给出2种文件的简单形式。
这里需要说明的是,使用桌面应用gephi,dot文件和gexf文件都可以;使用sigmajs的时候,介于知识的局限性,只考虑gexf文件。
接着,我们来考虑如何生成这些文件。仔细观察两个文件,可以发现,两者的核心都是edges。那么,从新浪微博的微博获取转发的关系便是我们需要关注的重点。在这里,我们需要对新浪微博的API进行调用。具体的怎么调用,就不详细叙述了,感兴趣的可以去这里进行了解。对API文档进行简单的浏览之后,就会很快的发现,我们这里主要调用的是statuses/repost_timeline接口(对于普通权限的用户是这样,对于高级权限用户的接口为statuses/timeline_batch)。其实就是简单的分析请求结果,这里返回的是json格式的数据。根据API文档里面的参数,整体后就可以得到转发关系。要想获得一条微博的全部转发信息,需要一个迭代的过程。这里,不给出具体的代码实现了。
获得了代表转发关系的边之后,就可以进行dot文件和gexf文件生成了。下面分别给出展示如何生成文件的代码,这里是用python实现的。
1 2 3 4 5 6 7 8 | def generate_dot(self, file_name, edges): OUT = file_name+'.dot' dot = ['"%s" -> "%s" [weibo_id=%s]' % ( edges[weibo_id]['reposted'].encode('gbk','ignore'),\ edges[weibo_id]['poster'].encode('gbk','ignore'), weibo_id) \ for weibo_id in edges.keys()] with open(OUT,'w') as f: f.write('strict digraph {\nnode [fontname="FangSong"]\n%s\n}' % (';\n'.join(dot),)) print 'dot file export' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | def generate_gexf(self, file_name, __edges): OUT = file_name+'.gexf' nodes = [] edges = [] #i = 0 for weibo_id in __edges.keys(): if nodes.count(__edges[weibo_id]['reposted'].encode('gbk','ignore')) == 0: nodes.append(__edges[weibo_id]['reposted'].encode('gbk','ignore')) if nodes.count(__edges[weibo_id]['poster'].encode('gbk','ignore')) == 0: nodes.append(__edges[weibo_id]['poster'].encode('gbk','ignore')) edge = [] edge.append(__edges[weibo_id]['reposted'].encode('gbk','ignore')) edge.append(__edges[weibo_id]['poster'].encode('gbk','ignore')) edges.append(edge) #edges.append('\n' % (i, \ # nodes.index(__edges[weibo_id]['reposted'].encode('gbk','ignore')), \ # nodes.index(__edges[weibo_id]['poster'].encode('gbk','ignore')))) #i = i + 1 with open(OUT,'w') as f: f.write('<!--?xml version="1.0" encoding="gbk"?-->\n') f.write('\n') f.write('\n') #nodes f.write('\n' % len(nodes)) for node in nodes: f.write('\n' % (nodes.index(node), node)) f.write('\n') #edges f.write('\n' % len(edges)) i = 0 for edge in edges: f.write('\n' % \ (i, nodes.index(edge[0]), nodes.index(edge[1]))) i = i + 1 f.write('\n') f.write('\n') f.write('\n') print 'gexf file export' |
看上面的代码,思路是很直接的:就是向一个文件中,写入特定格式的内容。在生成gexf文件的时候,可以给节点加上颜色和位置信息,具体的示例如下图:
现在到了传播路径图制作的最后一步,将文件中所包含的传播路径信息通过图像展示出来。使用gephi桌面应用的话,下面就是傻瓜式操作了:读取文件(dot文件和gexf文件都可以),勾选几个指标,然后图像就自动生成了。接下来,我们着重要介绍的是如何使用sigmajs来自动生成传播路径图。
sigmajs是一个第三方的开源js库,在作图方面有着很好的效果,基于html的canvas元素。在解析gexf文件的时候,还需要用到一个子js库——sigma.parseGexf.js。在页面中引入这两个js库之后,加上简单的一段javascraft代码,就可以在页面相应的canvas元素部分生成相应的传播路径图。具体怎么做,可以参考sigmajs官网上的案例。
经过上面的一番过程,就可以生成在文章开头出现的图像。当然,这样的图像还不是很直观。对于转发比较少的情况,我们需要的是一种更为清晰的图像。这里给出gephi桌面应用生成的一张结构清晰的图像(选择流程的时候选择“Yifan Hu”)。如果想使用sigmajs画出类似的图像,可能需要指定节点位置,这个问题还在研究中OrzZ。
你好,请问一下微博传播路径的坐标怎么生成啊
就是手动去算比较麻烦。有个插件是动态算的 sigma.forceatlas2.js plugin