联想文本的迭代器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<=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>=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>=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>=tnumber:
continue
if tnumber<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>