金融投研领域,宏观指标是一个重要的参考数据,发布来源往往集中在各式各样的政府网站,包括行业协会。有些提供了api接口,比如国家统计局,有一些则是嵌在网页中;可能是文本比如:“本月,固定电话用户减少94.0万户,移动电话用户净增910.6万户”,或者是table的形式;这些数据以比较固定的格式,定期发布;对于分析师而言,处理这些数据有两个基本需求
1)想要的宏观指标,到底在哪个网站的哪个频道?
2)如果这个数据,定期发布,能否机器帮忙全部整理出来?
第一个是权威性判断、去重以及检索问题;使用百度检索这些指标,往往展现的是新闻网站的转载,而非政府网站的原始网页,且数据可能是非常陈旧的;考虑几个点: 1)网站权重的排序 2)新闻网站的转载,一定不像官方发布那样,定期都会转载 3)Simhash去重、聚簇
Simhash将文本映射到long int,不同于hash,两段文本内容近似,则他们的simhash(汉明距离)也接近;输入是一个字典,key是word,value是这个词的权重(可以用idf),所以和词序没有关系;直接上代码:
#finger_len代表要映射的指纹长度
masks = [1 << i for i in xrange(finger_len)]
for word, value in feature_dict.iteritems():
h = hash_func(word)
for i in xrange(finger_len):
v[i] += value if h&masks[i] else -value
ans = 0
for i in range(finger_len):
if v[i] >= 0:
ans |= masks[i]
如何去重呢? 给一个新的指纹,如何判断库里已经有相近的指纹呢?建立索引:指纹有小于等于k位代表接近,假设指纹长度设为64位,拆分成m个block,m一定要大于k;如果A和B最多有k位不同,那么最少有m-k个block是相同的;
63------53|52------42|41-----32|31------21|20------10|09------0|
| A | B | C | D | E | F |
If m = 6, k = 3, 排列组合一共有:
- A B C D E F
- A B D C E F
- A B E C D F
...
- C D F A B E
- C E F A B D
- D E F A B C
对库里的文本按照上面的前m-k建立索引即可~
对于宏观指标而言,每期发布的数据本身不同,但是句法模板是接近的;抽取网页中每句文本,将时间和数字用标签替代,然后生成指纹;如何聚簇?我们当前有所有的指纹,可以快速比较A和B的区别,通过索引,可以快速获取A的紧邻指纹,通过BFS遍历全部指纹,是一个简单靠谱的方式,这个过程中,需要注意避免传递的扩散;比如A和B接近,B和C接近,但是A和C可能没有那么接近,设计中需要考虑。
参考:
https://github.com/seomoz/simhash-py
https://github.com/leonsim/simhash
网友评论