2012-02-13 36 views
6

Tôi đang cố gắng sử dụng thư viện java boilerpipe để trích xuất các bài viết tin tức từ một tập hợp các trang web. Nó hoạt động tốt cho các văn bản bằng tiếng Anh, nhưng đối với văn bản có các ký tự đặc biệt, ví dụ, các từ có dấu trọng âm (história), các ký tự đặc biệt này không được trích xuất chính xác. Tôi nghĩ rằng đó là một vấn đề mã hóa.Sử dụng nồi hơi để trích xuất các bài viết không phải tiếng Anh

Trong faq của nồi hơi, nó nói "Nếu bạn trích xuất văn bản không phải tiếng Anh, bạn có thể cần phải thay đổi một số thông số" và sau đó đề cập đến một số paper. Tôi không tìm thấy giải pháp nào trong bài báo này.

Câu hỏi của tôi là, có bất kỳ thông số nào khi sử dụng nồi hơi nơi tôi có thể chỉ định mã hóa không? Có cách nào để đi xung quanh và nhận được các văn bản chính xác?

Làm thế nào tôi đang sử dụng thư viện: (lần đầu tiên cố gắng dựa trên URL):

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

(thứ hai trên mã nguồn HTLM)

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

Trả lời

1

Ok, có một giải pháp. Như Andrei đã nói, tôi phải thay đổi lớp HTMLFecther, nằm trong gói de.l3s.boilerpipe.sax Những gì tôi đã làm là chuyển đổi tất cả văn bản đã được tìm nạp thành UTF-8. Vào cuối của lấy chức năng, tôi đã phải thêm hai dòng, và thay đổi mới nhất:

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 
1

Vâng, từ những gì tôi nhìn thấy , khi bạn sử dụng nó như vậy, thư viện sẽ tự động chọn mã hóa nào sẽ sử dụng. Từ nguồn 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 
      } 
     } 
    } 

Hãy thử gỡ lỗi mã của họ một chút, bắt đầu với ArticleExtractor.getText(URL), và xem nếu bạn có thể ghi đè mã hoá

+0

Cảm ơn câu trả lời của bạn. Tôi xin lỗi vì chỉ chú ý đến nó bây giờ nhưng tôi đã bị mắc kẹt trong một dự án khác. Tôi đã thử in mã hóa được đặt trên biến cs sau đoạn mã này và kết quả luôn là ISO-8859-1. Tôi cũng đã cố gắng để buộc các mã hóa được UTF-8, nhưng không có kết quả tốt hơn. Sự cố phải nằm trong một trong các chuyển đổi, thành HTMLDocument, thành TextDocument, v.v. Nhưng tôi đang gặp sự cố khi in nội dung văn bản của họ. Bất kỳ ý tưởng? Cảm ơn một lần nữa. –

+0

Andrei, bạn đã đúng. Tôi đã cố gắng phức tạp rất nhiều, nhưng cuối cùng nó là một giải pháp rất đơn giản. Cảm ơn một lần nữa, tôi xin lỗi tôi không thể upvote bạn được nêu ra. –

2

Bạn không cần phải sửa đổi nội Boilerpipe lớp.

Chỉ cần vượt qua InputSource đối tượng vào phương pháp ArticleExtractor.INSTANCE.getText() và mã hóa lực trên đối tượng đó. Ví dụ:

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

Kính trọng!

+1

Trước tiên, xin lỗi phải mất quá nhiều thời gian để nhận xét câu trả lời của bạn và cảm ơn bạn đã cho nó. Thật không may nó không hoạt động đối với tôi. Tôi vừa thử nó, và tất cả các chữ cái với dấu trọng âm trở thành '?' khi tôi in bài viết đã trích xuất. Tôi sẽ vẫn còn với các giải pháp trước đó cho bây giờ. –

+0

cảm ơn rất nhiều. bạn đã khắc phục sự cố của tôi khi hiển thị tiếng Ả Rập –

0

Tôi gặp sự cố; giải pháp cnr hoạt động tốt. Chỉ cần thay đổi mã hóa UTF-8 thành 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); 
1

ArticleExtractor Boilerpipe của Thank của sử dụng một số thuật toán đã được thiết kế đặc biệt để Tiếng Anh - đo số từ trong cụm từ trung bình, vv Trong bất kỳ ngôn ngữ mà là nhiều hơn hoặc ít tiết ngoài tiếng Anh (ví dụ: mọi ngôn ngữ khác) những các thuật toán sẽ kém chính xác hơn.

Ngoài ra, thư viện sử dụng một số cụm từ tiếng Anh để thử và tìm phần cuối của bài viết (nhận xét, đăng nhận xét, nói, v.v.) rõ ràng không hoạt động ở các ngôn ngữ khác.

Điều này không có nghĩa là thư viện sẽ hoàn toàn không thành công - chỉ cần lưu ý rằng một số sửa đổi có thể cần thiết cho kết quả tốt trong các ngôn ngữ không phải tiếng Anh.

1

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: Run> Run Configurations> Tab Common. Đặt Mã hóa thành Khác (UTF-8), sau đó bấm Chạy.

enter image description here

Các vấn đề liên quan