代码之家  ›  专栏  ›  技术社区  ›  instanceof me

过滤wikipedia的xml转储:某些重音错误

  •  3
  • instanceof me  · 技术社区  · 16 年前

    我在试着索引 Wikpedia dumps . 我的sax解析器只使用我关心的字段为xml生成项目对象,然后将其发送到生成lucene文档的articlesink。

    我想过滤特殊/元页面,比如那些前缀为 Category: Wikipedia: ,所以我用这些前缀组成了一个数组,并使用 article.getTitle.startsWith(prefix) . 在英语中,一切都很好,我得到一个lucene索引,除了匹配的前缀之外,所有的页面都有。

    在法语中,没有重音的前缀也可以工作(即过滤相应的页面),一些重音的前缀根本不工作(比如 Catégorie: ,有些在大多数情况下工作,但在某些页面上失败(例如 Wikipédia: )但我看不出相应的行之间有什么区别 less )

    由于文件的大小(5gb),我不能真正检查文件中的所有差异,但它看起来像一个正确的utf-8xml。如果我用 grep head ,重音是正确的(即使在有罪的页面上, <title>Catégorie:something</title> 由正确显示 格雷普 )。另一方面,当我通过尾部/头部剪切原始文件来直接创建wiki 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
    

    *勘误表

    实际上,我的错,我试过的那个,我测试了错误的索引:

    InputSource is = new InputSource( fis );
    is.setEncoding("UTF-8"); // force UTF-8 interpretation
    parser.parse(fis, handler);
    
    1 回复  |  直到 12 年前
        1
  •  2
  •   Thomas    12 年前

    由于您将前缀作为纯字符串写入源文件中,因此要确保保存 爪哇 文件也是utf-8格式的(或任何其他支持您正在使用的特殊字符的编码)。但是,您必须告诉编译器该文件与 -encoding 旗帜:

    javac -encoding utf-8 *.java
    

    对于XML源,您可以尝试

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

    inputstreams不处理编码,因为它们是基于字节的,而不是基于字符的。因此,在这里,我们从一个fileinputstream创建一个读卡器-后者(stream)不知道编码,但前者(reader)知道,因为我们在构造函数中给出编码。