예제 #1
0
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
예제 #2
0
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