Wie rufe ich Wiktionary-Wortinhalte ab?

89

Wie kann die API von Wiktionary verwendet werden, um festzustellen, ob ein Wort vorhanden ist oder nicht?

Armentage
quelle
Jeder, der die Dokumentation gelesen hat, wird feststellen, dass die API bei weitem nicht genügend Funktionen enthält, um "Wiktionary-Wortinhalte abzurufen". Ich würde schätzen, dass Sie ungefähr 1% des Weges erreichen. Sie können rohe Wiki-Syntax oder analysiertes HTML abrufen und von dort aus müssen Sie alles selbst erledigen. Allerdings könnte es eine sehr neue experimentelle API geben, die nur auf dem englischen Wiktionary funktioniert.
Hippietrail
3
Holen Sie sich alle Wiktionary-Artikel in einzelnen JSON-Dateien hier: github.com/dan1wang/jsonbook-builder
Daniel

Antworten:

69

Mit der Wiktionary-API kann abgefragt werden, ob ein Wort vorhanden ist oder nicht.

Beispiele für vorhandene und nicht vorhandene Seiten:

http://en.wiktionary.org/w/api.php?action=query&titles=test http://en.wiktionary.org/w/api.php?action=query&titles=testx

Der erste Link enthält Beispiele für andere Arten von Formaten, die möglicherweise einfacher zu analysieren sind.

Fordern Sie die druckbare Version der Seite an, um die Daten des Wortes in einem kleinen XHTML-Format abzurufen (sollte mehr als vorhanden sein):

http://en.wiktionary.org/w/index.php?title=test&printable=yes http://en.wiktionary.org/w/index.php?title=testx&printable=yes

Diese können dann mit jedem Standard-XML-Parser analysiert werden.

Michael Mrozek
quelle
4
Vielen Dank; Die API selbst ist nicht das, was ich mir erhofft hatte, aber der von Ihnen bereitgestellte Link ist das, wonach ich gesucht habe.
Armentage
Jetzt akzeptiert es zusätzliche Formatparameter für andere als XML-Ausgaben wie folgt
eenagy
Verwenden Sie : https://en.wiktionary.org/w/?curid=[page_id]&printable=yes, um mit auf die XHTML-Seite umzuleiten pageid.
mie.ppa
2
Wie filtere ich in dieser API nur nach englischen Wörtern?
Nadav B
28

Es gibt ein paar Einschränkungen, wenn Sie nur überprüfen, ob Wiktionary eine Seite mit dem Namen hat, nach dem Sie suchen:

