Watson Conversation a une fonction pour extraire la date, l'heure, le nombre et la devise du texte en tant qu'entité système, nous allons donc l'utiliser spécifiquement.
La bibliothèque à utiliser est le SDK Java de watson https://github.com/watson-developer-cloud/java-sdk
Aperçu
Entrée: «Nous sommes le 1er avril 2018». production: EntityKeyword [facet = sys-date, begin = 0, end = 9, lex = 2018-04-01, str = 1 avril 2018] EntityKeyword [facet=sys-number, begin=2, end=4, lex=30, str=30] EntityKeyword [facet=sys-number, begin=5, end=6, lex=4, str=4] EntityKeyword [facet=sys-number, begin=7, end=8, lex=1, str=1]
Enveloppez la bibliothèque SDK comme suit.
Organisme de service
ConversationNLPService.java
package com.ibm.watson.developer_cloud.conversation;
import java.util.*;
import com.ibm.watson.developer_cloud.conversation.v1.ConversationService;
import com.ibm.watson.developer_cloud.conversation.v1.model.Entity;
import com.ibm.watson.developer_cloud.conversation.v1.model.MessageRequest;
import com.ibm.watson.developer_cloud.conversation.v1.model.MessageResponse;
public class ConversationNLPService {
String username;
String password;
String workspaceid;
public ConversationNLPService(String username, String password, String workspaceid) {
this.username = username;
this.password = password;
this.workspaceid = workspaceid;
}
public ConversationNLPServiceResponse nlp(String input) throws Exception {
ConversationService service = new ConversationService(ConversationService.VERSION_DATE_2016_09_20);
service.setUsernameAndPassword(username, password);
Map<String, Object> context = new HashMap<String, Object>();
{
// SET TIMEZONE
context.put("timezone", TimeZone.getDefault().getID());
}
// remove control code
input = input.replace("\t", " ").replace("\n", " ").replace("\r", " ");
MessageRequest newMessage = new MessageRequest.Builder() //
.inputText(input) //
.context(context) //
.build();
MessageResponse response = service.message(workspaceid, newMessage).execute();
String s = response.getInputText();
ConversationNLPServiceResponse rsp = new ConversationNLPServiceResponse();
List<Entity> list = response.getEntities();
for (Entity e : list) {
EntityKeyword kwd = new EntityKeyword(e.getEntity(), e.getLocation()[0], e.getLocation()[1], e.getValue(),
s.substring(e.getLocation()[0], e.getLocation()[1]));
rsp.addKeyword(kwd);
}
return rsp;
}
}
ConversationNLPServiceResponse
package com.ibm.watson.developer_cloud.conversation;
import java.util.ArrayList;
public class ConversationNLPServiceResponse {
ArrayList<EntityKeyword> kwds = new ArrayList<>();
protected void addKeyword(EntityKeyword kwd) {
for (EntityKeyword kw : kwds) {
if (kw.getFacet().equals(kwd.getFacet()) && kw.isLongerMach(kwd)) {
System.err.println("!! " + kwd);
return;
}
}
this.kwds.add(kwd);
}
public ArrayList<EntityKeyword> asList() {
return kwds;
}
}
EntityKeyword.java
package com.ibm.watson.developer_cloud.conversation;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class EntityKeyword {
public static String SYS_DATE = "sys-date";
public static String SYS_NUMBER = "sys-number";
public static String SYS_CURRENCY = "sys-currency";
String facet;
int begin;
int end;
String lex;
String str;
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public boolean isLongerMach(EntityKeyword kwd) {
return (this.begin <= kwd.begin) && (kwd.end <= this.end) && ((kwd.end - kwd.begin) < (this.end - this.begin));
}
public Date asDate() {
if (isDate() == false) {
return null;
} else {
try {
return sdf.parse(this.lex);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
public boolean isDate() {
return facet != null && facet.equals(SYS_DATE);
}
public boolean isCurrency() {
return facet != null && facet.equals(SYS_CURRENCY);
}
public boolean isNumber() {
return facet != null && facet.equals(SYS_NUMBER);
}
public EntityKeyword(String facet, int begin, int end, String lex, String str) {
super();
this.facet = facet;
this.begin = begin;
this.end = end;
this.lex = lex;
this.str = str;
}
public int getBegin() {
return begin;
}
public int getEnd() {
return end;
}
public String getLex() {
return lex;
}
public String getFacet() {
return facet;
}
public String getStr() {
return str;
}
@Override
public String toString() {
return "EntityKeyword [facet=" + facet + ", begin=" + begin + ", end=" + end + ", lex=" + lex + ", str=" + str
+ "]";
}
}
Comment utiliser
ConversationNLPServiceMain.java
package com.ibm.watson.developer_cloud.conversation;
import java.util.ArrayList;
public class ConversationNLPServiceMain {
public static void main(String[] args) throws Exception {
// PLEASE GET credentials from https://console.bluemix.net/home/
// Enablement_Conversation
String username = "xxx";
String password = "xxx";
// CONV_NLP
String workspaceid = "xxx";
ConversationNLPService service = new ConversationNLPService(username, password, workspaceid);
String input = "Nous sommes le 1er avril 2018.";
ConversationNLPServiceResponse response = service.nlp(input);
ArrayList<EntityKeyword> kwds = response.asList();
for (EntityKeyword kwd : kwds) {
System.err.println(kwd.toString());
}
}
}
System.err
EntityKeyword [facet=sys-date, begin=0, end=9, lex=2018-04-01, str=1 avril 2018]
EntityKeyword [facet=sys-number, begin=2, end=4, lex=30, str=30]
EntityKeyword [facet=sys-number, begin=5, end=6, lex=4, str=4]
EntityKeyword [facet=sys-number, begin=7, end=8, lex=1, str=1]
C'est presque comme ça ...
«1er avril 2018» sera normalisé en «01/04/2018». Vous pouvez également normaliser "Demain" ou "Dimanche prochain". Cependant, il y a des erreurs, donc je pense qu'il faut ne pas être trop dépendant. Je pense qu'il serait bon de modifier cette classe pour ajouter "traitement lorsqu'il n'y a qu'une seule date dans le résultat" et "traitement lorsque la date et l'heure sont consécutives".
Impressions
Je pense que l'API Watson peut avoir une API de type NLP, mais pour une raison quelconque, elle n'est pas fournie, j'ai donc créé quelque chose comme ça.
Recommended Posts