2012-05-18 28 views
7

Có ai biết tìm một chút cách sử dụng chú thích dbpedia trong java hoặc scala không? Hoặc bất cứ ai có thể giải thích cách nó được thực hiện? Tôi không thể tìm thấy bất kỳ thông tin nào về việc này ...sử dụng chú thích dbpedia trong java hoặc scala

Trả lời

4

Trang điểm DBpedia wiki sẽ là một nơi tốt để bắt đầu.

Và tôi tin rằng trang installation đã liệt kê các cách phổ biến nhất (sử dụng bình, hoặc thiết lập dịch vụ web) để sử dụng ứng dụng.

Hướng dẫn này bao gồm hướng dẫn trên using the Java/Scala API bằng cài đặt của riêng bạn hoặc gọi cho Dịch vụ web.

Có một số dữ liệu bổ sung cần thiết để tải xuống để chạy máy chủ của riêng bạn cho dịch vụ đầy đủ, thời gian tốt để pha cà phê cho chính bạn.

4

bạn cần tải xuống chú thích dbpedia (tệp jar) sau đó bạn có thể sử dụng hai lớp tiếp theo (tác giả pablomendes) tôi chỉ thực hiện một số thay đổi.

public class db extends AnnotationClient { 

    //private final static String API_URL = "http://jodaiber.dyndns.org:2222/"; 
    private static String API_URL = "http://spotlight.dbpedia.org:80/"; 
    private static double CONFIDENCE = 0.0; 
    private static int  SUPPORT = 0; 
    private static String powered_by ="non"; 
    private static String spotter ="CoOccurrenceBasedSelector";//"LingPipeSpotter"=Annotate all spots 
               //AtLeastOneNounSelector"=No verbs and adjs.  
               //"CoOccurrenceBasedSelector" =No 'common words' 
               //"NESpotter"=Only Per.,Org.,Loc. 
    private static String disambiguator ="Default";//Default ;Occurrences=Occurrence-centric;Document=Document-centric 
    private static String showScores ="yes"; 

@SuppressWarnings("static-access") 
public void configiration(double CONFIDENCE,int SUPPORT, 
          String powered_by,String spotter,String disambiguator,String showScores){ 
    this.CONFIDENCE=CONFIDENCE; 
    this.SUPPORT=SUPPORT; 
    this.powered_by=powered_by; 
    this.spotter=spotter; 
    this.disambiguator=disambiguator; 
    this.showScores=showScores; 

} 
    public List<DBpediaResource> extract(Text text) throws AnnotationException { 
     LOG.info("Querying API."); 
     String spotlightResponse; 
     try { 
      String Query=API_URL + "rest/annotate/?" + 
        "confidence=" + CONFIDENCE 
        + "&support=" + SUPPORT 
        + "&spotter=" + spotter 
        + "&disambiguator=" + disambiguator 
        + "&showScores=" + showScores 
        + "&powered_by=" + powered_by 
        + "&text=" + URLEncoder.encode(text.text(), "utf-8"); 
      LOG.info(Query); 

      GetMethod getMethod = new GetMethod(Query); 
      getMethod.addRequestHeader(new Header("Accept", "application/json")); 
      spotlightResponse = request(getMethod); 

     } catch (UnsupportedEncodingException e) { 
      throw new AnnotationException("Could not encode text.", e); 
     } 
     assert  spotlightResponse != null; 
     JSONObject resultJSON   = null; 
     JSONArray entities   = null; 

     try {     
      resultJSON = new JSONObject(spotlightResponse); 
      entities = resultJSON.getJSONArray("Resources"); 

     } catch (JSONException e) { 
      //throw new AnnotationException("Received invalid response from DBpedia Spotlight API."); 
     } 

     LinkedList<DBpediaResource> resources = new LinkedList<DBpediaResource>(); 
     if(entities!=null) 
     for(int i = 0; i < entities.length(); i++) { 
      try { 
       JSONObject entity = entities.getJSONObject(i); 
       resources.add(
         new DBpediaResource(entity.getString("@URI"), 
         Integer.parseInt(entity.getString("@support")))); 
      } catch (JSONException e) { 
       LOG.error("JSON exception "+e); 
      } 
     } 
     return resources; 
    } 

} 

lớp thứ hai

/** 
* @author pablomendes 
*/ 
public abstract class AnnotationClient { 

    public Logger LOG = Logger.getLogger(this.getClass()); 
    private List<String> RES = new ArrayList<String>(); 

    // Create an instance of HttpClient. 
    private static HttpClient client = new HttpClient(); 
    public List<String> getResu(){ 
     return RES;  
    } 

