Utiliser Watson Conversation comme NLP (Java) (traitement du langage naturel)

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

Utiliser Watson Conversation comme NLP (Java) (traitement du langage naturel)
Présentation de NLP4J- [000] Natural Language Processing Index en Java
[Traitement × Java] Comment utiliser les variables
[Traitement × Java] Comment utiliser les tableaux
[Traitement × Java] Comment utiliser la classe
[Traitement × Java] Comment utiliser la fonction
NLP4J [004] Essayez l'analyse de texte en utilisant le traitement du langage naturel et le traitement statistique de l'analyse syntaxique en Java
NLP4J [003] Essayez l'analyse de texte en utilisant le traitement du langage naturel et le traitement statistique des pièces en Java
Utiliser l'instruction try-with-resources Java7 pour le traitement de fermeture du curseur