Срабатывание юнита по регулярному выражению

* Теперь есть возможность заставить срабатывать юнит не только по ключевым словам, но и по решуляному выражению
This commit is contained in:
Mark Struchkov 2019-02-02 09:02:05 +03:00
parent ffb4ef192d
commit 33253b5000
2 changed files with 40 additions and 8 deletions

View File

@ -12,6 +12,8 @@ import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Autoresponder {
@ -56,16 +58,35 @@ public class Autoresponder {
private Unit nextUnit(List<Unit> nextUnits, String message) {
if (nextUnits.size() > 0) {
Parser parser = new Parser();
parser.setText(message);
parser.parse();
Optional<Unit> max = nextUnits.stream().filter(nextUnit -> textPercentageMatch(nextUnit, parser.getWords()) >= nextUnit.getMatchThreshold() || nextUnit.getKeyWords() == null).max(new UnitPriorityComparator());
return max.orElse(null);
UnitPriorityComparator unitPriorityComparator = new UnitPriorityComparator();
Optional<Unit> patternUnits = nextUnits.stream().filter(nextUnit -> nextUnit.getPattern() != null).filter(nextUnit -> patternReg(nextUnit, message)).max(unitPriorityComparator);
if (!patternUnits.isPresent()) {
Parser parser = new Parser();
parser.setText(message);
parser.parse();
patternUnits = nextUnits.stream().filter(nextUnit -> textPercentageMatch(nextUnit, parser.getWords()) >= nextUnit.getMatchThreshold()).max(unitPriorityComparator);
}
if (!patternUnits.isPresent()) {
patternUnits = nextUnits.stream().filter(nextUnit -> (nextUnit.getPattern()==null && nextUnit.getKeyWords()==null)).max(unitPriorityComparator);
}
return patternUnits.orElse(null);
} else {
return null;
}
}
private boolean patternReg(Unit unit, String message) {
Pattern pattern = unit.getPattern();
Matcher m = pattern.matcher(message);
while (m.find()) {
return true;
}
return false;
}
private Double textPercentageMatch(Unit unit, Set<String> words) {
if (unit.getKeyWords() != null) {
Set<String> temp = new HashSet<>(unit.getKeyWords());
@ -73,8 +94,8 @@ public class Autoresponder {
log.info("Ключевые слова юнита: " + unit.getKeyWords() + " (" + unit.getKeyWords().size() + ")");
log.info("Ключевые слова от пользователя: " + words);
log.info("Пересечение: " + temp + " (" + temp.size() + ")");
log.info((double)temp.size() / (double)unit.getKeyWords().size() * 100.0);
return (double)temp.size() / (double)unit.getKeyWords().size() * 100.0;
log.info("Процент: " + (double) temp.size() / (double) unit.getKeyWords().size() * 100.0 + " Необходимо: " + unit.getMatchThreshold());
return (double) temp.size() / (double) unit.getKeyWords().size() * 100.0;
} else {
return 0.0;
}

View File

@ -1,17 +1,19 @@
package org.sadtech.autoresponder.entity;
import java.util.*;
import java.util.regex.Pattern;
public abstract class Unit {
private Set<String> keyWords;
private Pattern pattern;
private Integer matchThreshold;
private Integer priority;
private List<Unit> nextUnits;
public Unit() {
priority = 10;
matchThreshold = 50;
matchThreshold = 10;
}
public Unit(Set<String> keyWords, Integer matchThreshold, Integer priority, Boolean level, List<Unit> nextUnits) {
@ -67,6 +69,14 @@ public abstract class Unit {
this.nextUnits = nextUnits;
}
public Pattern getPattern() {
return pattern;
}
public void setPattern(Pattern pattern) {
this.pattern = pattern;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@ -82,4 +92,5 @@ public abstract class Unit {
public int hashCode() {
return Objects.hash(keyWords, matchThreshold, priority, nextUnits);
}
}