使用samppipe提取非英文文章

时间:2012-02-13 11:51:13

标签: java html text-extraction

我正在尝试使用boilerpipe java库,从一组网站中提取新闻文章。 它适用于英语文本,但对于带有特殊字符的文本,例如带有重音符号(história)的单词,此特殊字符无法正确提取。我认为这是一个编码问题。

在boilerpipe faq中,它说“如果你提取非英文文本,你可能需要更改一些参数”,然后引用paper。我在本文中找不到任何解决方案。

我的问题是,在使用套管管时我是否可以指定编码?有没有办法绕过来正确地获取文本?

我如何使用图书馆: (基于URL的第一次尝试):

URL url = new URL(link);
String article = ArticleExtractor.INSTANCE.getText(url);

(HTLM源代码中的第二个)

String article = ArticleExtractor.INSTANCE.getText(html_page_as_string);

6 个答案:

答案 0 :(得分:2)

您不必修改内部Boilerpipe类。

只需将InputSource对象传递给ArticleExtractor.INSTANCE.getText()方法并强制对该对象进行编码即可。例如:

URL url = new URL("http://some-page-with-utf8-encodeing.tld");

InputSource is = new InputSource();
is.setEncoding("UTF-8");
is.setByteStream(url.openStream());

String text = ArticleExtractor.INSTANCE.getText(is);

问候!

答案 1 :(得分:1)

嗯,从我看到的,当你这样使用它时,库会自动选择要使用的编码。来自HTMLFetcher来源:

public static HTMLDocument fetch(final URL url) throws IOException {
    final URLConnection conn = url.openConnection();
    final String ct = conn.getContentType();

    Charset cs = Charset.forName("Cp1252");
    if (ct != null) {
        Matcher m = PAT_CHARSET.matcher(ct);
        if(m.find()) {
            final String charset = m.group(1);
            try {
                cs = Charset.forName(charset);
            } catch (UnsupportedCharsetException e) {
                // keep default
            }
        }
    }

尝试稍微调试一下代码,从ArticleExtractor.getText(URL)开始,看看是否可以覆盖编码

答案 2 :(得分:1)

好的,得到了​​解决方案。 正如Andrei所说,我必须更改类HTMLFecther,它位于de.l3s.boilerpipe.sax包中 我所做的是将所有提取的文本转换为UTF-8。 在fetch函数结束时,我必须添加两行,并更改最后一行:

final byte[] data = bos.toByteArray(); //stays the same
byte[] utf8 = new String(data, cs.displayName()).getBytes("UTF-8"); //new one (convertion)
cs = Charset.forName("UTF-8"); //set the charset to UFT-8
return new HTMLDocument(utf8, cs); // edited line

答案 3 :(得分:1)

Boilerpipe的ArticleExtractor使用了一些专门针对英语量身定制的算法 - 测量平均短语中的单词数量等。在任何比英语更加或更简洁的语言中(即:所有其他语言),这些算法都不太准确

此外,图书馆使用一些英语短语来尝试找到文章的结尾(评论,发表评论,发表你的意见等),这显然不适用于其他语言。

这并不是说图书馆会完全失败 - 只要知道在非英语语言中可能需要进行一些修改以获得良好的结果。

答案 4 :(得分:1)

<强>爪哇:

import java.net.URL;

import org.xml.sax.InputSource;

import de.l3s.boilerpipe.extractors.ArticleExtractor;

public class Boilerpipe {

    public static void main(String[] args) {
        try{
            URL url = new URL("http://www.azeri.ru/az/traditions/kuraj_pehlevanov/");

            InputSource is = new InputSource();
            is.setEncoding("UTF-8");
            is.setByteStream(url.openStream());

            String text = ArticleExtractor.INSTANCE.getText(is);
            System.out.println(text);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

<强>蚀: 运行&gt;运行配置&gt;常用标签。将Encoding设置为Other(UTF-8),然后单击Run。

enter image description here

答案 5 :(得分:0)

我遇到了一些问题; cnr解决方案很有效。只需将UTF-8编码更改为ISO-8859-1即可。感谢的

URL url = new URL("http://some-page-with-utf8-encodeing.tld");
InputSource is = new InputSource();
is.setEncoding("ISO-8859-1");
is.setByteStream(url.openStream());

String text = ArticleExtractor.INSTANCE.getText(is);