Comment récupérer le contenu d'un mot Wiktionnaire?

89

Comment l'API de Wiktionary peut-elle être utilisée pour déterminer si un mot existe ou non?

Armentage
la source
Quiconque a lu la documentation verra que l'API ne contient pas assez de fonctionnalités pour "récupérer le contenu des mots du Wiktionnaire". J'estime que cela vous permet d'obtenir environ 1% du chemin. Vous pouvez récupérer la syntaxe brute du wiki ou le HTML analysé et à partir de là, vous devez tout faire vous-même. Cela dit, il pourrait y avoir une toute nouvelle API expérimentale qui ne fonctionne que sur le Wiktionnaire anglais.
hippietrail
3
Obtenez tous les articles du Wiktionnaire dans des fichiers JSON individuels ici: github.com/dan1wang/jsonbook-builder
daniel

Réponses:

69

L' API Wiktionary peut être utilisée pour demander si un mot existe ou non.

Exemples de pages existantes et non existantes:

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

Le premier lien fournit des exemples sur d'autres types de formats qui pourraient être plus faciles à analyser.

Pour récupérer les données du mot dans un petit format XHTML (si plus que l'existence est requise), demandez la version imprimable de la page:

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

Ceux-ci peuvent ensuite être analysés avec n'importe quel analyseur XML standard.

Michael Mrozek
la source
4
Merci; l'API elle-même n'est pas ce que j'espérais mais le lien que vous avez fourni est ce que je cherchais.
Armentage
Il accepte maintenant le paramètre de format supplémentaire pour autre que la sortie XML comme ceci: en.wiktionary.org/w/...
eenagy
4
Cela pourrait ne pas fonctionner comme prévu mais en.wiktionary.org/wiki/Category:English_misspellings en.wiktionary.org/wiki/amatuer
endolith
Utilisez https://en.wiktionary.org/w/?curid=[page_id]&printable=yes:, pour rediriger vers la page XHTML en utilisant pageid.
mie.ppa
2
Comment filtrer dans cette API uniquement les mots anglais?
Nadav B
28

Il y a quelques mises en garde en vérifiant simplement que Wiktionary a une page avec le nom que vous recherchez:

Mise en garde # 1 : Tous les Wiktionnaires, y compris le Wiktionnaire anglais, ont en fait pour objectif d'inclure chaque mot dans chaque langue, donc si vous utilisez simplement l'appel API ci-dessus, vous saurez que le mot que vous demandez est un mot dans au moins une langue, mais pas forcément anglais: http://fr.wiktionary.org/w/api.php?action=query&titles=dicare

Mise en garde n ° 2 : il existe peut-être une redirection d'un mot à un autre. Cela peut provenir d'une orthographe alternative, mais peut-être d'une erreur quelconque. L'appel API ci-dessus ne fera pas la différence entre une redirection et un article: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Avertissement n ° 3 : Certains Wiktionnaires, y compris le Wiktionnaire anglais, incluent des "fautes d'orthographe courantes": http://fr.wiktionary.org/w/api.php?action=query&titles=fourty

Mise en garde # 4 : Certains Wiktionnaires autorisent les entrées de stub qui ont peu ou pas d'informations sur le terme. Ceci était courant sur plusieurs Wiktionnaires mais pas sur le Wiktionnaire anglais. Mais il semble s'être maintenant étendu au Wiktionnaire anglais: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (lien permanent pour le moment où le stub est rempli afin que vous puissiez toujours voir à quoi ressemble un talon: https://fr.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=239757161 )

Si ceux-ci ne sont pas inclus dans ce que vous voulez, vous devrez charger et analyser le wikitext lui-même, ce qui n'est pas une tâche triviale.

hippietrail
la source
2
Ce que je voulais vraiment faire, c'était faire un vidage complet des données sur l'un des sites Wikitionnaires non anglais, puis transformer le contenu en quelque chose que je pourrais utiliser localement. Cela semble ridicule maintenant, mais j'espérais pouvoir demander la liste de tous les mots, puis afficher leurs définitions / traductions une par une au besoin.
Armentage
1
Le correctif à Caveat # 2 est simple: ajoutez &prop=infoà la requête et vérifiez la réponse pour l' redirectattribut.
svick
@svick: Oui, c'est vrai # 2 est plus facile à contourner lors de l'utilisation de l'API, mais ces mises en garde de base couvrent également la tentative d'analyser les fichiers de vidage de données Wiktionary , même si cette question ne pose pas de question sur cette approche.
hippietrail
17

Vous pouvez télécharger un vidage des données Wikitionary . Il y a plus d'informations dans la FAQ . Pour vos besoins, le vidage des définitions est probablement un meilleur choix que le vidage xml.

kybernetikos
la source
2
Ces fichiers de vidage sont énormes et on ne sait pas lesquels télécharger (tous?). Probablement pas ce que la plupart des gens recherchent, ils veulent juste rechercher par programme une poignée de mots.
Cerin le
1
J'explique quel fichier télécharger - c'est-à-dire le vidage des définitions (le répertoire de mon lien est juste des versions différentes du même fichier), et oui, si vous voulez rechercher des mots par programme, c'est idéal. Si vous pouvez garantir que le programme ne sera exécuté qu'en ligne, il existe d'autres options, mais je réponds néanmoins à cette partie de la question initiale: "Sinon, y a-t-il un moyen pour extraire les données du dictionnaire qui soutiennent un Wiktionnaire?"
kybernetikos
18
Le lien de vidage des définitions n'est plus disponible.
live-love
8

Pour faire simple, extrayez les mots du vidage comme ça:

bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
Benroth
la source
comment obtenir une copie de pages-articles.xml.bz2?
Armentage
C'est juste un nom générique que j'ai utilisé pour décrire les vidages du formulaire LANGwiktionary-DATE-pages-articles.xml.bz2. Allez au lien , puis cliquez sur LANGwiktionary(LANG par exemple 'en', 'de' ...).
benroth
4

Si vous utilisez Python, vous pouvez utiliser WiktionaryParser de Suyash Behera.

Vous pouvez l'installer en

sudo pip install wiktionaryparser

Exemple d'utilisation:

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

Comme mentionné précédemment, le problème avec cette approche est que Wiktionnaire fournit des informations sur tous les mots de toutes les langues . Donc, l'approche pour vérifier si une page existe à l'aide de l'API Wikipedia ne fonctionnera pas car il y a beaucoup de pages pour des mots non anglais. Pour surmonter cela, vous devez analyser chaque page pour déterminer s'il existe une section décrivant le mot anglais . L'analyse du wikitext n'est pas une tâche triviale, même si dans votre cas ce n'est pas si grave. Pour couvrir presque tous les cas, vous devez simplement vérifier si le wikitext contient un Englishtitre. Selon le langage de programmation que vous utilisez, vous pouvez trouver des outils pour construire AST à partir de wikitext. Cela couvrira la plupart des cas, mais pas tous, car Wiktionary inclut des fautes d'orthographe courantes.

Comme alternative, vous pouvez essayer d'utiliser Lingua Robot ou quelque chose de similaire. Lingua Robot analyse le contenu du Wiktionnaire et le fournit en tant qu'API REST. Une réponse non vide signifie que le mot existe. Veuillez noter que, contrairement à Wiktionary, l'API elle-même n'inclut aucune faute d'orthographe (du moins au moment de la rédaction de cette réponse). Veuillez également noter que le Wiktionnaire contient non seulement les mots, mais aussi des expressions à plusieurs mots.

Roman Kishchenko
la source
0

Voici un début d'analyse des données d'étymologie et de prononciation:

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

Mise à jour : Voici un résumé plus détaillé.

Lance Pollard
la source
merci, essayé de l'exécuter dans la console devtools du navigateur. qu'est ce que c'est langs?
knb
1
mis à jour avec l'essentiel, langsc'est quelques milliers de lignes, trop gros pour SO.
Lance Pollard