    public String request(HttpMethod method) throws AnnotationException { 
     String response = null; 
     // Provide custom retry handler is necessary 
     method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
       new DefaultHttpMethodRetryHandler(3, false)); 
     try { 
      // Execute the method. 
      int statusCode = client.executeMethod(method); 
      if (statusCode != HttpStatus.SC_OK) { 
       LOG.error("Method failed: " + method.getStatusLine()); 
      } 

      // Read the response body. 
      byte[] responseBody = method.getResponseBody(); //TODO Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended. 

      // Deal with the response. 
      // Use caution: ensure correct character encoding and is not binary data 
      response = new String(responseBody); 

     } catch (HttpException e) { 
      LOG.error("Fatal protocol violation: " + e.getMessage()); 
      throw new AnnotationException("Protocol error executing HTTP request.",e); 
     } catch (IOException e) { 
      LOG.error("Fatal transport error: " + e.getMessage()); 
      LOG.error(method.getQueryString()); 
      throw new AnnotationException("Transport error executing HTTP request.",e); 
     } finally { 
      // Release the connection. 
      method.releaseConnection(); 
     } 
     return response; 

    } 

    protected static String readFileAsString(String filePath) throws java.io.IOException{ 
     return readFileAsString(new File(filePath)); 
    } 

    protected static String readFileAsString(File file) throws IOException { 
     byte[] buffer = new byte[(int) file.length()]; 
     @SuppressWarnings("resource") 
     BufferedInputStream f = new BufferedInputStream(new FileInputStream(file)); 
     f.read(buffer); 
     return new String(buffer); 
    } 

    static abstract class LineParser { 

     public abstract String parse(String s) throws ParseException; 

     static class ManualDatasetLineParser extends LineParser { 
      public String parse(String s) throws ParseException { 
       return s.trim(); 
      } 
     } 

     static class OccTSVLineParser extends LineParser { 
      public String parse(String s) throws ParseException { 
       String result = s; 
       try { 
        result = s.trim().split("\t")[3]; 
       } catch (ArrayIndexOutOfBoundsException e) { 
        throw new ParseException(e.getMessage(), 3); 
       } 
       return result; 
      } 
     } 
    } 

    public void saveExtractedEntitiesSet(String Question, LineParser parser, int restartFrom) throws Exception { 
     String text = Question; 
     int i=0; 
     //int correct =0 ; int error = 0;int sum = 0; 

     for (String snippet: text.split("\n")) { 
      String s = parser.parse(snippet); 
      if (s!= null && !s.equals("")) { 
       i++; 

       if (i<restartFrom) continue; 

       List<DBpediaResource> entities = new ArrayList<DBpediaResource>(); 

       try { 
        entities = extract(new Text(snippet.replaceAll("\\s+"," "))); 
        System.out.println(entities.get(0).getFullUri()); 

       } catch (AnnotationException e) { 
        // error++; 
        LOG.error(e); 
        e.printStackTrace(); 
       } 
       for (DBpediaResource e: entities) { 
        RES.add(e.uri()); 
       } 
      } 
     } 
    } 


    public abstract List<DBpediaResource> extract(Text text) throws AnnotationException; 

    public void evaluate(String Question) throws Exception { 
     evaluateManual(Question,0); 
    } 

    public void evaluateManual(String Question, int restartFrom) throws Exception { 
     saveExtractedEntitiesSet(Question,new LineParser.ManualDatasetLineParser(), restartFrom); 
    } 
} 

chính()

public static void main(String[] args) throws Exception { 

    String Question ="Is the Amazon river longer than the Nile River?"; 

    db c = new db(); 
     c.configiration(0.0, 0, "non", "CoOccurrenceBasedSelector", "Default", "yes"); 
    System.out.println("resource : "+c.getResu()); 
} 
0

Tôi chỉ cần thêm một chút sửa chữa cho câu trả lời của bạn. Mã của bạn đang chạy, nếu bạn thêm các cuộc gọi evaluate phương pháp:

public static void main(String[] args) throws Exception { 
    String question = "Is the Amazon river longer than the Nile River?"; 
    db c = new db(); 
    c.configiration(0.0, 0, "non", "CoOccurrenceBasedSelector", "Default", "yes"); 
    c.evaluate(question); 
    System.out.println("resource : "+c.getResu()); 
} 

Lamine

0

Trong phương pháp request của lớp thứ hai (AnnotationClient) trong Adel's answer, tác giả Pablo Mendes đã không hoàn thành

TODO Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended. 

mà là một cảnh báo gây phiền nhiễu mà cần phải được loại bỏ bằng cách thay thế

byte[] responseBody = method.getResponseBody(); //TODO Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended. 

// Deal with the response. 
// Use caution: ensure correct character encoding and is not binary data 
response = new String(responseBody); 

với

Reader in = new InputStreamReader(method.getResponseBodyAsStream(), "UTF-8"); 
StringWriter writer = new StringWriter(); 
org.apache.commons.io.IOUtils.copy(in, writer); 
response = writer.toString(); 
Các vấn đề liên quan