Срабатывание юнита по регулярному выражению
* Теперь есть возможность заставить срабатывать юнит не только по ключевым словам, но и по решуляному выражению
This commit is contained in:
parent
ffb4ef192d
commit
33253b5000
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user