2010-05-19 18 views
7

J'ai téléchargé wikipedia dump et je veux maintenant supprimer le balisage wikipedia dans le contenu de chaque page. J'ai essayé d'écrire des expressions régulières mais elles sont trop nombreuses à gérer. J'ai trouvé une librairie python mais j'ai besoin d'une librairie java parce que je veux l'intégrer dans mon code.Wikipedia: bibliothèque Java pour supprimer le retrait du texte wikipedia

Merci.

+0

Nuage vous publiez un échantillon d'une page montrant les annotations que vous souhaitez supprimer? – bakkal

Répondre

9

Faites-en deux étapes:

  1. laisser un certain outil existant convertir le balisage MediaWiki en HTML brut;
  2. convertir le HTML brut en texte.

La démonstration suivante:

import net.java.textilej.parser.MarkupParser; 
import net.java.textilej.parser.builder.HtmlDocumentBuilder; 
import net.java.textilej.parser.markup.mediawiki.MediaWikiDialect; 
import javax.swing.text.html.HTMLEditorKit; 
import javax.swing.text.html.parser.ParserDelegator; 
import java.io.StringReader; 
import java.io.StringWriter; 

public class Test { 

    public static void main(String[] args) throws Exception { 

     String markup = "This is ''italic'' and '''that''' is bold. \n"+ 
       "=Header 1=\n"+ 
       "a list: \n* item A \n* item B \n* item C"; 

     StringWriter writer = new StringWriter(); 

     HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer); 
     builder.setEmitAsDocument(false); 

     MarkupParser parser = new MarkupParser(new MediaWikiDialect()); 
     parser.setBuilder(builder); 
     parser.parse(markup); 

     final String html = writer.toString(); 
     final StringBuilder cleaned = new StringBuilder(); 

     HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() { 
       public void handleText(char[] data, int pos) { 
        cleaned.append(new String(data)).append(' '); 
       } 
     }; 
     new ParserDelegator().parse(new StringReader(html), callback, false); 

     System.out.println(markup); 
     System.out.println("---------------------------"); 
     System.out.println(html); 
     System.out.println("---------------------------"); 
     System.out.println(cleaned); 
    } 
} 

produit:

This is ''italic'' and '''that''' is bold. 
=Header 1= 
a list: 
* item A 
* item B 
* item C 
--------------------------- 
<p>This is <i>italic</i> and <b>that</b> is bold. </p><h1 id="Header1">Header 1</h1><p>a list: </p><ul><li>item A </li><li>item B </li><li>item C</li></ul> 
--------------------------- 
This is italic and that is bold. Header 1 a list: item A item B item C 
+0

Où téléchargez-vous les paquets java que vous importez? – jjxtra

+0

@JJC, essayez ici: http://download.java.net/maven/2/net/java/textile-j/2.2/ –

+0

Je vais essayer, merci! – jjxtra

1

Mylyn WikiText peut convertir diverses syntaxes Wiki en HTML et d'autres formats. Il prend également en charge la syntaxe MediaWiki, qui est ce que Wikipédia utilise. Bien que Mylyn WikiText soit principalement un plugin Eclipse, il est également available as standalone library.

+0

J'ai juste besoin d'une fonction qui peut supprimer le balisage wiki du contenu. Je ne sais pas comment utiliser mylyn pour supprimer le balisage. Peux-tu me dire comment le faire. – Boolean

+0

@Algorist: Mylyn WikiText ne supprime pas le balisage, il convertit dans d'autres formats. Je suis désolé, j'ai mal lu votre question. –

2

Si vous avez besoin de texte brut, vous devez utiliser la bibliothèque WikiClean https://github.com/lintool/wikiclean.

J'ai eu le même problème et il semble que c'était la seule solution efficace qui a fonctionné pour moi dans Java.

Il y a deux usecases:

1) Lorsque vous avez le texte pas au format XML, vous devez ajouter des balises xml nécessaires pour faire ce traitement. Supposons que vous traitiez un fichier XML plus tôt, et que vous ayez maintenant le contenu sans structure XML, alors vous ajoutez simplement xmlStartTag et xmlEndTag comme dans le code ci-dessous, et il le traite.

String xmlStartTag = "<text xml:space=\"preserve\">"; 
String xmlEndTag = "</text>"; 
String articleWithXml = xmlStartTag + article.getText() + xmlEndTag; 
WikiClean cleaner = new WikiClean.Builder().build(); 
String plainWikiText = cleaner.clean(articleWithXml); 

2) Lorsque vous lisez le fichier de vidage directement Wikipedia (fichier xml), dans ce cas, vous venez de passer à travers le fichier et passe par.

WikiClean cleaner = new WikiClean.Builder().build(); 
String plainWikiText = cleaner.clean(XMLFileContents); 
+0

Bienvenue dans Stack Overflow! La question n'est pas sur le sujet pour Stack Overflow tel que défini dans [help]. S'il vous plaît ne répondez pas à ces questions; Au lieu de cela, vous devriez les signaler à l'attention et ils seront fermés ou migrés de façon appropriée. –

+3

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [De l'examen] (/ review/low-quality-posts/18533404) – Bhuwan

+0

Merci @Bhuwan. J'ai mis à jour ma réponse en fonction de votre suggestion. –