繁体   English   中英

使用samppipe提取非英文文章

[英]Using boilerpipe to extract non-english articles

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

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

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

我如何使用该库:(基于URL的第一次尝试):

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

(关于HTLM源代码的第二个)

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

您不必修改内部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);

问候!

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

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

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

Java的:

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();
        }
    }

}

Eclipse:运行>运行配置>公共选项卡。 将Encoding设置为Other(UTF-8),然后单击Run。

在此输入图像描述

好吧,从我看到的,当你这样使用它时,库将自动选择要使用的编码。 从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) ,看看是否可以覆盖编码

好的,有一个解决方案。 正如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

我遇到了一些问题; 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM