:- module(concept_entries, [ concept_entries/3 % +Video, -Pairs:list(concept-entries), +Options ]). :- use_module(library(semweb/rdf_db)). :- use_module(library(semweb/rdf_label)). :- use_module(library(video_annotation)). :- use_module(api(reconcile)). :- rdf_meta type_scheme(+,r). /* type_scheme(subject, gtaa:'Onderwerpen'). type_scheme(location, gtaa:'GeografischeNamen'). type_scheme(person, gtaa:'Persoonsnamen'). type_scheme(person, gtaa:'Namen'). %type_scheme(person, gtaa:'Maker'). concept_entries(Video, ConceptEntries, Options) :- option(max(Max), Options, 3), option(types(Types), Options, [subject,person,location]), video_annotations(Video, Annotations, Options), maplist(annotation_pair, Annotations, TagEntries0), merge_entries(TagEntries0, TagEntries), concept_entries(TagEntries, Filter, ConceptEntries, Rest) :- concept_entries_(TagEntries, ConceptEntries, Rest), merge_entries(ConceptEntries0, ConceptEntri concept_entries_([Tag-Entries|Ts], Filter, [Concept-Entries|Cs], Rest) :- tag_concept(Tag, Filter, Concept), concept_entries_(Ts, Filter, Cs, Rest). merge_entries(ConceptEntries0, ConceptEntries1), group_by_type(ConceptEntries1, ConceptEntries). tag_concept(Tag, Max, Types, Concept, Type) :- tag_value(Tag, Value), %snowball(dutch, Value, Stem0), %downcase_atom(Value, Stem), reconcile(Value, Max, Hits0), one_concept_per_type(Hits0, Types, Hits), member(Type-Concept, Hits). one_concept_per_type(_, [], []) :- !. one_concept_per_type([], _, []) :- !. one_concept_per_type([hit(D,R,_,_)|Hs], Types, Cs) :- ( D > 3 -> Cs = [] ; rdf(R, skos:inScheme, Scheme), \+ rdf_equal(gtaa:'GTAA', Scheme), scheme_in_types(Types, Scheme, Type, Types1) -> Cs = [Type-R|Cs1] ), one_concept_per_type(Hs, Types1, Cs1). one_concept_per_type([_|Hs], Types, Concepts) :- one_concept_per_type(Hs, Types, Concepts). scheme_in_types([Type|Ts], Scheme, Type, Ts) :- type_scheme(Type, Scheme), !. scheme_in_types([Type0|Ts], Scheme, Type, [Type0|Rest]) :- scheme_in_types(Ts, Scheme, Type, Rest). group_by_type([], []). group_by_type([c(Type,C)-Es|T], [Type-Annotations|Rest]) :- same_type([c(Type,C)-Es|T], Type, Annotations, Cs1), group_by_type(Cs1, Rest). same_type([c(Type,C)-Es|T], Type, [Annotation|Cs], Rest) :- !, Annotation = annotation(uri(C,Label),0,0,Es), rdf_display_label(C, Label), same_type(T, Type, Cs, Rest). same_type(T, _, [], T). annotation_pair(annotation(Value,_,_,Es0,_), Value-Es) :- convert_entries(Es0, Value, Es). convert_entries([], _, []). convert_entries([i(URI,Time)|Is], Value, [entry(URI,Value,Time)|Es]) :- convert_entries(Is, Value, Es). merge_entries(Pairs, Merged) :- keysort(Pairs, Sorted), group_pairs_by_key(Sorted, Grouped), maplist(value_flatten, Grouped, Merged). value_flatten(Key-Lists, Key-List) :- flatten(Lists, List). tag_value(literal(Tag), Tag). tag_value(uri(_URI,Tag), Tag). */