2012年3月8日星期四

长图切割 PIL实践

image

趁着之前新浪微博还没有关闭basic auth的时候,在一个图片分享微博上下了很多图。图美则美矣,可惜播放幻灯片时候这种长条图就看上去不大清爽了。

所以打算写个程序把这些图用编程手段自动分离了。

虽然上过图像处理课,但真学得一桶浆糊,脑袋里好像有边界算法这个概念,到底是怎么样的根本就没影了。只能用点笨办法了。

因为水平方向没有多图,现只考虑垂直方向的切割。思路是找出4张图的边界,即垂直方向的5个点,用红笔标出。

垂直分界点的显著特征

  • 其所在水平方向的像素值都是相同的;
  • 垂直分界点所在行与内容图的像素行不同。

从图左上开始查找分界点,根据上述两规则,找到所有分界点。

先安装Python PIL (Python包安装也太ugly了)。

上代码:

import Image

#only check the color in horizontal direction
def isInSameColor(image,y,im_width):
    original_point=image.getpixel((0,y))
    for x in range(1,im_width):
        if(original_point!=image.getpixel((x,y))):
            return False
    return True
       
def IsDiffBetween2Line(image,y1,y2,im_width):
    for x in range(im_width):
        if(image.getpixel((x,y1))!=image.getpixel((x,y2))):
            return True
    return False

def SplitImage(image,im_points,im_width,imFileName):
    filename=imFileName.split('.')[0]
    print filename
    for i in range(len(im_points)-1):       
        region=image.crop([0,im_points[i],im_width,im_points[i+1]])       
        print region.size       
        region.save(filename+'[%d].jpg'%i,'JPEG')
       

if __name__ == '__main__':
    #replace the imFileName with your own photo
    imFileName='7f9e9b4dgw1dk3y3wryrlj.jpg'
    im=Image.open(imFileName)
   
    im_width=im.size[0]
    im_height=im.size[1]
   
    #where to save boundary point in ...
    im_points=[]
   
#    print im_width,im_height
    y0=0
    for y in range(1,im_height):
        if y==im_height-1:break
        if isInSameColor(im,y0,im_width) is True:
            #compare with next line
            if IsDiffBetween2Line(im,y0,y,im_width) is True:
                im_points.append(y0)
        y0=y
   
    #append the last point
    im_points.append(im_height-1)      
    print im_points
   
    SplitImage(im, im_points, im_width, imFileName)
    print "The end!"

 

结果:

image

2012年3月7日星期三

批量下载豆瓣FM加心歌曲

 

需要的软件:

  • Excel
  • Python
  • 迅雷

 

主要流程:

1. 获得豆瓣FM加心歌曲列表:登录douban.fm,安装Chrome 插件豆瓣电台爬虫,在douban.fm页面点击插件按钮。过片刻,会有页面显示全部歌曲列表,黏贴入Excel。

Note: 使用chrome插件得到歌曲列表的好处就是不需要在client端输入用户信息,也避免了频繁basic auth,会跳出验证码的问题。

2. 使用Excel修饰歌曲列表:比如删除重复歌曲(remove duplicates),删除不需要的信息,就保留歌名,歌手,另存为dbFM.csv。

Note: 在Windows OS上,文件莫名就会被加入BOM,使用工具(e.g. Notepad++)把这个标志删了,不然运行以下程序会出错。

3. 写Python脚本生成歌曲资源信息列表:主要从ting.baidu.com上得到资源URI。程序输入为dbFM.csv;输出有两个文件,ResourceURI.txt(以.mp3结尾的URL,一行一曲),MissingList.txt(ting上不一定找得到,需要手工查找)。

Note: 最开始爬的是mp3.baidu.com,编码GBK的,崩溃。mp3和ting,功能很重叠啊,百度就不能在mp3基础上升级吗。 写这么段小程序,我深刻得感受到走上了不归路,码农!为了个白痴问题都得花很长时间去解决!!!程序写得健壮,还要考虑exception处理,网络问题,断点续读,这些通通没考虑。我离专业码农还是有差距的。

4. 使用迅雷批量下载资源:复制ResourceURI.txt内容,打开迅雷,新建,至此,终于可以批量下载了。

Note: 最好批量下载一次下完。发现要是把下载任务放在下次迅雷开启的时候,歌名会变成File(n).mp3的形式,不会自动重命名了。原因未明,但是300多首歌每首都手动重命名,这可够浪费时间的了。切忌。

