ეს მაგალითი არის AI დამწყებთათვის სასწავლო პროგრამა-ის ნაწილი და ის შთაგონებულია ეს ბლოგის პოსტი-ით.
ყოველთვის მიჭირს ოჯახში ადამიანებს შორის განსხვავებული ურთიერთობის გახსენება. ამ მაგალითში ჩვენ ავიღებთ ონტოლოგიას, რომელიც განსაზღვრავს ოჯახურ ურთიერთობებს და ფაქტობრივ გენეალოგიურ ხეს და ვაჩვენებთ, თუ როგორ შეგვიძლია შევასრულოთ ავტომატური დასკვნა ყველა ნათესავის მოსაძებნად.
გენეალოგიური ხის მიღება
მაგალითად, ჩვენ ავიღებთ რომანოვების მეფის ოჯახი-ის გენეალოგიურ ხეს. ოჯახური ურთიერთობების აღწერის ყველაზე გავრცელებული ფორმატია GEDCOM. ჩვენ ავიღებთ რომანოვის ოჯახის ხეს GEDCOM ფორმატში:
იტვირთება…გამოტანა
0 HEAD
1 CHAR UTF8
1 GEDC
2 VERS 5.5
0 @0@ INDI
1 NAME Mihail Fedorovich /Romanov/
1 SEX M
1 BIRT
2 DATE 1613
1 DEAT
2 DATE 1645
1 FAMS @41@
0 @1@ INDI
1 NAME Evdokija Lukjanovna /Streshneva/
1 SEX F
GEDCOM ფაილის გამოსაყენებლად, შეგვიძლია გამოვიყენოთ python-gedcom ბიბლიოთეკა:
იტვირთება…გამოტანა
Collecting python-gedcom
Downloading python_gedcom-1.0.0-py2.py3-none-any.whl (35 kB)
Installing collected packages: python-gedcom
Successfully installed python-gedcom-1.0.0
ეს ბიბლიოთეკა აშორებს ზოგიერთ ტექნიკურ პრობლემას ფაილების ანალიზთან დაკავშირებით, მაგრამ ის მაინც გვაძლევს საკმაოდ დაბალი დონის წვდომას ხეზე ყველა ინდივიდსა და ოჯახზე. აი, როგორ შეგვიძლია გავაანალიზოთ ფაილი და ვაჩვენოთ ყველა ინდივიდის სია:
იტვირთება…იტვირთება…გამოტანა
[('@0@', ('Mihail Fedorovich', 'Romanov')),
('@1@', ('Evdokija Lukjanovna', 'Streshneva')),
('@2@', ('Aleksej Mihajlovich', 'Romanov')),
('@3@', ('Marija Ilinichna', 'Miloslavskaja')),
('@4@', ('Natalja Kirillovna', 'Naryshkina')),
('@5@', ('Marfa Matveevna', 'Apraksina')),
('@6@', ('Fedor Alekseevich', 'Romanov')),
('@7@', ('Sofja Aleksevna', 'Romanova')),
('@8@', ('Ivan V Alekseevich', 'Romanov')),
('@9@', ('Praskovja Fedorovna', 'Saltykova')),
('@10@', ('Ekaterina Ivanovna', 'Romanova')),
('@11@', ('Anna Ivanovna', 'Romanova')),
('@12@', ('Fridrih Vilgelm', 'Kurlandskij')),
('@13@', ('Karl Leopold', 'Meklenburg-Shverinskij')),
('@14@', ('Anna Leopoldovna', 'Meklenburg-Shverinskaja')),
('@15@', ('Anton Ulrih', 'Braunshvejg-Volfenbjuttelskij')),
('@16@', ('Ivan VI Antonovich', 'Braunshvejg-Volfenbjuttelskij')),
('@17@', ('Petr I Alekseevich', 'Romanov')),
('@18@', ('Evdokija Fedorovna', 'Lopuhina')),
('@19@', ('Ekaterina I Alekseevna', 'Mihajlova')),
('@20@', ('Aleksej Petrovich', 'Romanov')),
('@21@', ('Sharlotta Kristina', 'Braunshvejg-Volfenbjuttelskaja')),
('@22@', ('Petr II Alekseevich', 'Romanov')),
('@23@', ('Anna Petrovna', 'Romanova')),
('@24@', ('Elizaveta Petrovna', 'Romanova')),
('@25@', ('Karl Fridrih', 'Golshtejn-Gottorpskij')),
('@26@', ('Petr III Fedorovich', 'Romanov')),
('@27@', ('Ekaterina II', 'Alekseevna')),
('@28@', ('Pavel I Petrovich', 'Romanov')),
('@29@', ('Natalja Alekseevna', 'Gessen-Darmshtadskaja')),
('@30@', ('Marija Fedorovna', 'Vjurtembergskaja')),
('@31@', ('Aleksandr I Pavlovich', 'Romanov')),
('@32@', ('Elizaveta Alekseevna', 'Baden-Durlahskaja')),
('@33@', ('Nikolaj I Pavlovich', 'Romanov')),
('@34@', ('Aleksandra Fedorovna', 'Prusskaja')),
('@35@', ('Aleksandr II Nikolaevich', 'Romanov')),
('@36@', ('Marija Aleksandrovna', 'Gessenskaja')),
('@37@', ('Aleksandr III Aleksandrovich', 'Romanov')),
('@38@', ('Marija Fedorovna', 'Datskaja')),
('@39@', ('Nikolaj II Aleksandrovich', 'Romanov')),
('@40@', ('Aleksandra Fedorovna', 'Gessenskaja'))]აი, როგორ მივიღოთ ინფორმაცია ოჯახების შესახებ. გაითვალისწინეთ, რომ გვაძლევს იდენტიფიკატორების სიას და ჩვენ უნდა გადავიყვანოთ ისინი სახელებად, თუ მეტი სიცხადე გვინდა:
იტვირთება…გამოტანა
[('@41@', ['@0@', '@1@', '@2@']),
('@42@', ['@2@', '@3@', '@6@', '@7@', '@8@']),
('@43@', ['@8@', '@9@', '@10@', '@11@']),
('@44@', ['@13@', '@10@', '@14@']),
('@45@', ['@15@', '@14@', '@16@']),
('@46@', ['@2@', '@4@', '@17@']),
('@47@', ['@17@', '@18@', '@20@']),
('@48@', ['@20@', '@21@', '@22@']),
('@49@', ['@17@', '@19@', '@23@', '@24@']),
('@50@', ['@25@', '@23@', '@26@']),
('@51@', ['@26@', '@27@', '@28@']),
('@52@', ['@28@', '@30@', '@31@', '@33@']),
('@53@', ['@33@', '@34@', '@35@']),
('@54@', ['@35@', '@36@', '@37@']),
('@55@', ['@37@', '@38@', '@39@'])]ოჯახის ონტოლოგიის მიღება
შემდეგი, მოდით გადავხედოთ ოჯახის ონტოლოგია განსაზღვრულს, როგორც სემანტიკური ვებ ტრიპლეტების ერთობლიობას. ეს ონტოლოგია განსაზღვრავს ისეთ კავშირებს, როგორიცაა isUncleOf, isCousinOf და მრავალი სხვა. ყველა ეს ურთიერთობა განისაზღვრება ძირითადი პრედიკატების isMotherOf, isFatherOf, isBrotherOf და isSisterOf თვალსაზრისით. ჩვენ გამოვიყენებთ ავტომატურ მსჯელობას ონტოლოგიის გამოყენებით ყველა სხვა ურთიერთობის დასადგენად.
აქ მოცემულია isAuntOf თვისების განმარტების ნიმუში, რომელიც განისაზღვრება, როგორც isSisterOf და isParentOf-ის შემადგენლობა (დეიდა არის მშობლის და).
იტვირთება…იტვირთება…გამოტანა
@prefix fhkb: <http://www.example.com/genealogy.owl#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://www.example.com/genealogy.owl#> a owl:Ontology .
fhkb:DomainEntity a owl:Class .
fhkb:Man a owl:Class ;
owl:equivalentClass [ a owl:Class ;
owl:intersectionOf ( fhkb:Person [ a owl:Restriction ;
owl:onProperty fhkb:hasSex ;
owl:someValuesFrom fhkb:Male ] ) ] .
fhkb:Woman a owl:Class ;
owl:equivalentClass [ a owl:Class ;
owl:intersectionOf ( fhkb:Person [ a owl:Restriction ;
ონტოლოგიის აგება დასკვნისთვის
სიმარტივისთვის, ჩვენ შევქმნით ერთ ონტოლოგიურ ფაილს, რომელიც მოიცავს ორიგინალურ წესებს ოჯახის ონტოლოგიიდან და ფაქტებს ინდივიდების შესახებ ჩვენი GEDCOM ფაილიდან. ჩვენ გადავხედავთ GEDCOM ფაილს და ამოვიღებთ ინფორმაციას ოჯახებისა და ინდივიდების შესახებ და გადავიყვანთ მათ სამეულებად.
იტვირთება…იტვირთება…გამოტანა
fhkb:hasFemalePartner fhkb:i34 ;
fhkb:hasMalePartner fhkb:i33 .
fhkb:i54 a owl:NamedIndividual, owl:Thing ;
fhkb:hasFemalePartner fhkb:i36 ;
fhkb:hasMalePartner fhkb:i35 .
fhkb:i55 a owl:NamedIndividual, owl:Thing ;
fhkb:hasFemalePartner fhkb:i38 ;
fhkb:hasMalePartner fhkb:i37 .
[] a owl:AllDifferent ;
owl:distinctMembers ( fhkb:i0 fhkb:i1 fhkb:i2 fhkb:i3 fhkb:i4 fhkb:i5 fhkb:i6 fhkb:i7 fhkb:i8 fhkb:i9 fhkb:i10 fhkb:i11 fhkb:i12 fhkb:i13 fhkb:i14 fhkb:i15 fhkb:i16 fhkb:i17 fhkb:i18 fhkb:i19 fhkb:i20 fhkb:i21 fhkb:i22 fhkb:i23 fhkb:i24 fhkb:i25 fhkb:i26 fhkb:i27 fhkb:i28 fhkb:i29 fhkb:i30 fhkb:i31 fhkb:i32 fhkb:i33 fhkb:i34 fhkb:i35 fhkb:i36 fhkb:i37 fhkb:i38 fhkb:i39 fhkb:i40 fhkb:i41 fhkb:i42 fhkb:i43 fhkb:i44 fhkb:i45 fhkb:i46 fhkb:i47 fhkb:i48 fhkb:i49 fhkb:i50 fhkb:i51 fhkb:i52 fhkb:i53 fhkb:i54 fhkb:i55 ) .დასკვნის გაკეთება
ახლა ჩვენ გვინდა შეგვეძლოს გამოვიყენოთ ეს ონტოლოგია დასკვნისა და შეკითხვისთვის. ჩვენ გამოვიყენებთ RDFLib, ბიბლიოთეკას სხვადასხვა ფორმატში RDF გრაფის წასაკითხად, მოკითხვისთვის და ა.შ.
ლოგიკური დასკვნისთვის, ჩვენ გამოვიყენებთ OWL-RL ბიბლიოთეკას, რომელიც საშუალებას გვაძლევს ავაშენოთ RDF გრაფიკის Closure, ანუ დავამატოთ ყველა შესაძლო კონცეფცია და მიმართება, რომელიც შეიძლება დასკვნამდე მივიღოთ.
იტვირთება…გამოტანა
Requirement already satisfied: rdflib in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (6.3.2)
Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib) (0.6.1)
Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib) (3.0.9)
Requirement already satisfied: six in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from isodate<0.7.0,>=0.6.0->rdflib) (1.16.0)
Collecting git+https://github.com/RDFLib/OWL-RL.git
Cloning https://github.com/RDFLib/OWL-RL.git to /tmp/pip-req-build-lbfzwi3m
Running command git clone --filter=blob:none --quiet https://github.com/RDFLib/OWL-RL.git /tmp/pip-req-build-lbfzwi3m
Resolved https://github.com/RDFLib/OWL-RL.git to commit a77e1791b88b54aace609bc6000aac14c7add4ff
Preparing metadata (setup.py) ... [?25ldone
[?25hRequirement already satisfied: rdflib>=6.0.2 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from owlrl==6.0.2) (6.3.2)
Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib>=6.0.2->owlrl==6.0.2) (0.6.1)
Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from rdflib>=6.0.2->owlrl==6.0.2) (3.0.9)
Requirement already satisfied: six in /home/rg/anaconda3/envs/ai4beg/lib/python3.11/site-packages (from isodate<0.7.0,>=0.6.0->rdflib>=6.0.2->owlrl==6.0.2) (1.16.0)
მოდით გავხსნათ ონტოლოგიის ფაილი და ვნახოთ რამდენ სამეულს შეიცავს:
იტვირთება…გამოტანა
Triplets found:669
ახლა მოდით ავაშენოთ დახურვა და ვნახოთ, როგორ იზრდება სამეულის რაოდენობა:
იტვირთება…გამოტანა
Triplets after inference:4246
კითხვა ნათესავებისთვის
ახლა ჩვენ შეგვიძლია გამოვიკითხოთ გრაფიკი, რათა დავინახოთ სხვადასხვა ურთიერთობა ადამიანებს შორის. ჩვენ შეგვიძლია გამოვიყენოთ SPARQL ენა query მეთოდთან ერთად. ჩვენს შემთხვევაში, ვნახოთ ყველა ბიძა ჩვენი ოჯახის ხეში:
იტვირთება…გამოტანა
Fedor Alekseevich Romanov is uncle of Ekaterina Ivanovna Romanova
Aleksandr I Pavlovich Romanov is uncle of Aleksandr II Nikolaevich Romanov
Fedor Alekseevich Romanov is uncle of Anna Ivanovna Romanova
მოგერიდებათ ექსპერიმენტები სხვა ოჯახურ ურთიერთობებზე. მაგალითად, შეგიძლიათ გადახედოთ isAncestorOf ურთიერთობას, რომელიც განმეორებით განსაზღვრავს მოცემული ადამიანის ყველა წინაპარს.
ბოლოს და ბოლოს, მოდით გავწმინდოთ!
იტვირთება…