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

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

View File

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