5. 整个过程还是蛮繁琐的,把这些功能都集成起来也没兴趣做了。批量下载加心歌曲,估计以后不会再用了。等批量下载完,发现很多歌都不要听了,口味随时在变。倒是谁搞个批量取消加心歌曲啊。

2012年2月3日星期五

新年工作第一周

节后过来第一个礼拜,打算严肃自己,不打酱油,好好看DB中的表和存储过程的。
周一确实没有打酱油,看了这个release下别人的代码P和T。
T和现在维护的代码风格类似,很容易就能找到核心所在了。
P代码的风格太诡异,又是用MVC写的页面,实在不想看了,直接看文档了事。

周二Domain Meeting上有了新需求,从此开始,和mentor一起将近写了一个礼拜文档。傍晚发完邮件,终于松了口气。
一鼓作气把文档写完,的确对自己帮助很大。对要维护项目的业务需求印象又加深了许多。
但是要想完全掌握熟悉还需要很长的路,慢慢看DBCode,不能再觉得没事做了。
中间查询些数据,不知道查哪张表,还被mentor鄙视了。

去年7月中旬正式进入公司,也有半年多了,尽管做了几个小项目,但收获不大,一直感觉没事做。对工作确实不怎么上心,自己也没有明确的目标,酱油一瓶。
对要维护的项目本来就应该花时间看的,拖延症害死我了。

在时间管理上,把时间花在重要但不紧急的事情上是最好的,现在我才深深得体会到。
只要保持这样做,重要的事情永远不会紧急因为当它还不紧急时已经被做完了。

早上doc review匆匆准备了下,说得蛮差的,虽然说得很快,也这样过去了。
六月有出差的机会,和美国人面对面的机会,我准备好了吗,我的英语要好好加油啊。

这个礼拜也买了kindle4,快读完一本书了。
发现在阳光下看书,字依然很清晰,乘地铁闲时间过得太快了。
一直纠结该怎么样看书,花时间看一本对自己帮助不大的书会不会浪费了。
现在想,与其纠结,不如先把书整本过一遍,真的好书是值得多看几遍的。

这个礼拜很充实,虽然累,至少不彷徨。
看着别人目标明确,津津有味,向着未来努力着,心里真是羡慕。
既然找不到什么人生理想,不如把眼前的事情做好。不要再纠结了。
新年新气象。

2011年4月25日星期一

第四周 4/18~4/25

这周,事情比较多,在课题上花的时间少了。
针对推荐算法,做了点调研。

在这过程中,接触到了“无觅网”,一个社会化新闻分享与推荐的网
按他的说法是,“利用人工智能的技术,根据你喜欢的网页,在众多的网页中找出你感兴趣的内容
但真正用下来,不是很理想。
关键字提取或是主题提取技术做的比较粗糙。有的关键字,根本就无关于文章。
推荐的文章也很没新意,在文章来源上也没做好工作。

与课题的相同点
这个思路跟之前预想的课题功能基本一样,同样是提取主题词、关键字,基于这个基础做个简单的个性化推荐算法。

不同点
对比无觅网,信息来源很不同。
无觅网是从internet上找文章;课题中,从信息来源来说,是比较单一的。
来源只有用户关注博友的信息,除非添加诸如推荐用户一些活跃博友的功能。

从这个角度来看,本课题只是运用推荐算法来达到过滤的作用。
还有一点,微博信息只有140个字,提取关键字方面还是有很大帮助的。

为什么是基于微博,而不是基于人人。
这要从微博是什么谈起。
微博只是个提供信息的平台。
80/20法则貌似蛮时髦的,听说能让文章增色不少,套用在这里也合适。
In short,就我观察下来的情况。
一直是名人、某某组织织微博,大量用户做的事情,只有看、转发、吐槽下,而这不算有效信息。
再说,信息不对等。名人的微博只有十几二十的关注,被关注则至少是上万的。
所以说微博只是个提供信息的平台。
使用过滤系统还是有可行性的。

2011年4月21日星期四

谈谈无觅网

逛网站,找有价值的文章,很开心的事情。
昨日在找课题资料的时候,看到了一个叫“无觅网”的文章推荐网站,感觉蛮有趣的,将自己的心得分享下。


界面上蛮简约,很容易亲近。
想法上,非常合我口味。


但实际使用上,总归会有些不满意。
当时也对他们提了点意见:
网站上的推荐文章都提不起我的兴趣,一直都是互联网的东西,很虚无。
现阶段我喜欢文化文学方面的文章,或是数学、数据分析这类的文章。
算是遇到“冷启动”问题吧。
是不是应该现在把关注的人都删了,可又找不到相似的用户,或者我还不知道怎么找。
注册网站的时候,也没有问我喜欢什么,就是一堆用户让我选择。


今天上班无聊,一直用这个网刷文章看,有点失望。
只是简单得通过提取文章关键字,以关键字来代表一篇文章。
通过比对候选文章的关键字,以期得到推荐文章。
虽然不知道原理,但就我用下来的感觉是这样的。





前面看了篇关于人人的文章,之后就给我推荐这了。。。。这样我算是喜欢还是不喜欢看人人的新闻呢???


















此外,除了基于文章本身来推荐之外,还有好友推荐。
找到个口味类似的好友,很重要。
但是大多数使用这个网站的用户好像都是IT从业者,行业类型太单调,这是个很严重的问题。
不然按照好友推荐模式,推荐给用户的永远只是IT新闻。
弥补的措施算是名人堂吧,不过补足有限。



总而言之,用户太少,引发信息单调;关键字提取或是主题提取还是不容易搞啊。
用户量大了,才能体现数据之美吧。

2011年4月18日星期一

课题第三周 4.11~4.17

  困境
课题陷入困难,发现之前基于语料库的设计有严重的弊端:
即使有一个非常全面的语料库,但也没有计算资源来得到比如某个单词出现的数量这种看似简单的问题。
更何况自己收集的语料库,一定存在数据存储和数据缺失片面的问题。
以上感想是基于一本叫《beautiful data》中第十四章中关于语料库的描述所发。
需要另辟蹊径了。


进展
接触了下新浪微博API,将课题与新浪微博契合的问题算是解决了。
初步用ASP.NET写了些网页,主要是提取用户信息和提取微博信息。
提取微博信息是关键,在此基础再加上对文本进行关键字提取的方法。
之前的关键字提取设想遇到困难,根据微博信息的形式,我做出如下决定:
1.         有些以组织形式发布的微博信息是“【主题】内容”这种形式的,这样只需提取“【】”内的内容。
2.         更多的是个人用户,没有如上形式,只能对全局内容进行提取。
3.         提取的方式:中文分词库选出文本中的名词,动词,形容词等比较有代表性的词(“的”这样的词算是停用词,不予考虑),计算在文本中的词频;还有对于名词、形容词,应该给予两种不同的权重,名词更重;得到比重大的几个关键字。

展望
上述工作还算是可行,但是课题做得非常空洞。
一直上网,豆瓣的推荐算法和各种电子商务网站的商品推荐给人很好的印象,这种推荐从另一种程度上也算是一种过滤系统,只给你想要的资源。
是不是也应该给用户对微博信息“喜欢”和“不喜欢”的操作,之前在学校的时候也学过《模式识别》课,知道点比如“贝叶斯分类器”对信息进行分类的算法。
微博信息的表现形式就是几个关键字。
关键字就是特征,有多少关键字,就是多少维的特征向量。
比较棘手的,是随着不断获取微博信息,关键字是不断增加的。
这些只是初步设想,可行性上还没考虑过,最近也会看这方面的书。



2011年4月10日星期日

课题第二周记录 4.4~4.10

关于自然语言处理的知识实在太多,看着看着偏离了原来的课题需要了。

根据已有的知识,我对课题做了三方面的分析:
  • 构建语料库
  • 过滤系统
  • 情感强度分析

关于构建微博语料库,这是为过滤系统服务的。语料库,简单来说就是把文本资料收集在一起。
借鉴北大语料库,其实是个全文检索系统,我想依据已有的积累:中科院ICTCLAS分词库和LUCENE搜索引擎库能完成。欠缺的是语料的来源,这点上Python应该能帮上忙吧???

如果有可能的话,可以靠过滤系统来得到语料库,而语料库通过本身的不断扩大,提供更精准的过滤系统算法参数,我想这算是个自学习的过程。

至于在已有的语料库中进行分类要靠数据挖掘和模式识别的知识了,这是后话。

过滤系统的关键在于提取主题、关键字。在这方面只知道根据词频来提取关键字的方法,这种方面的硬伤就是需要一个现有的语料库来提供先验知识,比如某单词在全局的统计概率。根据这个来做个雏形,先找个好点语料库!
进一步需要看些文献??

至于情感强度分析,这个看情况再做了,最简单的就是积极、消极、中性三值判断了。

跟老师与研究生学长的讨论,先把过滤系统做出个雏形来。在讨论过程中,说道了词汇知识库 什么的,要去研究下。
至于与新浪微博相契合,应该看看@Python发烧友的FaWave的原理,先放下这部分。
另外网购了本书《统计自然语言处理》,对我的扫盲工作做得很好。