[英]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.