有没有办法只返回维基百科文章中的(干净)文字?

时间:2013-12-02 22:33:55

标签: java formatting wikipedia

我的总体目标是在没有任何标记的情况下仅从维基百科文章中返回干净的句子。显然,有一些方法可以返回JSON,XML等,但这些方法都充满了标记。到目前为止,我最好的方法是返回维基百科所称的raw。例如,以下链接返回“钢铁侠”页面的raw格式:

  

http://en.wikipedia.org/w/index.php?title=Iron%20Man&action=raw

以下是返回内容的摘录:

...//I am truncating some markup at the beginning here. 
|creative_team_month =
|creative_team_year =
|creators_series =
|TPB =
|ISBN =
|TPB# =
|ISBN# =
|nonUS =
}}
'''Iron Man''' is a fictional character, a [[superhero]] that appears in\\
[[comic book]]s published by [[Marvel Comics]]. 
...//I am truncating here everything until the end. 

我坚持使用raw格式,因为我发现它最容易清理。虽然到目前为止我用Java编写的内容很清楚,但是有很多案例可以解决。这些案例包括维基百科时间轴,维基百科图片和其他维基百科属性的标记,这些属性未出现在所有文章中。我再次使用Java(特别是我正在使用Tomcat Web应用程序)。

问题:是否有更好的方法可以从维基百科的文章中获得干净,易读的句子?也许有人已经建立了一个我无法找到的库?

如果不清楚的话,我会很乐意编辑我的问题以提供关于清洁和人类可读的含义的详细信息。

我当前清理raw格式化文本的Java方法如下:

public String cleanRaw(String input){
    //Next three lines attempt to get rid of references.
    input= input.replaceAll("<ref>.*?</ref>","");
    input= input.replaceAll("<ref .*?</ref>","");
    input= input.replaceAll("<ref .*?/>","");

    input= input.replaceAll("==[^=]*==", "");
    //I found that anything between curly braces is not needed. 
    while (input.indexOf("{{") >= 0){
        int prevLength= input.length();
        input= input.replaceAll("\\{\\{[^{}]*\\}\\}", "");
        if (prevLength == input.length()){
            break;
        }
    }
    //Next line gets rid of links to other Wikipedia pages.
    input= input.replaceAll("\\[\\[([^]]*[|])?([^]]*?)\\]\\]", "$2");
    input= input.replaceAll("<!--.*?-->","");
    input= input.replaceAll("[^A-Za-z0-9., ]", "");

    return input;
}

1 个答案:

答案 0 :(得分:2)

我发现了一些可能有用的项目。您可以通过在Java代码中包含Javascript引擎来运行第一个。

<强> txtwiki.js 用于将MediaWiki标记转换为纯文本的JavaScript库。 https://github.com/joaomsa/txtwiki.js

<强> WikiExtractor 一个Python脚本,用于从Wikipedia数据库转储中提取和清除文本 http://medialab.di.unipi.it/wiki/Wikipedia_Extractor

来源: http://www.mediawiki.org/wiki/Alternative_parsers