我正在尝试使用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);
答案 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。
答案 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);