def _adopt_state(urls, states, goal, max_state, minimum_volume, upper_criteria_url = 0.95, lower_criteria_url = 0.75, lower_criteria_dom = 0.75): total_uu = sum([uu for uu in urls.values()]) accumulated = 0 accumulated_states = len(states) for url, uu in sorted(urls.items(), key = lambda x:x[1], reverse = True): adopted_flag = False #CVページなら無条件でstateに採用する if url.find(goal) >= 0: states.setdefault(goal, []) states[goal].append(url) accumulated += uu else: #以前に採用したstateと似ている場合にはそのstateとマージする for state in states.keys(): url_ratio, netloc_ratio, path_ratio, query_ratio = dif_urls(state, url) if url_ratio >= upper_criteria_url: #URLがほとんど同じなら同一と見なす states[state].append(url) adopted_flag = True accumulated += uu break elif url_ratio >= lower_criteria_url: #上記の条件は満たさないが少し似ている場合にはDOM構造を見て決める dom_ratio = dif_htmls(state, url) if dom_ratio >= lower_criteria_dom: states[state].append(url) adopted_flag = True accumulated += uu break elif netloc_ratio >= upper_criteria_url and path_ratio >= upper_criteria_url: #クエリが長過ぎて一致条件に当てはまらないものを救う if query_ratio >= lower_criteria_url * 0.50: states[state].append(url) adopted_flag = True accumulated += uu break #以前に採用したstateとマージされなかった場合は新規stateとして採用する if not adopted_flag: states.setdefault(url, []) states[url].append(url) accumulated += uu #条件を満たしたらマージをやめる if len(states) >= max_state + accumulated_states or accumulated >= minimum_volume * total_uu: print 'states:', len(states) - accumulated_states, 'volume:', float(accumulated) / float(total_uu) break for state, url in states.items(): states[state] = list(set(states[state])) #uu_volumeが十分にとれなかった場合には何らかの方法で救済する? return states
def _adopt_state(urls, states, goal, max_state, minimum_volume, upper_criteria_url = 0.95, lower_criteria_url = 0.75, lower_criteria_dom = 0.75): total_uu = sum([uu for uu in urls.values()]) accumulated = 0 accumulated_states = len(states) for url, uu in sorted(urls.items(), key = lambda x:x[1], reverse = True): adopted_flag = False #CVページなら無条件でstateに採用する if url.find(goal) >= 0: states.setdefault(goal, []) states[goal].append(url) accumulated += uu else: #以前に採用したstateと似ている場合にはそのstateとマージする for state in states.keys(): if state.find('?') == -1 and url.find('?') == -1: #クエリパラメータがない場合の処理 url_ratio, netloc_ratio, path_ratio, query_ratio = dif_urls(state, url) if url_ratio >= upper_criteria_url: #URLがほとんど同じなら同一と見なす states[state].append(url) adopted_flag = True accumulated += uu break elif url_ratio >= lower_criteria_url: #上記の条件は満たさないが少し似ている場合にはDOM構造を見て決める dom_ratio = dif_htmls(state, url) if dom_ratio >= lower_criteria_dom: states[state].append(url) adopted_flag = True accumulated += uu break elif state.find('?') >= 0 and url.find('?') >= 0: #クエリパラメータがある場合の処理 url_ratio, netloc_ratio, path_ratio, query_ratio = dif_urls(state, url) if netloc_ratio >= upper_criteria_url and path_ratio >= upper_criteria_url: #クエリが長過ぎて一致条件に当てはまらないものを救う states[state].append(url) adopted_flag = True accumulated += uu break #以前に採用したstateとマージされなかった場合は新規stateとして採用する if not adopted_flag: parsed = urlparse(url) #クエリパラメータがある場合とない場合でstateの表現を変える if parsed.query == '': state = url else: state = parsed.scheme + '://' + parsed.netloc + parsed.path + '?' state = url states.setdefault(state, []) states[state].append(url) accumulated += uu #条件を満たしたらマージをやめる if len(states) >= max_state + accumulated_states or accumulated >= minimum_volume * total_uu: print 'states:', len(states) - accumulated_states, 'volume:', float(accumulated) / float(total_uu) break #最後に重複要素の除去 for state, url in states.items(): states[state] = list(set(states[state])) return states