Срабатывание юнита по регулярному выражению
* Теперь есть возможность заставить срабатывать юнит не только по ключевым словам, но и по решуляному выражению
This commit is contained in:
parent
ffb4ef192d
commit
33253b5000
@ -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) {
|
||||
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();
|
||||
Optional<Unit> max = nextUnits.stream().filter(nextUnit -> textPercentageMatch(nextUnit, parser.getWords()) >= nextUnit.getMatchThreshold() || nextUnit.getKeyWords() == null).max(new UnitPriorityComparator());
|
||||
return max.orElse(null);
|
||||
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,7 +94,7 @@ 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);
|
||||
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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user