¿Cómo recuperar el contenido de palabras de Wikcionario?

89

¿Cómo se puede usar la API de Wiktionary para determinar si una palabra existe o no?

Armentage
fuente
Cualquiera que haya leído la documentación verá que la API no contiene la suficiente funcionalidad para "recuperar el contenido de palabras de Wiktionary". Calculo que te lleva aproximadamente el 1% del camino. Puede recuperar la sintaxis de wiki en bruto o HTML analizado y desde allí tiene que hacer todo usted mismo. Dicho esto, podría haber una API experimental muy nueva que solo funcione en el Wikcionario en inglés.
hippietrail
3
Obtenga todos los artículos de Wiktionary en archivos JSON individuales aquí: github.com/dan1wang/jsonbook-builder
daniel

Respuestas:

69

La API de Wiktionary se puede utilizar para consultar si existe o no una palabra.

Ejemplos de páginas existentes y no existentes:

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

El primer enlace proporciona ejemplos sobre otros tipos de formatos que podrían ser más fáciles de analizar.

Para recuperar los datos de la palabra en un formato XHTML pequeño (si se requiere más que la existencia), solicite la versión imprimible de la página:

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

A continuación, se pueden analizar con cualquier analizador XML estándar.

Michael Mrozek
fuente
4
Gracias; la API en sí no es lo que esperaba, pero el enlace que proporcionó es lo que estaba buscando.
Armentage
Ahora acepta un parámetro de formato adicional para otra salida que no sea xml, así: en.wiktionary.org/w/…
eenagy
4
Sin embargo, es posible que no funcione como espera en.wiktionary.org/wiki/Category:English_misspellings en.wiktionary.org/wiki/amatuer
endolith
Use:, https://en.wiktionary.org/w/?curid=[page_id]&printable=yespara redirigir a la página XHTML usando pageid.
mie.ppa
2
¿Cómo filtrar en esta API solo palabras en inglés?
Nadav B
28

Hay algunas advertencias al comprobar que Wiktionary tiene una página con el nombre que estás buscando:

Advertencia n. ° 1 : todos los wikcionarios, incluido el wikcionario en inglés, tienen el objetivo de incluir cada palabra en cada idioma, por lo que si simplemente usa la llamada API anterior, sabrá que la palabra por la que está preguntando es una palabra en al menos un idioma, pero no necesariamente en inglés: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Advertencia n. ° 2 : tal vez exista una redirección de una palabra a otra. Puede ser por una ortografía alternativa, pero puede ser por un error de algún tipo. La llamada a la API anterior no diferenciará entre un redireccionamiento y un artículo: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Advertencia # 3 : algunos wikcionarios, incluido el inglés, incluyen "errores ortográficos comunes": http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Advertencia # 4 : algunos wikcionarios permiten entradas de código auxiliar que tienen poca o ninguna información sobre el término. Esto solía ser común en varios wikcionarios, pero no en el wikcionario en inglés. Pero parece que ahora se ha extendido también al Wiktionary en inglés: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (enlace permanente para cuando el código auxiliar esté lleno para que aún pueda ver cómo se ve un código auxiliar: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Si estos no están incluidos en lo que desea, tendrá que cargar y analizar el wikitext en sí, lo cual no es una tarea trivial.

hippie
fuente
2
Lo que realmente quería hacer era tomar un volcado completo de los datos en uno de los sitios de Wikitionary que no estaban en inglés y luego convertir el contenido en algo que pudiera usar localmente. Parece una tontería ahora, pero esperaba poder solicitar la lista de todas las palabras y luego bajar sus definiciones / traducciones una por una según sea necesario.
Armentage
1
La solución a la advertencia n. ° 2 es simple: agregue &prop=infoa la consulta y verifique el redirectatributo en la respuesta .
svick
@svick: Sí, es cierto que el n. ° 2 es más fácil de eludir cuando se usa la API, pero estas advertencias básicas también cubren el intento de analizar los archivos de volcado de datos de Wiktionary , aunque esta pregunta no se refiere a ese enfoque.
hippietrail
17

Puede descargar un volcado de datos de Wikitionary . Hay más información en las preguntas frecuentes . Para sus propósitos, el volcado de definiciones es probablemente una mejor opción que el volcado xml.

Kybernetikos
fuente
2
Esos archivos de volcado son masivos y no está claro cuáles descargar (¿todos?). Probablemente no sea lo que la mayoría de la gente busca, solo quieren buscar programáticamente un puñado de palabras.
Cerin
1
Explico qué archivo descargar, es decir, el volcado de definiciones (el directorio de mi enlace es solo versiones diferentes del mismo archivo), y sí, si desea buscar palabras mediante programación, esto es ideal. Si puede garantizar que el programa se ejecutará solo en línea, hay otras opciones, pero sin embargo estoy respondiendo a esta parte de la pregunta original: "Alternativamente, ¿hay alguna forma de que pueda extraer los datos del diccionario que respaldan un Wikcionario?"
kybernetikos
18
El enlace de volcado de definiciones ya no está disponible.
amor vivo
8

Para hacerlo realmente simple, extraiga las palabras del volcado de esta manera:

bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
Benroth
fuente
¿Cómo obtengo una copia de pages-articles.xml.bz2?
Armentage
Es solo un nombre genérico que usé para describir los volcados del formulario LANGwiktionary-DATE-pages-articles.xml.bz2. Vaya al enlace y haga clic en LANGwiktionary(LANG, por ejemplo, 'en', 'de' ...).
benroth
4

Si está usando Python, puede usar WiktionaryParser de Suyash Behera.

Puedes instalarlo por

sudo pip install wiktionaryparser

Uso de ejemplo:

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

Como se mencionó anteriormente, el problema con este enfoque es que Wiktionary proporciona la información sobre todas las palabras de todos los idiomas . Entonces, el enfoque para verificar si existe una página usando la API de Wikipedia no funcionará porque hay muchas páginas para palabras que no están en inglés. Para superar esto, debe analizar cada página para averiguar si hay una sección que describa la palabra en inglés . Analizar wikitexto no es una tarea trivial, aunque en su caso no es tan malo. Para cubrir casi todos los casos, solo necesita verificar si el wikitexto contiene un Englishencabezado. Dependiendo del lenguaje de programación que use, puede encontrar algunas herramientas para construir AST a partir de wikitext. Esto cubrirá la mayoría de los casos, pero no todos porque Wiktionary incluye algunos errores ortográficos comunes.

Como alternativa, puede intentar usar Lingua Robot o algo similar. Lingua Robot analiza el contenido de Wiktionary y lo proporciona como una API REST. La respuesta no vacía significa que la palabra existe. Tenga en cuenta que, a diferencia de Wiktionary, la API en sí no incluye errores ortográficos (al menos en el momento de escribir esta respuesta). Tenga en cuenta también que el Wikcionario contiene no solo las palabras, sino también expresiones de varias palabras.

Roman Kishchenko
fuente
0

Aquí hay un comienzo para analizar datos de etimología y pronunciación:

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

Actualización : aquí hay una esencia con más desarrollo.

Lance Pollard
fuente
gracias, intenté ejecutarlo dentro de la consola devtools del navegador. lo que es langs?
knb
1
actualizado con una esencia, langses de unos miles de líneas, demasiado grande para SO.
Lance Pollard