use of org.openhab.ui.habot.nlp.Intent in project habot by ghys.
the class ActivateObjectSkill method interpret.
@Override
public IntentInterpretation interpret(Intent intent, String language) {
IntentInterpretation interpretation = new IntentInterpretation();
Set<Item> matchedItems = findItems(intent);
if (matchedItems == null || matchedItems.isEmpty()) {
interpretation.setAnswer(answerFormatter.getRandomAnswer("nothing_activated"));
interpretation.setHint(answerFormatter.getStandardTagHint(intent.getEntities()));
} else {
interpretation.setMatchedItems(matchedItems);
// filter out the items which can't receive an ON command
List<Item> filteredItems = matchedItems.stream().filter(i -> i.getAcceptedCommandTypes().contains(OnOffType.class)).collect(Collectors.toList());
interpretation.setCard(cardBuilder.buildCard(intent, filteredItems));
if (filteredItems.isEmpty()) {
interpretation.setAnswer(answerFormatter.getRandomAnswer("nothing_activated"));
interpretation.setHint(answerFormatter.getStandardTagHint(intent.getEntities()));
} else if (filteredItems.size() == 1) {
if (filteredItems.get(0).getState().equals(OnOffType.ON)) {
interpretation.setAnswer(answerFormatter.getRandomAnswer("switch_already_on"));
} else {
eventPublisher.post(ItemEventFactory.createCommandEvent(filteredItems.get(0).getName(), OnOffType.ON));
interpretation.setAnswer(answerFormatter.getRandomAnswer("switch_activated"));
}
} else {
for (Item item : filteredItems) {
eventPublisher.post(ItemEventFactory.createCommandEvent(item.getName(), OnOffType.ON));
}
interpretation.setAnswer(answerFormatter.getRandomAnswer("switches_activated", ImmutableMap.of("count", String.valueOf(filteredItems.size()))));
}
}
return interpretation;
}
use of org.openhab.ui.habot.nlp.Intent in project habot by ghys.
the class IntentTrainer method interpret.
/**
* Tries to understand the natural language query into an {@link Intent}
*
* @param query the natural language query
* @return the resulting @{link Intent}
*/
public Intent interpret(String query) {
String[] tokens = this.tokenizer.tokenize(query.toLowerCase());
// remove eventual trailing punctuation
tokens[tokens.length - 1] = tokens[tokens.length - 1].replaceAll("\\s*[!?.]+$", "");
double[] outcome = categorizer.categorize(tokens);
logger.debug("{}", categorizer.getAllResults(outcome));
Intent intent = new Intent(categorizer.getBestCategory(outcome));
Span[] spans = nameFinder.find(tokens);
String[] names = Span.spansToStrings(spans, tokens);
for (int i = 0; i < spans.length; i++) {
intent.getEntities().put(spans[i].getType(), names[i]);
}
logger.debug("{}", intent.toString());
return intent;
}
use of org.openhab.ui.habot.nlp.Intent in project habot by ghys.
the class OpenNLPInterpreter method reply.
/**
* This variant of interpret() returns a more complete interpretation result.
*
* @param locale the locale of the query
* @param text the query text
* @return the interpretation result as a {@link ChatReply} object
* @throws InterpretationException
*/
public ChatReply reply(Locale locale, String text) throws InterpretationException {
if (!locale.equals(currentLocale) || intentTrainer == null) {
try {
intentTrainer = new IntentTrainer(locale.getLanguage(), skills.values().stream().sorted(new Comparator<Skill>() {
@Override
public int compare(Skill o1, Skill o2) {
if (o1.getIntentId().equals("get-status")) {
return -1;
}
if (o2.getIntentId().equals("get-status")) {
return 1;
}
return o1.getIntentId().compareTo(o2.getIntentId());
}
}).collect(Collectors.toList()), getNameFinderTrainingDataFromTags(), this.tokenizerId);
currentLocale = locale;
} catch (Exception e) {
InterpretationException fe = new InterpretationException("Error during trainer initialization: " + e.getMessage());
fe.initCause(e);
throw fe;
}
}
ChatReply reply = new ChatReply(locale, text);
Intent intent;
// categorizer.
if (!this.itemRegistry.getItemsByTag("object:" + text.toLowerCase()).isEmpty()) {
intent = new Intent("get-status");
intent.setEntities(new HashMap<String, String>());
intent.getEntities().put("object", text.toLowerCase());
} else if (!this.itemRegistry.getItemsByTag("location:" + text.toLowerCase()).isEmpty()) {
intent = new Intent("get-status");
intent.setEntities(new HashMap<String, String>());
intent.getEntities().put("location", text.toLowerCase());
} else {
// Else, run it through the IntentTrainer
intent = intentTrainer.interpret(text);
}
reply.setIntent(intent);
Skill skill = skills.get(intent.getName());
if (skill != null) {
IntentInterpretation intentInterpretation = skill.interpret(intent, locale.getLanguage());
if (intentInterpretation != null) {
reply.setAnswer(intentInterpretation.getAnswer());
if (intentInterpretation.getHint() != null) {
reply.setHint(intentInterpretation.getHint());
}
if (intentInterpretation.getMatchedItems() != null) {
reply.setMatchedItems(intentInterpretation.getMatchedItems().stream().map(i -> i.getName()).collect(Collectors.toList()).toArray(new String[0]));
}
if (intentInterpretation.getCard() != null) {
reply.setCard(intentInterpretation.getCard());
}
}
}
return reply;
}
use of org.openhab.ui.habot.nlp.Intent in project habot by ghys.
the class CardBuilder method buildChartCard.
/**
* Builds a card with a chart from an intent and matched items
*
* @param intent the intent
* @param matchedItems the matched items
* @param period the chart period
* @return the card
*/
public Card buildChartCard(Intent intent, Collection<Item> matchedItems, String period) {
Set<String> tags = intent.getEntities().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).collect(Collectors.toSet());
Card card = new Card("HbCard");
card.addTags(tags);
card.setEphemeral(true);
card.addConfig("bigger", true);
card.updateTimestamp();
if (matchedItems.size() == 1) {
Item item = matchedItems.stream().findFirst().get();
card.setTitle(item.getLabel());
card.setSubtitle(item.getName());
} else {
card.setTitle(getCardTitleFromGroupLabels(tags));
// TODO: i18n
card.setSubtitle(matchedItems.size() + " items");
}
Component chart = new Component("HbChartImage");
chart.addConfig("items", matchedItems.stream().map(i -> i.getName()).collect(Collectors.toList()).toArray(new String[0]));
chart.addConfig("period", period);
Component analyzeButton = new Component("HbAnalyzeActionButton");
analyzeButton.addConfig("items", chart.getConfig().get("items"));
analyzeButton.addConfig("period", chart.getConfig().get("period"));
card.addComponent("media", chart);
card.addComponent("actions", analyzeButton);
cardRegistry.add(card);
return card;
}
use of org.openhab.ui.habot.nlp.Intent in project habot by ghys.
the class AbstractTrainerTest method checkInterpretation.
protected void checkInterpretation(String intentName, String query, String object, String location) {
Intent actual = interpret(query);
assertEquals(intentName, actual.getName());
if (object != null) {
assertTrue(actual.getEntities().containsKey("object"));
assertEquals(object, actual.getEntities().get("object"));
}
if (location != null) {
assertTrue(actual.getEntities().containsKey("location"));
assertEquals(location, actual.getEntities().get("location"));
}
}
Aggregations