新Alpha前端页面


联想文本的迭代器TextAssociateIterator

<p>欢迎使用ShowDoc!</p> <pre><code>def __init__(self, input_text, page_size=10): self._inputtext=input_text self._psize=page_size self._stage=1 self._curPos=0 self._tadict={} input text 只是保存了原始的输入文本 psize 表示逻辑上扫描每一个具体的文本联想键的时候的数据块大小(50表示每次扫描50个原始的文本),并不等于实际每一次调用迭代器返回的实际数量 stage - 表示当前的退化步数,从1开始,1表示没有退化,在上一个退化阶段的数据没有使用完毕之前,不会进行下一个阶段的计算 _curPos 表示当前的位置,当分多个页迭代取数据的时候,需要这个变量记录位置 _tadict 这个结构记录了所有的阶段,对应的所有的实际的文本联想交集结果的redis结构键的名字和其他所有附属信息 tadict的结构如下 {// 一级键表示在那个退化步数下,底层返回的键的信息 "1":[]//由于某一个退化步数下,键的个数是多个,所以是一个列表 "2":[{"type":"","key_name":"","totoal":""},{},{}] //具体的字典内,又记录了集体底层信息。数据从_queryTextAssociation函数过来,_queryTextAssociation函数则是在指定了退化步数后,调用了TextMapManage的getAssociatedText(input_text,step=stage) "3":[] } </code></pre> <p>迭代过程如下: 迭代过程发生在getIterator(self,max_stage=3)这个函数中,max stage表示最大的退化步数,默认从1开始,就是不退化结果。 从不退化结果,stage=1出发,当迭代器穷尽了当前阶段的所有数据后,才计算下一个阶段的数据;当前阶段数据过多,则使用curPos和psize进行分页数据提取</p> <pre><code>while(self.stage&lt;=max_stage): text_data=*self._getTextListByPage*(self.stage) if text_data is not None: self.curPosition+=1 yield text_data['text_list'] else: self.stage+=1 self.curPosition=0 self._queryTextAssociation(self.stage) def _getTextListByPage(self,stage): #fetch part of the text list from existing keys #if number of list or set is larger than some value, use random sample #othewise, get all the elements in the set and size_thres=500 all_key_list=self.collectAllKeyList(stage) if len(all_key_list)==0: return None start_pos=self.curPosition * self.page_size end_pos=start_pos+self.page_size # print 'current start position %d, end position %d' % (start_pos,end_pos) # print 'all text list data' # print all_key_list # print '--'*100 result={} result['text_list']=[] result['stage']=stage result['cur_page']=self.curPosition nw=TextMapManager() valid_key_number=0 for gorup in all_key_list: stype=gorup['type'] tnumber=gorup['total'] key_name=gorup['name'] if start_pos&gt;=tnumber: # print 'the size of key strcuuture %s size is %d, smaller than start pos' % (key_name,tnumber) continue else: if stype==u'sorted_set': # fetch item between strat and end position if start_pos&gt;=tnumber: continue ass_text=conn.zrevrange(key_name,start_pos, end_pos, False) # print 'extracting text data from sorted seet %s, between %d and %d' % (key_name,start_pos,end_pos) # print ",".join(ass_text) result['text_list'].extend(ass_text) valid_key_number+=1 elif stype==u'set': if start_pos&gt;=tnumber: continue if tnumber&lt;size_thres: ass_text=list(nw.getCutText(key_name, members=True)) ass_text=sorted(ass_text) ass_text=ass_text[start_pos:end_pos] else: ass_text=list(nw.getCutText(key_name, random_member=True, number=self.page_size)) ass_text=sorted(ass_text) result['text_list'].extend(ass_text) valid_key_number+=1 # print ",".join(ass_text) else: continue # print 'key strcuuture %s type %s unkwnon' % (key_name,stype) if valid_key_number==0: return None else: return result</code></pre>

页面列表

ITEM_HTML