/ontoexplorer

Este repositório contém o código fonte das recomendações de classes e propriedades da ontologia utilizada pelo OntoIQA-Bot.

Primary LanguagePython

ontoexplorer

Code style: black

Árvores da ontologia

Este repositório contém o código fonte das recomendações de classes e propriedades da ontologia utilizada pelo OntoIQA-Bot. Para a construção das árvores de ontologias são necessários os seguintes requisitos:

Requisitos:

Obs: É necessária a instalação das bibliotecas do Pipefile.

No notebook onto_tree_build.ipynb é realizada a construção das árvores através da classe OntologyTrees, o arquivo da ontologia deve ser um formato aceito pela biblioteca rdflib.

from ontotrees import OntologyTrees

onto_trees = OntologyTrees()

# Carregar o grafo da ontologia em três árvores de hierarquia (classes, propriedades de objeto e propriedades de dado)
onto_trees.load_ontology("movieontology.ttl", format="ttl")

# Nomes das árvores carregadas
onto_trees.trees_names
# >> ['classes', 'object_properties', 'data_properties']

Na Figura a seguir ilustramos parte das árvores carregadas pela classe OntologyTrees.

Recomendação de nós

O processo de recomendação realizada na classe Recommendation é ajustado no arquivo de configurações recommendation.ini. Onde:

Params Default Description
family_position -2 Nível em relação ao nó de referência pode assumir valores menore ou iguais a zero.
filter_by both Se a indicação do nó deve ser baseada no range, domain ou ambos.
depth 3 Profundidade da busca na árvore a partir da family_position, pode assumir apenas valores positivos.
order random A forma como as sugestões serão apresentadas, se nenhum parâmetro for passado retorna na ordem da busca.
number_of_recommendations 5 Quantidade máxima de recomendações, deve ser um número maior do que zero.
ontology_filename movieontology.ttl Nome do arquivo da ontologia que se encontra no mesmo nível de recommendation.py.
ontology_format ttl formato da ontologia, formato definido de acordo com os formatos da rdflib.

nó de referência, é o nó que desejamos substituir por outro

Nós relacionados:

Para realizar a consulta de nós relacionados, é necessária a definição de alguns parâmetros, dentre eles a family_position que indica qual dentre os ancestrais do nó de referência será utilizado como raiz da busca. A equação e o pseudocódigo descrevem esse processo:

equation

Onde node_ref é o nó de referência e search_root é novo nó calculado, a função kthAncestor é definida no bloco de código a seguir, onde ancestors indica os ancestrais do nó dado.

PROGRAM kthAncestor(node_ref, family_position):
    var node_ancestors = ancestors(node_ref);
    var count = 0;
    WHILE (count < node_ancestor.length)
        var node = node_ancestors[count];
        IF (-count == family_position)
            THEN Return node;
        ENDIF;
        count = count + 1;
    ENDWHILE;
END.

Se na árvore de classes, o nó de referência for Actor, e o family_position for definido como -1, o root_ref apontaria para o nó Person.

Outro parâmetro importante é a profundidade da consulta na árvore que é definida pela variável depth que pode assumir apenas valores positivos. Suponha que o node_ref seja o nó Person, se a profundidade definida for 1, então todos os filhos de Person podem ser sugeridos.

Também podemos filtrar os nós a serem sugeridos com base em seu domínio e alcance, na tabela a seguir temos alguns exemplos de nós da árvore de propriedade com seus respectivos domains e ranges, para o próximo exemplo vamos considerar o family_position e a depth=2.

Object Property Domain Range
belongsToGenre Movie/TVSeries Genre
hasActress Movie/TVSeries Actress
hasActor Movie/TVSeries Actor
isAwardedWith Movie/TVSeries/Person Award
wrote Writer Movie/TVSeries

Dada a propriedade wrote se quisermos delimitar pelo Range, teremos zero sugestões, pois não existe outra propriedade com o Range de wrote nesta tabela. Entretanto se filtramos a propriedade pelo Domain podemos sugerir a propriedade isAwardedWith, pois Writer é descendente de Person como podemos ver na imagem Classes Tree.

Caso a propriedade de referência seja belongsToGenre e filtremos pelo Domain teremos como sugestão hasActress, hasActor e isAwardedWith pois compartilham domínios em comum com belongsToGenre.

Na figura a seguir mostramos o processo de sugestão de nós baseados no range da propriedade belongsToGenre e algumas variações de depth e family_position.

Exemplo:

from recommendations import Recommendation

# Qual o gênero do filme Avatar?
rec = Recommendation()

question_triples =  [
    ("http://www.movieontology.org/2009/10/01/movieontology.owl#Movie", "has_value", "Avatar"),
     ("http://www.movieontology.org/2009/10/01/movieontology.owl#Movie", "http://www.movieontology.org/2009/10/01/movieontology.owl#belongsToGenre", "http://www.movieontology.org/2009/10/01/movieontology.owl#Genre")
]

rec.get_recommendations(question_triples)
#['[Gênero(s)] -> [Diretor(es)]', '[Gênero(s)] -> [Companhia(s) de produção]', '[Gênero(s)] -> [Roteirista(s)]', '[Gênero(s)] -> [Editor(es)]', '[Gênero(s)] -> [Indicação/Indicações]']