(五)实现更多功能
来源:互联网 发布:如何加强网络安全管理 编辑:程序博客网 时间:2024/04/30 07:06
中期检查顺利通过,因为要赶在新版本的系统集成前完成,所以这两天加紧进度,为词典scope 添加了例句和自动纠错的功能,分别用两个类实现。
例句功能:
一开始的想法是通过合适的接口返回例句,但是不幸的是,现有的翻译接口都不返回例句,返回例句的接口早就已经停止了服务,这个方法行不通,那就只有爬去网页然后解析html的内容,python3中的原生类是HTMLparser,继承这个类然后重写其中的方法。通过看有道词典的html源码,发现里面的例句都在<div class=examples>标签里,而且又在<p>标签中,所以我们就处理这两个标签的内容
class get_examples(HTMLParser): def __init__(self): self.data=[] self.showlist = [] self.flag=0 self.getdata=0 HTMLParser.__init__(self) def handle_starttag(self,tag,attrs): if tag =='div': for name,value in attrs: if name == 'class' and value == 'examples': self.flag=1 if tag == 'p': if self.flag == 1: self.getdata = 1 return def handle_data(self,data): if self.getdata: self.data.append(data) def handle_endtag(self,tag): if tag=='p': self.getdata = 0 if tag =='div': self.flag=0 def getresult(self): data_len = len(self.data) if data_len <= 4: for i in self.data: self.showlist.append(i) else: for i in range(0,4): if self.data[i]: self.showlist.append(self.data[i]) return self.showlist其中 handle_starttag和handle_endtag 分别表示遇到开始和结束标签的时候进行什么动作,handle_data表示遇到数据时进行什么处理,所以整个的逻辑就是当遇到class为examples的div标签时,将flag标志置1,表示进入了这个标签,当遇到p标签且flag标志位为1时,置getdata标志位为1,表示可以对class为examples的div标签中的p标签中的内容进行处理。处理过程很简单,因为可能有很多例句,我们只选前两个。然后在search中实例一个类然后调用
strUrl = 'http://dict.youdao.com/search?q=%s&keyfrom=dict.index' % query req = urllib.request.urlopen(strUrl)#通过网络获取网页 the_page = req.read() geter = get_examples() geter.feed(the_page.decode('utf-8')) examples_list = geter.getresult()
自动纠错的话我选择了使用别的现成的算法,即最小距离法,就是根据原单词经过对字母的增删改几次变化变成目的单词,进行概率的估计,不过算法这个我不擅长,就靠拿来主义了:
class correct_word(): def __init__(self): self.alphabet = 'abcdefghijklmnopqrstuvwxyz' def words(self,text): return re.findall('[a-z]+', text.lower()) def train(self,features): model = collections.defaultdict(lambda: 1) for f in features: model[f] += 1 return model def NWORDS(self): return self.train(self.words(open('/usr/share/unity-scopes/isgd/big.txt').read())) #NWORDS = self.train(words(open('big.txt').read())) def edits1(self,word): n = len(word) return set([word[0:i]+word[i+1:] for i in range(n)] + # deletion [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] + # transposition [word[0:i]+c+word[i+1:] for i in range(n) for c in self.alphabet] + # alteration [word[0:i]+c+word[i:] for i in range(n+1) for c in self.alphabet]) # insertion def known_edits2(self,word): nwords = self.NWORDS() return set(e2 for e1 in self.edits1(word) for e2 in self.edits1(e1) if e2 in nwords) def known(self,words): nwords = self.NWORDS() return set(w for w in words if w in nwords) def correct(self,word): candidates = self.known([word]) or self.known(self.edits1(word)) or self.known_edits2(word) or [word] nwords = self.NWORDS() return max(candidates, key=lambda w: nwords[w])
然后在search中调用,整体的逻辑是首先进行一次查询,如果返回的结果和查询的单词是一样的,说明单词有错误,就进行纠错,然后再一次查询,如果是中文的翻译,那么就正常进行处理,得到结果如下:
0 0
- (五)实现更多功能
- jsp更多功能实现
- 加载更多功能实现
- 加载更多功能实现
- UITableView实现加载更多功能
- 加载更多功能的实现
- jquery实现更多内容的(展开/收起 功能)
- Recylerview 加载更多功能实现(分页加载)
- Recylerview 加载更多功能实现(分页加载)
- 实现Twitter自动加载更多功能
- UItableview中实现加载更多功能+++
- java实现页面加载更多功能
- 工作笔记之加载更多功能实现
- RecyclerView实现底部加载更多功能
- thinkphp jq 实现列表查看更多功能
- auto形式(更多功能)类结构实现
- js实现加载更多功能实例
- js实现加载更多的功能
- Linux Shell常用技巧(二)
- POJ 3461 Oulipo(KMP字符串匹配)
- TP-LINK利用MAC绑定限制上网用户
- Linux Shell常用技巧(三)
- IOS开发之Cocoa编程—— NSUndoManager
- (五)实现更多功能
- 测试Qt的数据库驱动支持
- 游览珠海校区
- 欧拉公式
- Linux Shell常用技巧(四)
- 【PHP】 LINUX PHP执行
- 《数据结构》各章教学资源
- 点乘,叉乘总结
- Linux Shell常用技巧(五)