Wikidata:Einen Bot erstellen
Diese Seite erklärt, wie man für Wikidata Bots erstellt . Überlege, ob du deinen Programmcode teilst, neue Beispiele hinzufügst oder etwas anderes verbesserst.
Voraussetzungen
Um einen Bot zu erstellen, benötigst du:
- Programmierkenntnisse (Python, Perl, PHP...)
- Ein Bot-Framework (eines der Frameworks weiter unten) und einen Code, der eine Aufgabe erfüllt.
- Ein Botkonto (und Erlaubnis)
- Einen Texteditor (Notepad++, Geany, vi, emacs)
Empfehlung
- Trete einem Wikidata-Telegram-Kanal bei und beteilige dich an den Diskussionen (und frage nach Hilfe, wenn du Probleme bei der Programmierung hast).
Pywikibot
![]() | Warnung: Stand Juni 2022 unterstützt dieses Bot-Framework Lexeme nicht vollständig. Sieh dir die anderen Bibliotheken unten für vollständige Unterstützung an. |
Im nächsten Abschnitt lernst du, wie du einen Pywikibot installierst, konfigurierst und anmeldest. Die ersten drei Schritte müssen nur einmal gemacht werden. Du findest hier auch ein paar grundlegende Beispiele für die Botprogrammierung.
Installation
- Für weiterführende Informationen über die pywikibot-Installation siehe mw:Manual:Pywikibot/Installation und Wikidata:Pywikibot - Python 3 Tutorial/Setting up Shop.
- Um pywikibot ohne Installation zu verwenden siehe mw:Manual:Pywikibot/PAWS
Um pywikipediabot zu installieren:
- Installiere Python (Python v3.5.2 oder höher ist erforderlich)
- Pywikibot herunterladen:
- als Zip-Datei
- oder indem man das Git-Repositorium benutzt:Handbuch:Pywikibot/Gerrit
Konfiguration
- :Für weitere Informationen zur pywikibot-Konfiguration siehe mw:Manual:Pywikibot/user-config.py.
Es muss die user-config.py-Datei konfiguriert werden mit dem Benutzernamen des Bots sowie das Familienprojekt und die Sprache eingefügt werden. Wikidata betreffend sind Projektfamilie und Sprachparameter das gleiche, wikidata
.
Extended content |
---|
mylang = "wikidata"
family = "wikidata"
usernames["wikidata"]["wikidata"] = 'MyBotName'
|
Du kannst die Wartezeiten zwischen den Bearbeitungen reduzieren, indem du folgendes änderst: put_throttle = 1
Anmeldung (Login)
Nachdem du die user-config.py-Datei konfiguriert hast, melde dich wie folgt an:
$ python login.py
Du wirst nach deinem Bot-Passwort gefragt. Gib es ein und klick auf Enter. Du solltest jetzt angemeldet sein.
Beispiel 1: Die Daten holen
Dieses Beispiel erhält Daten für die Seite, die sich auf Douglas Adams bezieht. Speichere den folgenden Source-Code in einer Datei und führe sie aus: python example1.py
Extended content |
---|
import pywikibot
site = pywikibot.Site("en", "wikipedia")
page = pywikibot.Page(site, 'Douglas Adams')
item = pywikibot.ItemPage.fromPage(page)
dictionary = item.get()
print(dictionary)
print(dictionary.keys())
print(item)
|
item.get()
greift auf Wikidata zu und holt die Daten. Das Ergebnis ist (anders formatiert zum Überblick):
{ 'claims': { 'P646': [<pywikibot.page.Claim instance at 0x7f1880188b48>], 'P800': [<pywikibot.page.Claim instance at 0x7f1880188488>, <pywikibot.page.Claim instance at 0x7f1880188368>] ... } 'labels': { 'gu': '\u0aa1\u0a97\u0acd\u0ab2\u0abe\u0ab8 \u0a8f\u0aa1\u0aae\u0acd\u0ab8', 'scn': 'Douglas Adams', ... } 'sitelinks': { 'fiwiki': 'Douglas Adams', 'fawiki': '\u062f\u0627\u06af\u0644\u0627\u0633 \u0622\u062f\u0627\u0645\u0632', 'elwikiquote': '\u039d\u03c4\u03ac\u03b3\u03ba\u03bb\u03b1\u03c2 \u0386\u03bd\u03c4\u03b1\u03bc\u03c2', ... } 'descriptions': { 'eo': 'angla a\u016dtoro de sciencfikcio-romanoj kaj humoristo', 'en': 'English writer and humorist', }, 'aliases': { 'ru': ['\u0410\u0434\u0430\u043c\u0441, \u0414\u0443\u0433\u043b\u0430\u0441'], 'fr': ['Douglas Noel Adams', 'Douglas No\xebl Adams'], ... } } ['claims', 'labels', 'sitelinks', 'descriptions', 'aliases'] [[wikidata:Q42]]
Es zeigt einen Eintrag mit Schlüsseln für
- die Aussagen auf der Seite: Property:P646 ist die Freebase-Kennung, Property:P800 steht für "bedeutende Werke", etc.
- die Bezeichnung des Objekts in vielen Sprachen
- die Interwikilinks für das Objekt, nicht nur für Wikipedias in vielen Sprachen, sondern auch für Wikiquotes in vielen Sprachen
- die Objektbeschreibung in vielen Sprachen
- die Alternativnamen des Objekts in vielen Sprachen
Dann eine Liste mit allen Schlüsseln für die Schlüssel-Wert-Paare in dem Wörterbuch. Am Ende kannst du sehen, dass das Objekte für Douglas Adams Q42 ist.
Alternativen
Das Beispiel oben ruft die Objektseite auf, indem es den englischen Wikipediaartikel benutzt. Alternativ kann man auch die Objektseite direkt aufrufen.
Extended content |
---|
import pywikibot
site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q42')
|
Beispiel 2: Interwiki-Links ausgeben
Nach item.get() kann beispielsweise auf die Seitenlinks zugegriffen werden. Das sind die Links auf alle Wikimediaprojekte, die diesen Artikel haben.
Extended content |
---|
import pywikibot
site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q42')
item.get()
print(",".join(item.sitelinks))
|
Die Ausgabe ist:
{'fiwiki': 'Douglas Adams', 'eowiki': 'Douglas Adams', 'dewiki': 'Douglas Adams', ...}
Mit item.interlinks(), wird eine wiederholter Zugriff auf diese Seitenlinks zurückgegeben, in dem jeder Artikel nicht als einfacher Text ausgegeben wird, sondern bereits als ein Seiteneintrag für weitere Behandlung (z. B. um den Text im zugehörigen Wikiartikel zu bearbeiten).
Beispiel 4: Eine Beschreibung hinzufügen
Dieses Beispiel fügt eine Beschreibung auf Englisch und Deutsch zu dem Objekt über Douglas Adams hinzu.
Extended content |
---|
import pywikibot
site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q42')
item.get()
mydescriptions = {'en': 'English writer and humorist', 'de': 'Keine Panik!'}
item.editDescriptions(mydescriptions, summary='Setting/updating descriptions.')
|
Bezeichner und Aliasse werden auf dieselbe Weise gesetzt.
Beipiel 6: Einen Interwikilink setzen
Um einen Sprachenlink zu setzen, können wir entweder wie bei Beispiel 4 vorgehen oder Page objects verwenden:
Extended content |
---|
import pywikibot
site = pywikibot.Site("en", "wikipedia")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q42')
page = pywikibot.Page(site, 'Douglas Adams')
item.setSitelink(page, summary='Setting (/updating?) sitelink.')
|
Beispiel 7: Eine Aussage erstellen
Aussagen werden gesetzt mit Hilfe der Claim Klassen. Im folgenden setzen wir für Douglas Adams place of birth (P19): Cambridge (Q350).
Extended content |
---|
import pywikibot
site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q42')
claim = pywikibot.Claim(repo, 'P19')
target = pywikibot.ItemPage(repo, 'Q350')
claim.setTarget(target)
item.addClaim(claim, summary='Adding claim')
|
Bei den anderen Datentypen funktioniert es ähnlich. Im Folgenden setzen wir Behauptungen (Claims) mit den Datentypen String (IMDb ID (P345)) und Koordinaten (coordinate location (P625)) (URL funktioniert ebenso wie String):
Extended content |
---|
import pywikibot
site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q42')
stringclaim = pywikibot.Claim(repo, 'P345')
stringclaim.setTarget('nm0010930')
item.addClaim(stringclaim, summary='Adding string claim')
coordinateclaim = pywikibot.Claim(repo, 'P625')
coordinate = pywikibot.Coordinate(lat=52.208, lon=0.1225, precision=0.001, site=site)
coordinateclaim.setTarget(coordinate)
item.addClaim(coordinateclaim, summary='Adding coordinate claim')
|
Beispiel 8: Einen Qualifikator hinzufügen
Qualifikatoren gehören auch zu den Claims. Im folgenden fügen wir den Qualifikator incertae sedis (P678) family (Q35409) zur Behauptung "Claim" hinzu.
Extended content |
---|
qualifier = pywikibot.Claim(repo, 'P678')
target = pywikibot.ItemPage(repo, "Q35409")
qualifier.setTarget(target)
claim.addQualifier(qualifier, summary='Adding a qualifier.')
|
Beispiel 9: Eine Quelle hinzufügen
Auch Belege gehören zu der Klasse der Claims. Im Gegensatz zu Qualifikatoren kann ein Beleg mehr als eine Behauptung (Claim) haben. Im Folgenden fügen wir stated in (P248) Integrated Taxonomic Information System (Q82575) mit retrieved (P813) 20. März 2014 als Quelle für die Behauptung "Claim" hinzu. Die Behauptung muss entweder aus Wikidata abgerufen werden oder zuvor zu einer Objektseite hinzugefügt werden.
Extended content |
---|
statedin = pywikibot.Claim(repo, 'P248')
itis = pywikibot.ItemPage(repo, "Q82575")
statedin.setTarget(itis)
retrieved = pywikibot.Claim(repo, 'P813')
date = pywikibot.WbTime(year=2014, month=3, day=20)
retrieved.setTarget(date)
claim.addSources([statedin, retrieved], summary='Adding sources.')
|
Beispiel 10: Seitengeneratoren
TODO
Beispiel 11: Werte aus Untereigenschaften lesen
Im Folgenden bekommen wir Werte von Untereigenschaften vom Zweig described by source (P1343) -> Great Soviet Encyclopedia (1969–1978) (Q17378135) -> Eigenschaften reference URL (P854) und title (P1476).
Extended content |
---|
import pywikibot
site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q13515')
item.get()
sourcesid = 'P1343'
sourceid = 'Q17378135'
urlid = 'P854'
nameid = 'P1476'
# item.claims['P1343'][1].qualifiers.items(): # This are direct way to get list qualifiers. But '[1]' is hard link to index of list, it will break over time.
if sourcesid in item.claims:
for source in item.claims[sourcesid]:
if source.target.id == sourceid:
s = source.qualifiers
if urlid in s: url = s.get(urlid)[0].target
if nameid in s: name = s.get(nameid)[0].target['text']
print (url, name)
|
weitere Beispiele
Einige Benutzer teilen ihren Programmcode, dazu folgende Links:
- User:RobotMichiel1972/wikidata lowercase.py - Pywikipedia-Beispiel dazu, wie man die Bezeichnung in Kleinschreibung korrigieren kann, indem die Groß- und Kleinschreibung der englischen Bezeichung als 'Referenz' benutzt wird (hier hartkodiert und nur für nlwiki eingerichtet). Der Bot läuft über eine Auswahl von Seiten in der eigenen Wikipedia. (Dieses Tool ist für deutsche Bezeichnungen nicht sinnvoll, da dewiki deutlich andere Regeln zur Groß- und Kleinschreibung hat als enwiki)
- File:Bots hackathon 2013.pdf zeigt die in der Kernversion enthatenen Dateien "[mw:Special:MyLanguage/Manual:Pywikibot/claimit.py claimit.py]" und "template_harvest.py".
Wikidata Integrator
WikidataIntegrator ist eine Bibliothek zum Lesen und Schreiben in Wikidata/Wikibase. Wir haben sie geschaffen um Wikidata mit Inhalt von Datenbanken zu Genen, Proteinen, Krankheiten, Medikamenten und anderen zu füllen. Details zu den unterschiedlichen Aufgaben sind auf der Wikidata-Seite des Bots zu finden.
Pywikibot ist ein bestehendes Framework zur Interaktion mit der MediaWiki-API. Der Grund warum wir mit einer eigenen Lösung aufwarteten, ist, dass wir eine gute Integration des Wikidata-SPARQL-Endpoints benötigen um die Konsistenz der Daten sicherzustellen (Duplikatprüfung, Konsistenzprüfung, Auswahl des korrekten Datenobjekts, etc.). Verglichen mit Pywikibot ist WikidataIntegrator derzeit kein vollständiger Python-Wrapper für die MediaWiki-API, sondern ausschließlich darauf gerichtet, eine einfache Möglichkeit zu bieten, Python-basierte Wikidata-Bots zu erstellen.
Für weitere Informationen, Dokumentation, Download und Installationsanweisungen, siehe hier: https://github.com/SuLab/WikidataIntegrator/
Beispiel-Notizbuch
Ein Beispiel Notebook, das einen Beispiel-Bot zum Hinzufügen von therapeutischen Anwendungsbereichen zu Drogenartikeln zeigt, einschließlich der Verwendung des Fastrun-Modus, der Überprüfung von Referenzen und der Entfernung alter Aussagen:
http://public-paws.wmcloud.org/46883698/example%20ema%20bot.ipynb
WikibaseIntegrator
Fork des Wikidata Integrator von User:Myst aus 2020, hat mehrere Verbesserungen an der API erfahren, die es einfacher machen, Bots mithilfe der Bibliothek zu erstellen.
Für weitere Informationen, Dokumentation und Anleitung zum Download und zur Installation siehe hier: https://github.com/LeMyst/WikibaseIntegrator
Halbautomatisches Beispielskript
LexUse ist ein halbautomatisches Werkzeug, um Nutzungsbeispiele für Lexeme zu finden und zu ergänzen. Es handelt sich um freie Software, die 2020 mit Python 3 erstellt wurde.
Wikibase.NET (Veraltet)
Wikibase.NET ist die Api, die den nun veralteten DotNetDataBot versetzt. Api-Client für die MediaWiki-Erweiterung Wikibase. Sie sind nicht kompatibel, denn Wikibase.NET benötigt nicht länger DotNetWikiBot Framework.
Herunterladen und Installation
Wikibase.NET kann hier von GitHub heruntergeladen werden. Folge einfach den Anweisungen auf dieser Seite.
Bekannte Fehler
Beispiele
Kommt nicht demnächst ...
DotNetDataBot (Veraltet)
Installation
- Download: DotNetDataBot
Konfiguration
Nch dem Entpacken siehst du die Dateien DotNetDataBot.dll und DotNetDataBot.xml. Das xml Dokument ist nur für die Dokumentation. Um es zu nutzen musst du ein neues Refer in deinem Projket erstellen. Dann kannst du schreiben using DotNetDataBot;
um das Framework zu importieren.
Anmeldung (Login)
Um dich anzumelden, musst du ein neues Site
-Objekt mit der URL des Wikis, dem Benutzernamen deines Bots und seinem Passwort erstellen.
Extended content |
---|
C# using DotNetDataBot;
public static void Main()
{
Site wikidata = new Site("http://www.wikidata.org", "User", "Password");
}
|
Beispiel 1: ID über Wikiseite ermitteln
Du kannst auf die ID eines Objekts zugreifen durch Suche, indem du die Seite und den Titel der verbundenen Seite benutzt.
Extended content |
---|
C# using DotNetDataBot;
public static void Main()
{
Site site = new Site("http://www.wikidata.org", "User", "Password");
Item item = new Item(site);
if (item.itemExists("it", "George Lucas")) // Check if exist on Wikidata
{
Console.Write("Q" + item.GetIdBySitelink("it", "George Lucas"));
}
else
{
Console.Write("Doesn't exist");
}
}
|
Beispiel 2: Interwiki-Links ausgeben
Du kannst die Interwikilinks eines Objekte bekommen indem du den Inhalt lädst und auf links
des Objekts zugreifst.
Extended content |
---|
C# using DotNetDataBot;
public static void Main()
{
Site site = new Site("http://www.wikidata.org", "User", "Password");
Item item = new Item(site);
item.id = item.GetIdBySitelink("it", "George Lucas");
item.Load();
foreach(KeyValuePair<string, string> link in item.links)
{
Console.Write(link.Key); // lang (eg. en or it)
Console.Write(link.Value); // page (eg. George_Lucas)
}
}
|
Beispiel 3: Eine Beschreibung erstellen
Um eine Beschreibung zu setzen musst du die setDescription
Function aufrufen.
Extended content |
---|
C# using DotNetDataBot;
public static void Main()
{
Site site = new Site("http://www.wikidata.org", "User", "Password");
Item item = new Item(site, "Q4115189");
item.Load();
if (item.descriptions.ContainsKey("it")) // if alredy exist description in italian
{
// Nothing to do
}
else
{
item.setDescription("it", "description in italian", "Bot: Add italian description");
}
}
|
Beispiel 4: Eine Bezeichnung erstellen
Arbeitet gleich wie eine Bezeichnung setzen, nur dass setLabel
aufgerufen wird.
Extended content |
---|
C# using DotNetDataBot;
public static void Main()
{
Site site = new Site("http://www.wikidata.org", "User", "Password");
Item item = new Item(site, "Q4115189");
item.Load();
if (item.labels.ContainsKey("it")) // if alredy exist label in italian
{
// Nothing to do
}
else
{
item.setLabel("it", "label in italian", "Bot: Add italian label");
}
}
|
Beispiel 5: Interwiki-Links von 100 Seiten ermitteln
Diese Funktion wird nicht unterstützt. Du musst nur die Liste abarbeiten.
Wikibase API für PHP
Dieses ist ein API Client für Wikibase geschrieben in PHP. Herunterladen von hier.
Beispiel 1: Einfaches Beispiel
Schaue auf die Kommentare zum Quelltext um zu verstehen wie es funktioniert.
Extended content |
---|
<?php
/**
* Basic example for the use of the libary with some small edits
*/
require_once( __DIR__ . "/vendor/autoload.php" );
// Creates some useful objects and logs into the api
$api = new \Mediawiki\Api\MediawikiApi( "http://www.wikidata.org/w/api.php" );
$api->login( new \Mediawiki\Api\ApiUser( 'username', 'password' ) );
$dataValueClasses = array(
'unknown' => 'DataValues\UnknownValue',
'string' => 'DataValues\StringValue',
);
$wikidata = new \Wikibase\Api\WikibaseFactory(
$api,
new DataValues\Deserializers\DataValueDeserializer( $dataValueClasses ),
new DataValues\Serializers\DataValueSerializer()
);
// Gets the current revision for item Q777
$revision = $wikidata->newRevisionGetter()->getFromId( 'Q777' );
$item = $revision->getContent()->getData();
// Outputs the current sitelink for enwiki
var_dump( $item->getSiteLink( 'enwiki' ) );
// Sets the de description to 'Foobar'
$item->getFingerprint()->setDescription( 'de', 'Foobar' );
// Saves the item
$wikidata->newRevisionSaver()->save( $revision );
//Log out
$api->logout();
|
Beispiel 2:Behauptungen bearbeiten
Schaue auf die Kommentare zum Quelltext um zu verstehen wie es funktioniert.
Extended content |
---|
<?php
/**
* Basic example for the use of the library with some small edits.
*/
require_once( __DIR__ . "/vendor/autoload.php" );
// Creates some useful objects and logs into the api
$api = new \Mediawiki\Api\MediawikiApi( "https://www.wikidata.org/w/api.php" );
$api->login( new \Mediawiki\Api\ApiUser( 'username', 'password' ) );
$dataValueClasses = array(
'unknown' => 'DataValues\UnknownValue',
'string' => 'DataValues\StringValue',
);
$services = new \Wikibase\Api\WikibaseFactory(
$api,
new DataValues\Deserializers\DataValueDeserializer( $dataValueClasses ),
new DataValues\Serializers\DataValueSerializer()
);
$revision = $services->newRevisionGetter()->getFromId( 'Q777' );
$item = $revision->getContent()->getData();
$statementList = $item->getStatements();
if( $statementList->getByPropertyId( \Wikibase\DataModel\Entity\PropertyId::newFromNumber( 1320 ) )->isEmpty() ) {
$services->newStatementCreator()->create(
new \Wikibase\DataModel\Snak\PropertyValueSnak(
\Wikibase\DataModel\Entity\PropertyId::newFromNumber( 1320 ),
new \DataValues\StringValue( 'New String Value' )
),
'Q777'
);
}
// Log out
$api->logout();
|
VBot (keine Updates seit 2017)
Framework für Wikidata und Wikipedia. Liest und schreibt auf Wikidata und anderen Wikimedia-Projekten und bietet einen nützlichen Listen-Generator, der Listen von Wikipedia-Seiten und Wikidata-Entities erzeugt. Kann auch Wikidata-JSON-Dumps lesen.
Überblick
Bot zum Lesen und Bearbeiten von Wikidata und Wikipedia.
- Lizenz: CC0 1.0
- Sprache C#
- Kann in Wikidata Datensätze mit allen Datentypen lesen und bearbeiten
- Kann in allen Wiki-Projekten Seiten lesen und bearbeiten
- Kann Parameter aus Vorlagen in Wikiseiten lesen
- Kann JSON-Dumps lesen
- Kann Listen erstellen mit:
- Wikidata-Query
- Catscan 2
- Quick Intersection
- Links auf diese Seite auf Wikidata
- Getestet mit Visual Studio Express 2013 für Windows Desktop.
- Newtonsoft.Json ist erforderlich. Du kannst es mit NuGet in Visual Studio installieren
- Es ist erforderlich, manuell eine Referenz zu System.Web für "HttpUtility.UrlEncode" hinzuzufügen
Download
Das Framework kann hier von GitHub heruntergeladen werden.
Anleitung
- Wiki (unvollständig)
- User talk:ValterVB :)
Beispiel 1
Bearbeite en-Bezeichner für alle Items mit instance of (P31): short film (Q24862) die director (P57) gesetzt haben und deren publication date (P577) 1908 ist. (Verwendet Wikidata Query.)
Extended content |
---|
private void CompleteExample()
{
//Wikidata query
string strWDQ = "CLAIM[31:24862] AND CLAIM[57] AND BETWEEN[577,+00000001908-00-00T00:00:00Z,+00000001908-12-31T00:00:00Z]";
ListGenerator lg = new ListGenerator();
List<string> chunks = lg.WDQ(strWDQ, 50);
//Connection to Wikipedia
WikimediaAPI WP = new WikimediaAPI("https://it.wikipedia.org", User, Password);
Pages PageList = new Pages();
//Connection to Wikidata
WikimediaAPI WD = new WikimediaAPI("https://www.wikidata.org", User, Password);
Entities EntityList = new Entities();
Dictionary<string, string> Labels = new Dictionary<string, string>();
foreach (string list in chunks)
{
// Load all entity of the chunk
string strJson = WD.LoadWD(list);
EntityList = new Entities();
EntityList = JsonConvert.DeserializeObject<Entities>(strJson, new DatavalueConverter());
foreach (KeyValuePair<string, Entity> entity in EntityList.entities)
{
if (entity.Value.sitelinks.ContainsKey("itwiki"))
{
// Load Wikipage
string Pages = WP.LoadWP(entity.Value.sitelinks["itwiki"].title);
PageList = JsonConvert.DeserializeObject<Pages>(Pages, new DatavalueConverter());
//Director from template
string director = Utility.GetTemplateParameter(PageList.query.FirstPageText, "film","Regista").Replace("[","").Replace("]", "");
Labels = new Dictionary<string, string>();
if (director=="")
{
Labels.Add("en", "1908 short movie");
}
else
{
Labels.Add("en", "1908 short movie directed by " + director);
}
// Update Wikidata
WD.EditEntity(entity.Value.id, null, Labels, null, null, null, "BOT: Update en label");
}
}
}
}
|
LexData (Python; für Lexikographische Daten)
LexData ist eine einfach zu nutzende Python-Bibliothek, um Lexeme, Senses und Formen zu erstellen und zu bearbeiten.
Tipps
Die Dokumentation von LexData ist noch lückenhaft. Sieh dir daher bereits vorhandene Implementationen in MachtSinn oder Wikidata Lexeme Forms an, um zu verstehen, wie du es nutzen kannst.
Wenn du nur Aussagen zu Lexemen hinzufügen möchtest (keine Formen oder Senses), ist WikibaseIntegrator möglicherweise eine bessere Wahl, da er vielseitiger ist und mehr Datentypen unterstützt.
Installation
Du kannst LexData via pip installieren:
$ pip install LexData
Login
Du benötigst für alle Aktionen eine WikidataSession
. Du kannst sie mit deinen Anmeldeinformationen, einem Bot-Passwort oder einem Bearbeitungs-Token (zum Beispiel, um via OAUTH zu bearbeiten) erstellen:
Extended content |
---|
repo = LexData.WikidataSession("YourUsername", "YourPassword")
|
Ein Lexem abrufen
Du kannst existierende Lexeme abrufen und ihren Inhalt lesen.
Extended content |
---|
L2 = LexData.Lexeme(repo, "L2")
print(L2.claims)
print(L2.forms)
print(L2.senses)
sense1 = L2.senses[0]
print(sense1.claims)
|
Nach Lexemen suchen und Lexeme erstellen
Wenn du die L-Id eines Lexems nicht kennst, kannst du nach ihr suchen. Und wenn es nicht existiert, kannst du es erstellen.
Extended content |
---|
# Find an existing Lexeme by lemma, language and grammatical form
L2 = LexData.search_lexemes(repo, "first", en, "Q1084")
# Create a new Lexeme
L2 = LexData.create_lexeme(repo, "first", en, "Q1084")
# Find or create a Lexeme
L2 = LexData.get_or_create_lexeme(repo, "first", en, "Q1084")
|
Informationen hinzufügen
Du kannst einfach Formen oder Seses erstellen, mit oder ohne zusätzliche Behauptungen:
Extended content |
---|
if len(L2.forms) == 0:
L2.createForm("firsts", ["Q146786"])
if len(L2.senses) == 0:
L2.createSense(
{
"en": "Element in an ordered list which comes before all others according to the ordering",
"de": "einer Ordnung folgend das Element vor allen anderen",
},
claims={"P5137": ["Q19269277"]},
)
|
Die Wikidata-API direkt verwenden
Die anderen Abschnitte beschreiben, wie man Bot-Frameworks nutzt, um Informationen aus Wikidata abzurufen und zu aktualisieren.
Du kannst auch direkt die von Wikidata bereitgestellte Wikibase-API nutzen.
Dies ist erforderlich, wenn du dein eigenes Framework entwickelst oder du etwas tuen musst, das von anderen Frameworks nicht nicht unterstützt wird.
Die Dokumentation für Wikibase API befindet sich auf mediawiki.org. Du kannst es außerdem mit wbgetentities
auf Special:ApiSandbox ausprobieren.
Wikibase stellt seine API als Modulsatz für die MediaWiki "action" API zur Verfügung. Auf diese kannst du über HTTP-Anfragen auf /w/api.php
zugreifen.
Das Standardantwortformat ist JSON.
Für die Sprache deiner Wahl benötigst du also nur eine Bibliothek zum Senden von HTTP-Anfragen und eine JSON- oder XML-Bibliothek, um die Antworten zu analysieren.
Beispiel 1: Objektnummer ermitteln
Dieses Beispiel gibt das Objekt (Q-Nummer) für den englischsprachigen Wikipedia-Artikel über die Andromedagalaxie aus. Das Haupt-Arbeitsmodul der Wikibase-API, action=wbgetentities
, enthält diese Information. Die HTTP-Anfrage (die das jsonfm
-Format für eine menschenlesbare JSON-Ausgabe nutzt) ist einfach
Probiere den Link aus. Diese Anfrage fordert keine weiteren Informationen über den Datensatz an; entferne &props=
aus der URL, um wesentlich mehr Informationen zu erhalten.
Siehe die generierte Hilfeseite für wbgetentities
für weitere Parameter, die du angeben kannst.
Python
Extended content |
---|
#!/usr/bin/python3
from requests import get
def get_qnumber(wikiarticle, wikisite):
resp = get('https://www.wikidata.org/w/api.php', {
'action': 'wbgetentities',
'titles': wikiarticle,
'sites': wikisite,
'props': '',
'format': 'json'
}).json()
return list(resp['entities'])[0]
print(get_qnumber(wikiarticle="Andromeda Galaxy", wikisite="enwiki"))
|
Die Ausgabe ist:
Q2469
Beispiel 2: Liste von Objekten ohne Interwikilinks abrufen
...bitte trage etwas bei, wenn du dich auskennst...
Siehe auch
- mw:Wikidata Toolkit Java framework
- Wikidata:Bots
- Wikidata:Bots by function
- Wikidata:Pywikibot - Python 3 Tutorial
- Wikidata:Sandbox