def graph_around(central_concept, levels=2, relations=None, max_outdegree=5):
    finished_concepts = set()
    concepts_at_current_level = set([central_concept])
    edges = set()

    relations_filter = Q()
    for rel in relations or []:
        relations_filter |= Q(relation=Relation.get(rel))

    for level in xrange(levels):
        print 'Level', level, 'with', len(concepts_at_current_level), 'concepts'
        next_concepts = set()

        def consider(concept):
            if concept not in finished_concepts and concept not in concepts_at_current_level:
                next_concepts.add(concept)
                
        for concept in concepts_at_current_level:
            if concept in finished_concepts: continue
            assertions = concept.get_assertions().filter(relations_filter)[:max_outdegree]
            for assertion in assertions:
                if assertion.concept1 == concept:
                    consider(assertion.concept2)
                elif assertion.concept2 == concept:
                    consider(assertion.concept1)
                else:
                    raise RuntimeError('Impossible assertion')

                edges.add((assertion.concept1, assertion.relation, assertion.concept2, assertion.score))

            finished_concepts.add(concept)

        concepts_at_current_level = next_concepts

    return edges
Пример #2
0
def feature(request, lang, lr, relation_name, concept_name):
    language = get_language(lang)
    concept = Concept.objects.get(concept_name, language)
    relation = Relation.get(relation_name)
    cls = {'left': LeftFeature, 'right': RightFeature}[lr]
    feature = cls(relation, concept)
    return respond_with('commonsense/feature.html', request, dict(
            feature = feature))