Je suis en train d'indexer les dumps de Wikipédia. Mon analyseur SAX crée des objets Article pour le XML avec seulement les champs qui m'intéressent, puis les envoie à mon ArticleSink, qui produit des Documents Lucene.
Je veux filtrer les pages spéciales/méta comme celles préfixées par Catégorie:
ou Wikipedia:
, donc j'ai créé un tableau de ces préfixes et je teste le titre de chaque page contre ce tableau dans mon ArticleSink, en utilisant article.getTitle.startsWith(prefix)
. En anglais, tout fonctionne bien, j'obtiens un index Lucene avec toutes les pages sauf celles correspondant aux préfixes.
En français, les préfixes sans accent fonctionnent aussi (c'est-à-dire filtrent les pages correspondantes), certains des préfixes accentués ne fonctionnent pas du tout (comme Catégorie:
), et certains fonctionnent la plupart du temps mais échouent sur certaines pages (comme Wikipédia:
) mais je ne peux pas voir de différence entre les lignes correspondantes (avec less
).
Je ne peux pas vraiment inspecter toutes les différences dans le fichier en raison de sa taille (5 Go), mais il semble qu'il s'agisse d'un XML UTF-8 correct. Si je prends une portion du fichier avec grep
ou head
, les accents sont corrects (même sur les pages incriminées, le Catégorie:something
est correctement affiché par grep
). D'autre part, quand je recrée un XML wiki en coupant le fichier original avec tail/head, la même page (ici Catégorie:Rock par ville
) est filtrée dans le petit fichier, pas dans l'original…
Des idées ?
Alternatives que j'ai essayées :
Obtenir le fichier (les lignes commentées ont été essayées sans succès*) :
FileInputStream fis = new FileInputStream(new File(xmlFileName));
//ReaderInputStream ris = ReaderInputStream.forceEncodingInputStream(fis, "UTF-8" );
//(fonction personnalisée ouvrant le flux,
//le lisant en UTF-8 dans un Reader et renvoyant un autre flux de bits)
//InputSource is = new InputSource( fis ); is.setEncoding("UTF-8");
parser.parse(fis, handler);
Préfixes filtrés :
ignoredPrefix = new String[] {"Catégorie:", "Modèle:", "Wikipédia:",
"Cat\uFFFDgorie:", "Mod\uFFFDle:", "Wikip\uFFFDdia:", //caractère non valide
"Catégorie:", "Modèle:", "Wikipédia:", // UTF-8 comme ISO-8859-1
"Image:", "Portail:", "Fichier:", "Aide:", "Projet:"}; // ceux-là fonctionnent toujours
* ERRATUM
En fait, c'est de ma faute, celle que j'ai essayée fonctionne, j'ai testé le mauvais index :
InputSource is = new InputSource( fis );
is.setEncoding("UTF-8"); // forcer l'interprétation en UTF-8
parser.parse(fis, handler);