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
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))