Verwenden Sie Watson Conversation als NLP (Java) (Verarbeitung natürlicher Sprache)

Watson Conversation hat eine Funktion zum Extrahieren von Datum, Uhrzeit, Nummer und Währung aus dem Text als Systementität, sodass wir sie speziell verwenden werden.

Die zu verwendende Bibliothek ist das Watson Java SDK https://github.com/watson-developer-cloud/java-sdk

Überblick

Eingabe: "Es ist der 1. April 2018." Ausgabe: EntityKeyword [facet = sys-date, begin = 0, end = 9, lex = 2018-04-01, str = 1. April 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]

Wickeln Sie die SDK-Bibliothek wie folgt ein.

Service-Körper

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
				+ "]";
	}
}


Wie benutzt man

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 = "Es ist der 1. April 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. April 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]

Es ist fast so ...

"1. April 2018" wird auf "2018-04-01" normalisiert. Sie können auch "Morgen" oder "Nächsten Sonntag" normalisieren. Es gibt jedoch Fehler, daher denke ich, dass es notwendig ist, nicht übermäßig abhängig zu sein. Ich denke, es wäre gut, diese Klasse zu ändern, um "Verarbeitung, wenn das Ergebnis nur ein Datum enthält" und "Behandlung, wenn Datum und Uhrzeit aufeinander folgen" hinzuzufügen.

Impressionen


Ich denke, die Watson-API hat möglicherweise eine NLP-API, aber aus irgendeinem Grund wird sie nicht bereitgestellt, also habe ich so etwas gemacht.

Recommended Posts

Verwenden Sie Watson Conversation als NLP (Java) (Verarbeitung natürlicher Sprache)
Einführung des NLP4J- [000] Natural Language Processing Index in Java
[Verarbeitung × Java] Verwendung von Variablen
[Verarbeitung × Java] Verwendung von Arrays
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
NLP4J Versuchen Sie eine Textanalyse unter Verwendung einer Verarbeitung in natürlicher Sprache und einer statistischen Verarbeitung der Syntaxanalyse in Java
NLP4J Versuchen Sie eine Textanalyse unter Verwendung einer Verarbeitung in natürlicher Sprache und einer statistischen Verarbeitung von Teilen in Java
Verwenden Sie die Java7-Anweisung try-with-resources für die Verarbeitung zum Schließen des Cursors