【问题标题】:Using boilerpipe to extract non-english articles使用boilerpipe提取非英文文章
【发布时间】:2012-02-13 11:51:13
【问题描述】:

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

在锅炉管常见问题解答中,它说“如果您提取非英文文本,您可能需要更改一些参数”,然后引用 paper。我在这篇论文中没有找到解决方案。

我的问题是,使用锅炉管时是否有任何参数可以指定编码?有什么办法可以正确获取文本吗?

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

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

(HTLM源代码上的第二个)

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

【问题讨论】:

    标签: java html text-extraction


    【解决方案1】:

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

    问候!

    【讨论】:

    • 首先,很抱歉花了这么长时间来评论您的答案,并感谢您给予它。不幸的是,它对我不起作用。我刚试了一下,所有带重音符号的字母都变成了“?”当我打印提取的文章时。我现在将继续使用以前的解决方案。
    【解决方案2】:

    嗯,据我所知,当您这样使用它时,库将自动选择要使用的编码。来自 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) 开始,看看是否可以覆盖编码

    【讨论】:

    • 感谢您的回答。我很抱歉现在只关注它,但我被困在另一个项目中。我尝试在这段代码之后打印在变量 cs 上设置的编码,结果始终是 ISO-8859-1。我还尝试强制编码为 UTF-8,但没有得到更好的结果。问题必须在转换之一,到 HTMLDocument,到 TextDocument 等。但我在打印他们的文本内容时遇到了一些麻烦。有任何想法吗?再次感谢。
    • 安德烈,你是对的。我试图复杂化很多,但最终这是一个非常简单的解决方案。再次感谢,对不起,我还不能投票给你。
    【解决方案3】:

    好的,找到解决方案了。 正如安德烈所说,我必须更改类 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
    

    【讨论】:

      【解决方案4】:

      Boilerpipe 的 ArticleExtractor 使用了一些专门针对英语量身定制的算法 - 测量平均短语中的单词数量等。在任何比英语或多或少冗长的语言(即:所有其他语言)中,这些算法的准确性都会降低.

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

      这并不是说该库会彻底失败 - 只是要注意,可能需要进行一些修改才能在非英语语言中获得良好的结果。

      【讨论】:

        【解决方案5】:

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

        日食: 运行 > 运行配置 > 常用选项卡。将编码设置为其他(UTF-8),然后单击运行。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-07
            • 1970-01-01
            • 2015-10-01
            • 1970-01-01
            相关资源
            最近更新 更多