查单词py脚本

2011年5月22日 10:45

改编自:http://www.oschina.net/code/snippet_70229_2366  加了终端颜色罢了

效果:

code:

#!/usr/bin/env python2
#coding=utf-8

import urllib,sys,re

#预编译正则式
re_def =re.compile(r'<def>(.*?)</def>', re.M|re.I|re.S|re.U)
re_sugg=re.compile(r'<sugg>(.*?)</sugg>', re.M|re.I|re.S|re.U)
re_orig=re.compile(r'<orig>(.*?)</orig>', re.M|re.I|re.S|re.U)
re_tran=re.compile(r'<trans>(.*?)</trans>', re.M|re.I|re.S|re.U)
#终端颜色
WARNING='\033[93m'
OKBLUE='\033[94m'
OKGREEN='\033[92m'
END = '\033[0m'
#是否输出例句
eg=True

def clear(s):
    return s.replace('&lt;em&gt;',OKGREEN).replace('&lt;/em&gt;',END)

def get(word):
    ans = urllib.urlopen('http://dict.cn/ws.php?utf8=true&q=' + urllib.quote(word)).read()
    try:
        print OKBLUE+re_def.search(ans).group(1)+END
    except:
        suggs=re_sugg.findall(ans)
        print WARNING+'suggest:'+END
        for w in suggs: print w
        return
    if eg:
        origs=re_orig.findall(ans)
        trans=re_tran.findall(ans)
        for i in range(len(origs)):
            print "%d. %s"%(i+1,clear(origs[i]))
            print "%s  %s"%(' '*((i+1)/10+1),clear(trans[i]))

if __name__ == '__main__':
    eg= raw_input('Show examples ? (y/n)')=='y'
    while True:
        try:
            word=raw_input('\nword:\n')
        except EOFError: break
        get(word)


 

评论(1) 阅读(2744)

恢复 gnome 中默认的启动项

2011年5月12日 16:13

在gnome-session-properties中研究着有哪些启动项,手滑,想点编辑结果点到了删除......囧了

通过google大致了解到现在gnome-session-properties主要和~/.config/autostart这个文件夹下的条目相关,进行了一番实验,找到一些规律:

 

1.新加入的条目会以XXX.desktop的文件形式出现在这里;gnome默认的启动项则不会出现

2.当对gnome默认的启动项进行暂时取消启动或删除的操作时,该文件夹下会出现对应的XXX.desktop

2.删除条目,若不是gnome默认的启动项的话,则XXX.desktop会消失;若是gnome默认的启动项,则出现XXX.desktop且最下面已被加入一行Hidden=true

2.暂时取消启动条目,对应的XXX.desktop下会有X-GNOME-Autostart-enabled=false这么一句,对于新加入条目来说原本为true

 

好了,说这么多,主要就是说如果一不小心删除了gnome默认的启动项的话,只要到这个文件夹下 把对应的XXX.desktop删除就好了

 

update:默认启动项原来在/etc/xdg/autostart......

评论(2) 阅读(3600)

python 中文分词和拼音首字母

2011年5月10日 12:17


updated at 2012.10.8:https://github.com/scturtle/zhseg

昨天的算法课老师以中文分词为例讲了DP,换了种简单的方式(求分词后频率和最大)实现了一下,效果不错,频率词典是从这里找的: http://download.csdn.net/source/347899  ,实测词典放到dict里后占了18MB内存

DP原理是令p[i]为s[i : n-1]的最优解,初始化为p[n]=0,转移公式为:

p[i]=max( freq(s[i : i+k-1] ) + p[i+k] )        1<=k<=n-i

代码如下:

update at 2011.5.12: 使用了defaultdict简化了代码

# coding: utf-8

import collections
d=collections.defaultdict(lambda:0)

def init(dictfile):
    f=open(dictfile,'r')
    while 1:
        line=f.readline()
        if not line: break
        word, freq = line.split('\t')
        d[word.decode('gbk')]=int(freq)
    f.close()

def fenci(s):
    l=len(s)
    p=[0 for i in range(l+1)]
    t=[1 for i in range(l)]
    for i in range(l-1,-1,-1):
        for k in range(1,l-i+1):
            if(d[s[i:i+k]]+p[i+k] > p[i]):
                p[i]=d[s[i:i+k]]+p[i+k] 
                t[i]=k
    print 'sum:',p[0]
    i=0
    while i<l:
        print s[i:i+t[i]].encode('utf8'), # 'gbk' for win
        i=i+t[i]


if __name__ == '__main__':
    init('dict.txt')
    s="科学研究需要大量的资金但社会资源有限需要政府调控所以需要政府的限制"
    s=s.decode('utf8')
    fenci(s)

显示结果为:

sum: 33505
科学 研究 需要 大量 的 资金 但 社会 资源 有限 需要 政府 调控 所以 需要 政府 的 限制

顺便贴一个以前写的求拼音首字母的小脚本:

# coding: utf-8

a=[ i.decode('utf8').encode('gbk') for i in 
     ['澳', '怖', '错', '堕', '贰', '咐', '过',
      '祸', '祸', '骏', '阔', '络', '穆', '诺',
      '沤', '瀑', '群', '弱', '所', '唾',
      '唾', '唾', '误', '褕', '孕', '座',] ]

def firstpy(s):
    s=s.encode('gbk')
    i=0
    while i<26 and a[i]<s:
        i+=1
    return '%c' % (97+i)

if __name__=='__main__':
    s='判断字符串首字母'.decode('utf8')
    for i in range(len(s)):
        print firstpy(s[i]),

 

评论(5) 阅读(9101)

opengl加载md2动画文件最简demo

2011年4月28日 21:29

opengl很有意思,也很TM难用

做实验用到md2动画,实验老师给的md2.cpp不给力,网上找了个,调了调巨好用,感谢原作者,特此分享给有需要的

自撰一Makefile, glutmain.cpp为原作者demo, main.cpp是我简化了的

顺便还加入了一些md2动画文件

文件在此: http://dl.dbank.com/c0h8fjskt6

有机会的话整理手头的代码,弄套opengl模板出来,方便实验和做小东西

update: 这是win下做的,linux下需要改改tga.h和bmp.h中某个struct的重定义,测试通过

评论(3) 阅读(3263)

nlogn的最长不下降子序列

2011年4月17日 00:58

做做dp,记下来,开始真是连dp都没想出来,由于数字只有1和2(poj 3671),写了个分治居然过了
搜了搜写O(n^2)的LIS果断超了,只好找资料,才知道只求长度的话有nlogn的LIS:
  使用d[j]来记录 长度为j的不减序列的最后一个元素 的值中的最小值,k为d数组的长度,初始可以为1,随着从前往后扫描输入数组a慢慢增长:
    1.若a[i]>=d[k],可以扩展了,d[++k]=a[i]

    2.若a[i]<d[1],则d[1]=a[i]

    3.否则,二分(易证明d为不减序列)找到d[1...k]中最大的j使d[j]<=a[i],因为d[j+1]>=d[j]>=a[i],所以更新d[j+1]=a[i]

最后k就是LIS的长度了

ref:这篇吴豪大牛的这篇

评论(1) 阅读(2974)