当前位置:网站首页>Knowledge Q & A based on Apache Jena

Knowledge Q & A based on Apache Jena

2022-07-06 11:06:00 zkkkkkkkkkkkkk

Preface

        This article is mainly about how to use Python Yes apache-jena Interactive query . Specific triple data establishment 、 transformation 、 Please see : Knowledge Q & a triplet data preparation stage  . This paper is based on the data preparation stage of Knowledge Q & a triplet , Then write down .

notes : The case code of this article uses  https://github.com/zhangtao-seu/Jay_KG  The code in   

Catalog

One 、 Code directory structure

Two 、 Knowledge Q & A implementation

        2.1、 Triple data acquisition

        2.1、 Define the entity

        2.2、 Define problem templates

3、 ... and 、 Run the code for question and answer


One 、 Code directory structure

        The following figure for Jay_KG The code directory structure of the project . The important thing is query_main.py and question_temp.py file , The former is the main entry of the program , The latter is the definition of knowledge question and answer template .

                                        

 

Two 、 Knowledge Q & A implementation

        2.1、 Triple data acquisition

                This case uses potege Software modeling , Finally, export owl file , Then continue according to   Knowledge Q & a triplet data preparation stage   In this paper, the 2.2 Section content is done step by step . Use in this case potege After modeling, see the following figure

 

        2.1、 Define the entity

                stay Jay_KG/KB_query/external_dict There is one of them. sanguo.txt, This is the entity file defined by the blogger , The content is shown in the figure below

        

 

        2.2、 Define problem templates

                open  question_temp.py file , Define templates , As shown in the following code ,QuestionSet Under class o_name、rides Function defines Guan Yu word ( Alias 、 nickname ) What is it? ? By 、 And Guan Yu's Mount ( Riding a 、 War horse ) What is it? ? Two templates .

# encoding=utf-8

"""
@desc:
 Set the problem template , Set the corresponding... For each template SPARQL sentence .demo Provide the following template :

"""
from refo import finditer, Predicate, Star, Any, Disjunction
import re

# # TODO SPARQL Prefix and template 
# SPARQL_PREXIX = u"""
# PREFIX owl: <http://www.w3.org/2002/07/owl#>
# PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
# PREFIX : <http://www.semanticweb.org/ zhang /ontologies/2019/1/untitled-ontology-32#>
# """

SPARQL_PREXIX = u"""
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX : <http://www.semanticweb.org/dell/ontologies/2022/0/untitled-ontology-3#>
"""

SPARQL_SELECT_TEM = u"{prefix}\n" + \
             u"SELECT {select} WHERE {
   {\n" + \
             u"{expression}\n" + \
             u"}}\n"


class W(Predicate):
    def __init__(self, token=".*", pos=".*"):
        self.token = re.compile(token + "$")
        self.pos = re.compile(pos + "$")
        super(W, self).__init__(self.match)

    def match(self, word):
        m1 = self.token.match(word.token.decode("utf-8"))
        m2 = self.pos.match(word.pos)
        return m1 and m2


class Rule(object):
    def __init__(self, condition_num, condition=None, action=None):
        assert condition and action
        self.condition = condition
        self.action = action
        self.condition_num = condition_num
    #                 word_object  :   [ word , The part of speech ]
    def apply1(self, sentence):
        matches = []
        #                      【person_entity】
        for m in finditer(self.condition, sentence):
            i, j = m.span()
            matches.extend(sentence[i:j])

        return self.action(matches), self.condition_num


class QuestionSet:
    def __init__(self):
        pass

    @staticmethod
    def o_name(word_object):
        # What is Guan Yu's word ?
        select = u"?o"
        sparql = None

        for w in word_object:
            if w.pos == pos_person:
                e = u" :{person} : word  ?o.".format(person=w.token.decode('utf-8'))
            sparql = SPARQL_SELECT_TEM.format(prefix=SPARQL_PREXIX,
                                              select=select,
                                              expression=e)
            print(sparql)
            break
        return sparql

    @staticmethod
    def rides(word_object):
        # What is Guan Yu's war horse ?
        select = u"?o"
        sparql = None

        for w in word_object:
            if w.pos == pos_person:
                e = u" :{person} : Riding a  ?o.".format(person=w.token.decode('utf-8'))
            sparql = SPARQL_SELECT_TEM.format(prefix=SPARQL_PREXIX,
                                              select=select,
                                              expression=e)
            print(sparql)
            break
        return sparql


# TODO  Define keywords 
pos_person = "nr"
person_entity = (W(pos=pos_person))

other_name = (W(" word ") | W(" Alias ") | W(" nickname "))
ride = (W(" Riding a ") | W(" mount ") | W(" War horse "))




# TODO  Question template / Matching rules 
"""

#  What is Guan Yu's word ?
#  What is Guan Yu's war horse ?

"""

rules = [
    #  What is Guan Yu's word ?
    Rule(condition_num=0, condition=person_entity + Star(Any(), greedy=False) + other_name + Star(Any(), greedy=False), action=QuestionSet.o_name),
    Rule(condition_num=0, condition=person_entity + Star(Any(), greedy=False) + ride + Star(Any(), greedy=False), action=QuestionSet.rides),

]

 

3、 ... and 、 Run the code for question and answer

        Get into query_main File run , The template defined before console input , You can receive the return .

        

原网站

版权声明
本文为[zkkkkkkkkkkkkk]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060912332534.html