我正在尝试索引Wikpedia dumps。我的SAX解析器仅使用我关心的字段为XML创建Article对象,然后将其发送到生成Lucene文档的ArticleSink。过滤维基百科的XML转储:某些口音错误
我要过滤特殊/元页面,如那些具有Category:
或Wikipedia:
前缀,所以我做了那些前缀的阵列和测试每个页面的对这个数组称号,我ArticleSink,使用article.getTitle.startsWith(prefix)
。在英语中,一切正常,我得到一个Lucene索引,除了匹配的前缀以外,所有页面都有。
在法语中,没有重音的前缀也可以工作(即过滤相应的页面),某些重音前缀完全不起作用(如Catégorie:
),有些在大部分时间工作,但在某些页面上失败(如Wikipédia:
),但我看不到相应的行之间有任何区别(在less
)。
由于其大小(5 GB),我无法真正检查文件中的所有差异,但它看起来像一个正确的UTF-8 XML。如果我使用grep
或head
获取文件的一部分,那么重音是正确的(即使在有文件的页面上,<title>Catégorie:something</title>
正确显示为grep
)。另一方面,当我通过尾部/剪切原始文件来修正wiki XML时,同一页面(这里是Catégorie:Rock par ville
)在小文件中被过滤,而不是在原始文件中...
任何想法?
替代我想:
获取文件(注释行进行了尝试 wihtout成功 *):
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
*勘误
其实,是我不好,是一个我想工作,我测试了错误的指标:
InputSource is = new InputSource(fis);
is.setEncoding("UTF-8"); // force UTF-8 interpretation
parser.parse(fis, handler);
顺便提一下,维基百科XML文件在开头为标签指定了这些特殊前缀。通过SAX处理程序自动加载它们并没有改变剩下的问题。 –
2010-03-31 16:46:46