es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener texto del cuerpo de un volcado de Wikipedia.

Quiero hacer un análisis de texto, así que he descargado una copia de los artículos de Wikipedia. El archivo es un enorme archivo XML con wikitejto dentro de una etiqueta xml. Después de filtrar con expat, todavía veo algunas cosas XML:

xml
Buswell & Lopez (2014) uppslagsord: sang rgyas.

Junto con el marcado wiki. Supongo que el siguiente paso sería pasar cada artículo por un analizador de wiki. Me gustaría que la API a nivel de aplicación se vea así:

c++
std::string get_body_text(std::string_view wikitext);

Así puedo imprimir el texto filtrado en la devolución de llamada de expat. ¿Debo enviar el wikitext a pandoc o intentar encontrar un analizador en C++ para el formato de MediaWiki?

Lo intenté:

bash
cat ~/Skrivbord/svwiki-latest-pages-articles.xml | __targets/wikifilter | pandoc –from MediaWiki

Pero mi máquina no tiene suficiente RAM para que funcione. Supongo que pandoc es similar a un DOM y no a un SAX, o tal vez Haskell no es bueno para conservar memoria.

Actualización: Puedo obtener un rendimiento razonable si paso bloques de múltiples artículos (no todos a la vez) a través de pandoc. Ahora el problema es que tengo que eliminar todas las referencias a las plantillas. Para mi caso de uso, probablemente sea mejor reemplazar las plantillas por una cadena vacía.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c++ y MediaWiki, mi recomendación sería utilizar un analizador de C++ para el formato de MediaWiki en lugar de hacer pasar el wikitexto a pandoc. Esta sería una solución más eficiente y rápida para tus necesidades de análisis de texto.

    Un analizador que podrías utilizar es el Wikimedia Parser. Es una biblioteca de C++ que puede analizar el formato de MediaWiki y convertirlo a HTML o texto plano. Puedes integrarlo fácilmente en tu aplicación incluyendo los archivos de cabecera necesarios y ligando con la biblioteca.

    Una vez que hayas analizado el formato de MediaWiki con el Wikimedia Parser, puedes filtrar las etiquetas XML y cualquier otro texto no deseado utilizando expresiones regulares u otras funciones de manipulación de cadenas en C++.

    En cuanto a tu API a nivel de aplicación, podrías definir una función llamada “obtener_texto_cuerpo” que reciba una cadena de wikitexto y devuelva una cadena de texto plano. Aquí tienes una implementación de muestra:

    “`c++
    #include
    #include
    #include <wikimediaparser.h>

    std::string obtener_texto_cuerpo(std::string_view wikitexto) {
    // Analizar el wikitexto con el Wikimedia Parser
    WikiText parsedText = WikimediaParser::parse(wikitexto.data());

    // Obtener el texto plano del contenido analizado
    std::string textoPlano = parsedText.plainText();
    
    // Filtrar el texto no deseado utilizando expresiones regulares u otras funciones de manipulación de cadenas
    // Por ejemplo, para eliminar todas las etiquetas XML:
    std::regex xmlRegex("<.*?>");
    textoPlano = std::regex_replace(textoPlano, xmlRegex, "");
    
    return textoPlano;
    

    }

    int main() {
    // Uso de ejemplo
    std::string wikitexto = “Buswell & Lopez (2014) uppslagsord: sang rgyas. Texto de un artículo con [[enlaces]] y {{plantillas}}.”;
    std::string textoPlano = obtener_texto_cuerpo(wikitexto);
    std::cout << textoPlano << std::endl;
    // Salida: “Texto de un artículo con enlaces y .”
    return 0;
    }
    “`

    Esta implementación primero analiza el wikitexto con el Wikimedia Parser, luego filtra cualquier etiqueta XML no deseada utilizando una expresión regular. El texto plano resultante es devuelto por la función y puede ser impreso o utilizado como desees.</wikimediaparser.h>

Comments are closed.