Фильтрация дампа XML из Википедии: ошибка на некоторых акцентах - PullRequest
3 голосов
/ 31 марта 2010

Я пытаюсь индексировать дампы Википедии . Мой синтаксический анализатор SAX создает объекты Article для XML только с теми полями, которые мне нужны, а затем отправляет его на мой ArticleSink, который создает документы Lucene.

Я хочу отфильтровать специальные / мета-страницы, например, с префиксом Category: или Wikipedia:, поэтому я создал массив этих префиксов и проверил заголовок каждой страницы по этому массиву в моем ArticleSink, используя article.getTitle.startsWith(prefix). На английском все работает нормально, я получаю индекс Lucene со всеми страницами за исключением соответствующих префиксов.

На французском языке префиксы без акцента также работают (т. Е. Фильтруют соответствующие страницы), некоторые из акцентированных префиксов не работают вообще (например, Catégorie:), а некоторые работают большую часть времени, но в некоторых не работают страниц (например, Wikipédia:), но я не вижу никакой разницы между соответствующими строками (в less).

Я не могу проверить все различия в файле из-за его размера (5 ГБ), но он выглядит как правильный XML UTF-8. Если я беру часть файла, используя grep или head, акценты правильные (даже на инкриминированных страницах <title>Catégorie:something</title> правильно отображается grep). С другой стороны, когда я воссоздаю исходный XML-файл вики-файла путем вырезания хвоста / головы, эта же страница (здесь Catégorie:Rock par ville) фильтруется в небольшом файле, а не в оригинальном…

Есть идеи?

Альтернативы, которые я пробовал:

Получение файла (закомментированные строки были опробованы без успеха *):

FileInputStream fis = new FileInputStream(new File(xmlFileName));
//ReaderInputStream ris = ReaderInputStream.forceEncodingInputStream(fis, "UTF-8" );
//(custom function opening the stream, 
//reading it as UFT-8 into a Reader and returning another byte stream)
//InputSource is = new InputSource( fis ); is.setEncoding("UTF-8");
parser.parse(fis, handler);

Отфильтрованные префиксы:

ignoredPrefix = new String[] {"Catégorie:", "Modèle:", "Wikipédia:",
    "Cat\uFFFDgorie:", "Mod\uFFFDle:", "Wikip\uFFFDdia:", //invalid char
    "Catégorie:", "Modèle:", "Wikipédia:", // UTF-8 as ISO-8859-1
    "Image:", "Portail:", "Fichier:", "Aide:", "Projet:"}; // those last always work

* ERRATUM

На самом деле, плохо, что я попробовал работать, я проверил неправильный индекс:

InputSource is = new InputSource( fis );
is.setEncoding("UTF-8"); // force UTF-8 interpretation
parser.parse(fis, handler);

1 Ответ

2 голосов
/ 31 марта 2010

Поскольку вы пишете префиксы в виде простых строк в исходный файл, вы хотите сохранить этот файл .java в UTF-8 (или любую другую кодировку, которая поддерживает специальные символы вы используете). Затем, однако, вы должны указать компилятору, в какой кодировке находится файл, с флагом -encoding:

javac -encoding utf-8 *.java

Для источника XML вы можете попробовать

Reader r = new InputStreamReader(new FileInputStream(xmlFileName), "UTF-8");

InputStreams не имеют дело с кодировками, так как они основаны на байтах, а не на символах. Итак, здесь мы создаем Reader из FileInputStream - последний (поток) не знает о кодировках, а первый (читатель) знает, потому что мы даем кодировку в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...