2012-05-18 15 views

risposta

4

Le pagine DBpedia Spotlight wiki sarebbero un buon punto di partenza.

E credo che la pagina installation abbia elencato i modi più comuni (utilizzando un barattolo o configurando un servizio Web) per utilizzare l'applicazione.

Include le istruzioni su using the Java/Scala API con la propria installazione o chiamando il servizio Web.

Ci sono alcuni dati aggiuntivi da scaricare per far funzionare il proprio server per un servizio completo, un buon momento per prepararsi un caffè.

4

è necessario scaricare riflettore dbpedia (file jar) dopo che è possibile utilizzare le prossime due classi (pablomendes dell'autore), apporto solo alcune modifiche.

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

} 

seconda classe

/** 
* @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); 
    } 
} 

principale()

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

ho solo aggiungere una piccola correzione per la risposta. Il codice è in esecuzione, se si aggiunge il evaluate chiamata di metodo:

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

Nel metodo della seconda classe (AnnotationClient) request nel Adel's answer, l'autore Pablo Mendes non ha ancora finito

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

che è un avvertimento fastidioso che deve essere rimosso sostituendo

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

con

Reader in = new InputStreamReader(method.getResponseBodyAsStream(), "UTF-8"); 
StringWriter writer = new StringWriter(); 
org.apache.commons.io.IOUtils.copy(in, writer); 
response = writer.toString(); 
Problemi correlati