Vorsichtsmaßnahme Nr. 1 : Alle Wiktionaries, einschließlich des englischen Wiktionary, haben tatsächlich das Ziel, jedes Wort in jede Sprache aufzunehmen. Wenn Sie also einfach den obigen API-Aufruf verwenden, wissen Sie, dass das Wort, nach dem Sie fragen, ein Wort in mindestens einer Sprache ist, aber nicht unbedingt Englisch: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Vorsichtsmaßnahme Nr. 2 : Möglicherweise besteht eine Umleitung von einem Wort zu einem anderen Wort. Es könnte aus einer alternativen Schreibweise stammen, aber es könnte aus einem Fehler stammen. Der obige API-Aufruf unterscheidet nicht zwischen einer Weiterleitung und einem Artikel: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Vorsichtsmaßnahme Nr. 3 : Einige Wiktionaries, einschließlich des englischen Wiktionary, enthalten "häufige Rechtschreibfehler": http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Vorsichtsmaßnahme Nr. 4 : Einige Wiktionaries erlauben Stub-Einträge, die nur wenige oder gar keine Informationen über den Begriff enthalten. Dies war früher bei mehreren Wiktionaries üblich, nicht jedoch beim englischen Wiktionary. Aber es scheint sich jetzt auch auf das englische Wiktionary ausgeweitet zu haben: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (Permalink, wenn der Stub gefüllt ist, damit Sie immer noch sehen können Wie ein Stub aussieht: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Wenn diese nicht in dem enthalten sind, was Sie möchten, müssen Sie den Wikitext selbst laden und analysieren, was keine triviale Aufgabe ist.

Hippietrail
quelle
2
Was ich wirklich tun wollte, war, einen vollständigen Speicherauszug der Daten auf einer der nicht englischen Wikitionary-Sites zu erstellen und den Inhalt dann in etwas umzuwandeln, das ich lokal verwenden konnte. Es scheint jetzt albern, aber ich hatte gehofft, dass ich die Liste aller Wörter anfordern und dann ihre Definitionen / Übersetzungen nach Bedarf einzeln herunterziehen kann.
Armentage
1
Die Korrektur für Caveat # 2 ist einfach: Fügen Sie &prop=infoder Abfrage hinzu und überprüfen Sie die Antwort auf redirectAttribute.
Svick
@svick: Ja, es ist wahr, dass # 2 bei Verwendung der API leichter zu umgehen ist, aber diese grundlegenden Einschränkungen betreffen auch den Versuch, die Wiktionary-Datendump-Dateien zu analysieren , obwohl diese Frage nicht nach diesem Ansatz fragt.
Hippietrail
17

Sie können einen Speicherauszug mit Wikitionary-Daten herunterladen . Weitere Informationen finden Sie in den FAQ . Für Ihre Zwecke ist der Definitionsspeicherauszug wahrscheinlich die bessere Wahl als der XML-Speicherauszug.

kybernetikos
quelle
2
Diese Dump-Dateien sind riesig und es ist unklar, welche heruntergeladen werden sollen (alle?). Wahrscheinlich nicht das, wonach die meisten Leute suchen, sondern nur programmgesteuert eine Handvoll Wörter nachschlagen möchten.
Cerin
1
Ich erkläre, welche Datei heruntergeladen werden soll - dh den Definitionsspeicherauszug (das Verzeichnis von meinem Link besteht nur aus verschiedenen Versionen derselben Datei), und ja, wenn Sie programmgesteuert nach Wörtern suchen möchten, ist dies ideal. Wenn Sie garantieren können, dass das Programm nur online ausgeführt wird, gibt es andere Optionen, aber ich beantworte dennoch diesen Teil der ursprünglichen Frage: "Kann ich alternativ die Wörterbuchdaten, die ein Wiktionary unterstützen, auf irgendeine Weise abrufen?"
Kybernetikos
18
Der Dump-Link für Definitionen ist nicht mehr verfügbar.
Live-Liebe
8

Um es wirklich einfach zu halten, extrahieren Sie die Wörter wie folgt aus dem Dump:

bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
Benroth
quelle
Wie bekomme ich eine Kopie von pages-articles.xml.bz2?
Armentage
Es ist nur ein generischer Name, mit dem ich die Speicherauszüge des Formulars beschrieben habe LANGwiktionary-DATE-pages-articles.xml.bz2. Gehen Sie zum Link und klicken Sie auf LANGwiktionary(LANG zB 'en', 'de' ...).
Benroth
4

Wenn Sie Python verwenden, können Sie WiktionaryParser von Suyash Behera verwenden.

Sie können es installieren durch

sudo pip install wiktionaryparser

Anwendungsbeispiel:

>>> from wiktionaryparser import WiktionaryParser
>>> parser = WiktionaryParser()
>>> word = parser.fetch('test')
>>> another_word = parser.fetch('test', 'french')
>>> parser.set_default_language('french')
Osolmaz
quelle
1

Wie bereits erwähnt, besteht das Problem bei diesem Ansatz darin, dass Wiktionary die Informationen zu allen Wörtern aller Sprachen bereitstellt . Der Ansatz, mithilfe der Wikipedia-API zu überprüfen, ob eine Seite vorhanden ist, funktioniert daher nicht, da viele Seiten für nicht englische Wörter vorhanden sind. Um dies zu überwinden, müssen Sie jede Seite analysieren, um herauszufinden, ob es einen Abschnitt gibt, der das englische Wort beschreibt . Das Parsen von Wikitext ist keine triviale Aufgabe, obwohl es in Ihrem Fall nicht so schlimm ist. Um fast alle Fälle abzudecken, müssen Sie nur überprüfen, ob der Wikitext eine EnglishÜberschrift enthält . Abhängig von der verwendeten Programmiersprache finden Sie einige Tools zum Erstellen von AST aus Wikitext. Dies wird die meisten Fälle abdecken, aber nicht alle, da Wiktionary einige häufige Rechtschreibfehler enthält.

Alternativ können Sie auch Lingua Robot oder ähnliches verwenden. Lingua Robot analysiert den Wiktionary-Inhalt und stellt ihn als REST-API bereit. Nicht leere Antwort bedeutet, dass das Wort existiert. Bitte beachten Sie, dass die API selbst im Gegensatz zu Wiktionary keine Rechtschreibfehler enthält (zumindest zum Zeitpunkt des Schreibens dieser Antwort). Bitte beachten Sie auch, dass das Wiktionary nicht nur die Wörter, sondern auch Mehrwortausdrücke enthält.

Roman Kishchenko
quelle
0

Hier ist ein Anfang zum Parsen von Etymologie- und Aussprachedaten:

function parsePronunciationLine(line) {
  let val
  let type
  line.replace(/\{\{\s*a\s*\|UK\s*\}\}\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en\}\}/, (_, $1) => {
    val = $1
    type = 'uk'
  })
  line.replace(/\{\{\s*a\s*\|US\s*\}\}\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en\}\}/, (_, $1) => {
    val = $1
    type = 'us'
  })
  line.replace(/\{\{enPR|[^\}]+\}\},?\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en}}/, (_, $1) => {
    val = $1
    type = 'us'
  })
  line.replace(/\{\{a|GA\}\},?\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en}}/, (_, $1) => {
    val = $1
    type = 'ga'
  })
  line.replace(/\{\{a|GA\}\},?.+\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en}}/, (_, $1) => {
    val = $1
    type = 'ga'
  })
  // {{a|GA}} {{IPA|/ˈhæpi/|lang=en}}
  // * {{a|RP}} {{IPA|/pliːz/|lang=en}}
  // * {{a|GA}} {{enPR|plēz}}, {{IPA|/pliz/|[pʰliz]|lang=en}}

  if (!val) return

  return { val, type }
}

function parseEtymologyPiece(piece) {
  let parts = piece.split('|')
  parts.shift() // first one is ignored.
  let ls = []
  if (langs[parts[0]]) {
    ls.push(parts.shift())
  }
  if (langs[parts[0]]) {
    ls.push(parts.shift())
  }
  let l = ls.pop()
  let t = parts.shift()
  return [ l, t ]
  // {{inh|en|enm|poisoun}}
  // {{m|enm|poyson}}
  // {{der|en|la|pōtio|pōtio, pōtiōnis|t=drink, a draught, a poisonous draught, a potion}}
  // {{m|la|pōtō|t=I drink}}
  // {{der|en|enm|happy||fortunate, happy}}
  // {{cog|is|heppinn||lucky}}
}

Update : Hier ist ein Kernstück, das ausführlicher ist.

Lance Pollard
quelle
danke, habe versucht, es in der Browser-Devtools-Konsole auszuführen. was ist langs?
Knb
1
aktualisiert mit einem Kern, langsist ein paar tausend Zeilen, zu groß für SO.
Lance Pollard