Come recuperare il contenuto delle parole di Wikizionario?


89

Come può essere utilizzata l'API di Wikizionario per determinare se una parola esiste o meno?


Chiunque abbia letto la documentazione vedrà che l'API non contiene abbastanza funzionalità per "recuperare il contenuto delle parole di Wikizionario". Stimerei che ti porti all'incirca l'1% del percorso. Puoi recuperare la sintassi wiki grezza o l'HTML analizzato e da lì devi fare tutto da solo. Detto questo, potrebbe esserci una nuovissima API sperimentale che funziona solo sul Wikizionario inglese.
Hippietrail

3
Ottieni tutti gli articoli di Wikizionario nei singoli file JSON qui: github.com/dan1wang/jsonbook-builder
daniel

Risposte:


69

L' API Wiktionary può essere utilizzata per interrogare se una parola esiste o meno.

Esempi di pagine esistenti e non esistenti:

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

Il primo collegamento fornisce esempi su altri tipi di formati che potrebbero essere più facili da analizzare.

Per recuperare i dati della parola in un piccolo formato XHTML (dovrebbe essere necessario più dell'esistenza), richiedere la versione stampabile della pagina:

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

Questi possono quindi essere analizzati con qualsiasi parser XML standard.


4
Grazie; l'API stessa non è quello che speravo, ma il link che hai fornito è quello che stavo cercando.
Armentage

Ora accetta parametri di formato aggiuntivi per l'output diverso da xml in questo modo: en.wiktionary.org/w/…
eenagy


Usa https://en.wiktionary.org/w/?curid=[page_id]&printable=yes:, per reindirizzare alla pagina XHTML usando pageid.
mie.ppa

2
Come filtrare in questa API solo parole inglesi?
Nadav B

28

Ci sono alcuni avvertimenti nel controllare che Wiktionary abbia una pagina con il nome che stai cercando:

Avvertenza n. 1 : tutti i Wikizionario, compreso il Wikizionario inglese, hanno effettivamente l'obiettivo di includere ogni parola in ogni lingua, quindi se usi semplicemente la chiamata API sopra saprai che la parola di cui stai chiedendo è una parola in almeno una lingua, ma non necessariamente inglese: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Avvertenza n. 2 : forse esiste un reindirizzamento da una parola all'altra. Potrebbe provenire da un'ortografia alternativa, ma potrebbe essere un errore di qualche tipo. La chiamata API sopra non farà distinzione tra un reindirizzamento e un articolo: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Avvertenza n. 3 : alcuni Wikizionario, incluso il Wikizionario inglese, includono "errori di ortografia comuni": http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Avvertenza n. 4 : alcuni Wikizionario consentono voci stub che hanno poche o nessuna informazione sul termine. Questo era comune in diversi Wikizionario ma non nel Wikizionario inglese. Ma ora sembra essersi diffuso anche al Wikizionario inglese: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (permalink per quando lo stub è pieno in modo da poter ancora vedere che aspetto ha uno stub: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Se questi non sono inclusi in ciò che desideri, dovrai caricare e analizzare il wikitext stesso, il che non è un compito banale.


2
Quello che volevo veramente fare era prendere un dump completo dei dati su uno dei siti Wikitionary non in inglese, e poi trasformare i contenuti in qualcosa che potessi usare localmente. Sembra sciocco ora, ma speravo di poter richiedere l'elenco di tutte le parole e quindi tirare giù le loro definizioni / traduzioni una alla volta, se necessario.
Armentage

1
La correzione al Avvertimento # 2 è semplice: aggiungi &prop=infoalla query e controlla la risposta per l' redirectattributo.
svick

@svick: Sì, è vero # 2 è più facile da aggirare quando si utilizza l'API, ma questi avvertimenti di base riguardano anche il tentativo di analizzare i file di dump dei dati di Wikizionario , anche se questa domanda non fa domande su questo approccio.
Hippietrail

17

Puoi scaricare un dump di dati Wikitionary . Ci sono ulteriori informazioni nelle FAQ . Per i tuoi scopi, il dump delle definizioni è probabilmente una scelta migliore rispetto al dump xml.


2
Quei file di dump sono enormi e non è chiaro quali scaricare (tutti?). Probabilmente non è quello che la maggior parte delle persone cerca, vogliono solo cercare a livello di codice una manciata di parole.
Cerin

1
Spiego quale file scaricare - cioè il dump delle definizioni (la directory dal mio collegamento è solo versioni diverse dello stesso file), e sì, se vuoi cercare le parole a livello di programmazione, questo è l'ideale. Se puoi garantire che il programma verrà eseguito solo online, ci sono altre opzioni, ma comunque rispondo a questa parte della domanda originale: "In alternativa, c'è un modo per estrarre i dati del dizionario che supporta un Wikizionario?"
kybernetikos

18
Il link dump delle definizioni non è più disponibile.
live-love

8

Per mantenerlo davvero semplice, estrai le parole dalla discarica in questo modo:

bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words

come ottengo una copia di pages-articles.xml.bz2?
Armentage

È solo un nome generico che ho usato per descrivere i dump del modulo LANGwiktionary-DATE-pages-articles.xml.bz2. Vai al collegamento , quindi fai clic su LANGwiktionary(LANG es. "En", "de" ...).
benroth

4

Se stai usando Python, puoi usare WiktionaryParser di Suyash Behera.

Puoi installarlo da

sudo pip install wiktionaryparser

Utilizzo di esempio:

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


1

Come accennato in precedenza, il problema con questo approccio è che Wikizionario fornisce le informazioni su tutte le parole di tutte le lingue . Quindi l'approccio per verificare se esiste una pagina utilizzando l'API di Wikipedia non funzionerà perché ci sono molte pagine per parole non inglesi. Per ovviare a questo problema, è necessario analizzare ogni pagina per capire se c'è una sezione che descrive la parola inglese . L'analisi del wikitext non è un compito banale, anche se nel tuo caso non è poi così male. Per coprire quasi tutti i casi devi solo controllare se il wikitext contiene Englishun'intestazione. A seconda del linguaggio di programmazione che utilizzi, puoi trovare alcuni strumenti per creare AST da wikitext. Questo coprirà la maggior parte dei casi, ma non tutti perché Wiktionary include alcuni errori ortografici comuni.

In alternativa, potresti provare a utilizzare Lingua Robot o qualcosa di simile. Lingua Robot analizza il contenuto di Wikizionario e lo fornisce come API REST. La risposta non vuota significa che la parola esiste. Si noti che, a differenza di Wikizionario, l'API stessa non include errori di ortografia (almeno al momento della stesura di questa risposta). Si noti inoltre che il Wikizionario contiene non solo le parole, ma anche espressioni composte da più parole.


0

Ecco un inizio per analizzare i dati di etimologia e pronuncia:

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}}
}

Aggiornamento : ecco un succo con più dettagli.


grazie, ho provato a eseguirlo nella console del browser devtools. che cos'è langs?
knb

1
aggiornato con una sintesi, langsè di poche migliaia di righe, troppo grande per SO.
Lance Pollard,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.