Merge branch 'release/release-1.3.0'
This commit is contained in:
commit
b991a12caa
3
pom.xml
3
pom.xml
@ -6,7 +6,8 @@
|
|||||||
|
|
||||||
<groupId>org.sadtech.autoresponder</groupId>
|
<groupId>org.sadtech.autoresponder</groupId>
|
||||||
<artifactId>autoresponder</artifactId>
|
<artifactId>autoresponder</artifactId>
|
||||||
<version>1.2.0-RELEASE</version>
|
<version>1.3.0-RELEASE</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
@ -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,22 +58,44 @@ 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());
|
||||||
temp.retainAll(words);
|
temp.retainAll(words);
|
||||||
log.info((temp.size() / unit.getKeyWords().size()) * 100);
|
log.info("Ключевые слова юнита: " + unit.getKeyWords() + " (" + unit.getKeyWords().size() + ")");
|
||||||
return (double) (temp.size() / unit.getKeyWords().size()) * 100;
|
log.info("Ключевые слова от пользователя: " + words);
|
||||||
|
log.info("Пересечение: " + temp + " (" + temp.size() + ")");
|
||||||
|
log.info("Процент: " + (double) temp.size() / (double) unit.getKeyWords().size() * 100.0 + " Необходимо: " + unit.getMatchThreshold());
|
||||||
|
return (double) temp.size() / (double) unit.getKeyWords().size() * 100.0;
|
||||||
} else {
|
} else {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,24 @@
|
|||||||
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, Pattern pattern, Integer matchThreshold, Integer priority, List<Unit> nextUnits) {
|
||||||
this.keyWords = keyWords;
|
this.keyWords = keyWords;
|
||||||
|
this.pattern = pattern;
|
||||||
this.matchThreshold = matchThreshold;
|
this.matchThreshold = matchThreshold;
|
||||||
this.priority = priority;
|
this.priority = priority;
|
||||||
this.nextUnits = nextUnits;
|
this.nextUnits = nextUnits;
|
||||||
@ -67,12 +70,21 @@ 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;
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
Unit unit = (Unit) o;
|
Unit unit = (Unit) o;
|
||||||
return Objects.equals(keyWords, unit.keyWords) &&
|
return Objects.equals(keyWords, unit.keyWords) &&
|
||||||
|
Objects.equals(pattern, unit.pattern) &&
|
||||||
Objects.equals(matchThreshold, unit.matchThreshold) &&
|
Objects.equals(matchThreshold, unit.matchThreshold) &&
|
||||||
Objects.equals(priority, unit.priority) &&
|
Objects.equals(priority, unit.priority) &&
|
||||||
Objects.equals(nextUnits, unit.nextUnits);
|
Objects.equals(nextUnits, unit.nextUnits);
|
||||||
@ -80,6 +92,6 @@ public abstract class Unit {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(keyWords, matchThreshold, priority, nextUnits);
|
return Objects.hash(keyWords, pattern, matchThreshold, priority, nextUnits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,12 +4,12 @@ import org.sadtech.autoresponder.entity.Unit;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface UnitRepository<T extends Unit> {
|
public interface UnitRepository {
|
||||||
|
|
||||||
void addUnit(T unit);
|
void addUnit(Unit unit);
|
||||||
|
|
||||||
void addUnits(List<T> units);
|
void addUnits(List<Unit> units);
|
||||||
|
|
||||||
List<T> menuUnits();
|
List<Unit> menuUnits();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,6 @@ public interface UnitService {
|
|||||||
|
|
||||||
List<Unit> menuUnit();
|
List<Unit> menuUnit();
|
||||||
|
|
||||||
void addUnitRepository(UnitRepository unitRepository);
|
void addUnit(Unit unit);
|
||||||
|
|
||||||
UnitRepository getUnitRepository(Class clazz);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,40 +12,21 @@ public class UnitServiceImpl implements UnitService {
|
|||||||
|
|
||||||
private static final Logger log = Logger.getLogger(UnitServiceImpl.class);
|
private static final Logger log = Logger.getLogger(UnitServiceImpl.class);
|
||||||
|
|
||||||
private List<UnitRepository> unitRepositories;
|
private UnitRepository unitRepository;
|
||||||
|
|
||||||
public UnitServiceImpl() {
|
public UnitServiceImpl(UnitRepository unitRepository) {
|
||||||
unitRepositories = new ArrayList<>();
|
this.unitRepository = unitRepository;
|
||||||
}
|
|
||||||
|
|
||||||
public UnitServiceImpl(List<UnitRepository> unitRepositories) {
|
|
||||||
this.unitRepositories = unitRepositories;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Unit> menuUnit() {
|
public List<Unit> menuUnit() {
|
||||||
List<Unit> units = new ArrayList<>();
|
return unitRepository.menuUnits();
|
||||||
for (UnitRepository unitRepository : unitRepositories) {
|
|
||||||
units.addAll(unitRepository.menuUnits());
|
|
||||||
}
|
|
||||||
return units;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addUnitRepository(UnitRepository unitRepository) {
|
public void addUnit(Unit unit) {
|
||||||
unitRepositories.add(unitRepository);
|
unitRepository.addUnit(unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public UnitRepository getUnitRepository(Class clazz) {
|
|
||||||
for (UnitRepository unitRepository : unitRepositories) {
|
|
||||||
if (unitRepository.getClass().equals(clazz)) {
|
|
||||||
return unitRepository;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
//package org.sadtech.autoresponder.submodule.insertwords;
|
|
||||||
//
|
|
||||||
//import lombok.Getter;
|
|
||||||
//import lombok.Setter;
|
|
||||||
//
|
|
||||||
//import java.util.List;
|
|
||||||
//import java.util.regex.Matcher;
|
|
||||||
//import java.util.regex.Pattern;
|
|
||||||
//
|
|
||||||
//public class InsertWords {
|
|
||||||
//
|
|
||||||
// @Setter
|
|
||||||
// private String inText;
|
|
||||||
// @Getter
|
|
||||||
// private String outText;
|
|
||||||
//
|
|
||||||
// public void insert(List<String> words) {
|
|
||||||
// Pattern pattern = Pattern.compile("\\{(\\d+)}"); // Задаем шаблон
|
|
||||||
// Matcher m = pattern.matcher(inText); // Инициализация Matcher
|
|
||||||
// StringBuffer result = new StringBuffer(); // Буфер для конечного значения
|
|
||||||
// while (m.find()) { // Проверка на совпадение
|
|
||||||
// if (Integer.parseInt(m.group(1)) < words.size()) {
|
|
||||||
// m.appendReplacement(result, words.get(Integer.parseInt(m.group(1)))); // Подставляем значение из HashMap
|
|
||||||
// } else {
|
|
||||||
// m.appendReplacement(result, m.group(0));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// m.appendTail(result); // Добавить остаток строки
|
|
||||||
// outText = result.toString();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//}
|
|
||||||
|
|
@ -1,139 +1,140 @@
|
|||||||
package org.sadtech.autoresponder;
|
//package org.sadtech.autoresponder;
|
||||||
|
//
|
||||||
import org.junit.Assert;
|
//import org.junit.Assert;
|
||||||
import org.junit.Before;
|
//import org.junit.Before;
|
||||||
import org.junit.Ignore;
|
//import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
//import org.junit.Test;
|
||||||
import org.sadtech.autoresponder.entity.Person;
|
//import org.sadtech.autoresponder.entity.Person;
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
//import org.sadtech.autoresponder.entity.Unit;
|
||||||
import org.sadtech.autoresponder.repository.UnitRepository;
|
//import org.sadtech.autoresponder.repository.UnitRepository;
|
||||||
import org.sadtech.autoresponder.repository.impl.PersonRepositoryMap;
|
//import org.sadtech.autoresponder.repository.impl.PersonRepositoryMap;
|
||||||
import org.sadtech.autoresponder.service.impl.PersonServiceImpl;
|
//import org.sadtech.autoresponder.service.impl.PersonServiceImpl;
|
||||||
import org.sadtech.autoresponder.service.impl.UnitServiceImpl;
|
//import org.sadtech.autoresponder.service.impl.UnitServiceImpl;
|
||||||
|
//
|
||||||
import java.util.*;
|
//import java.util.*;
|
||||||
|
//
|
||||||
public class AutoresponderTest {
|
//public class AutoresponderTest {
|
||||||
|
//
|
||||||
private Person person = new Person(1);
|
// private Person person = new Person(1);
|
||||||
private TextUnit unit = new TextUnit();
|
// private TextUnit unit = new TextUnit();
|
||||||
private TextUnit unit2 = new TextUnit();
|
// private TextUnit unit2 = new TextUnit();
|
||||||
private TextUnit unit3 = new TextUnit();
|
// private TextUnit unit3 = new TextUnit();
|
||||||
private ArrayList<Unit> units = new ArrayList<>();
|
// private ArrayList<Unit> units = new ArrayList<>();
|
||||||
private TextUnitRepositoryList unitRepository = new TextUnitRepositoryList();
|
// private TextUnitRepositoryList unitRepository = new TextUnitRepositoryList();
|
||||||
private PersonRepositoryMap personRepository = new PersonRepositoryMap();
|
// private PersonRepositoryMap personRepository = new PersonRepositoryMap();
|
||||||
|
//
|
||||||
private UnitServiceImpl unitService = new UnitServiceImpl();
|
// private UnitServiceImpl unitService = new UnitServiceImpl();
|
||||||
private PersonServiceImpl personService = new PersonServiceImpl(personRepository);
|
// private PersonServiceImpl personService = new PersonServiceImpl(personRepository);
|
||||||
private Autoresponder autoresponder = new Autoresponder(unitService, personService);
|
// private Autoresponder autoresponder = new Autoresponder(unitService, personService);
|
||||||
|
//
|
||||||
|
//
|
||||||
@Before
|
// @Before
|
||||||
public void before() {
|
// public void before() {
|
||||||
unitService.addUnitRepository(unitRepository);
|
// unitService.addUnitRepository(unitRepository);
|
||||||
|
//
|
||||||
HashSet<String> words = new HashSet<>();
|
// HashSet<String> words = new HashSet<>();
|
||||||
HashSet<String> words2 = new HashSet<>();
|
// HashSet<String> words2 = new HashSet<>();
|
||||||
words.add("тест");
|
// words.add("тест");
|
||||||
words2.add("тест");
|
// words2.add("тест");
|
||||||
words2.add("привет");
|
// words2.add("привет");
|
||||||
|
//
|
||||||
unit.setPriority(50);
|
// unit.setPriority(50);
|
||||||
unit.setKeyWords(words);
|
// unit.setKeyWords(words);
|
||||||
unit.setAnswer("Здравствуйте, вы написали в нашу компанию!");
|
// unit.setAnswer("Здравствуйте, вы написали в нашу компанию!");
|
||||||
unit.setMatchThreshold(100);
|
// unit.setMatchThreshold(100);
|
||||||
|
//
|
||||||
units.add(unit2);
|
// units.add(unit2);
|
||||||
units.add(unit3);
|
// units.add(unit3);
|
||||||
|
//
|
||||||
unit.setNextUnits(units);
|
// unit.setNextUnits(units);
|
||||||
|
//
|
||||||
unit2.setAnswer("Ответ с {0} параметрами!");
|
// unit2.setAnswer("Ответ с {0} параметрами!");
|
||||||
unit2.setPriority(60);
|
// unit2.setPriority(60);
|
||||||
unit2.setKeyWords(words);
|
// unit2.setKeyWords(words);
|
||||||
unit2.setMatchThreshold(100);
|
// unit2.setMatchThreshold(100);
|
||||||
|
//
|
||||||
unit3.setAnswer("Второй Ответ с {0} параметрами!");
|
// unit3.setAnswer("Второй Ответ с {0} параметрами!");
|
||||||
unit3.setPriority(50);
|
// unit3.setPriority(50);
|
||||||
unit3.setKeyWords(words2);
|
// unit3.setKeyWords(words2);
|
||||||
unit3.setMatchThreshold(100);
|
// unit3.setMatchThreshold(100);
|
||||||
|
//
|
||||||
person.setUnit(unit);
|
// person.setUnit(unit);
|
||||||
|
//
|
||||||
unitRepository.addUnit(unit);
|
// unitRepository.addUnit(unit);
|
||||||
unitRepository.addUnit(unit2);
|
// unitRepository.addUnit(unit2);
|
||||||
personRepository.addPerson(person);
|
// personRepository.addPerson(person);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@Test
|
// @Test
|
||||||
public void usualAnswer() {
|
// @Ignore
|
||||||
Unit unit = autoresponder.answer(person.getId(), "Привет это тест срабатывания");
|
// public void usualAnswer() {
|
||||||
Assert.assertEquals(((TextUnit) unit).getAnswer(), "Ответ с {0} параметрами!");
|
// Unit unit = autoresponder.answer(person.getId(), "Привет это тест срабатывания");
|
||||||
}
|
// Assert.assertEquals(((TextUnit) unit).getAnswer(), "Ответ с {0} параметрами!");
|
||||||
|
// }
|
||||||
|
//
|
||||||
@Test
|
//
|
||||||
@Ignore
|
// @Test
|
||||||
public void NoAnswer() {
|
// @Ignore
|
||||||
person.setUnit(null);
|
// public void NoAnswer() {
|
||||||
autoresponder.answer(person.getId(), "Привет это срабатывания");
|
// person.setUnit(null);
|
||||||
}
|
// autoresponder.answer(person.getId(), "Привет это срабатывания");
|
||||||
|
// }
|
||||||
|
//
|
||||||
@Test
|
//
|
||||||
@Ignore
|
// @Test
|
||||||
public void answerByPriority() {
|
// @Ignore
|
||||||
Assert.assertEquals(autoresponder.answer(person.getId(), "Привет это тест срабатывания"), "Ответ с {0} параметрами!");
|
// public void answerByPriority() {
|
||||||
}
|
// Assert.assertEquals(autoresponder.answer(person.getId(), "Привет это тест срабатывания"), "Ответ с {0} параметрами!");
|
||||||
|
// }
|
||||||
@Test
|
//
|
||||||
@Ignore
|
// @Test
|
||||||
public void answerNoPerson() {
|
// @Ignore
|
||||||
TextUnit textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания");
|
// public void answerNoPerson() {
|
||||||
Assert.assertEquals(textUnit.getAnswer(), "Здравствуйте, вы написали в нашу компанию!");
|
// TextUnit textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания");
|
||||||
textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания");
|
// Assert.assertEquals(textUnit.getAnswer(), "Здравствуйте, вы написали в нашу компанию!");
|
||||||
Assert.assertEquals(textUnit.getAnswer(), "Ответ с {0} параметрами!");
|
// textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания");
|
||||||
}
|
// Assert.assertEquals(textUnit.getAnswer(), "Ответ с {0} параметрами!");
|
||||||
|
// }
|
||||||
|
//
|
||||||
private class TextUnit extends Unit {
|
//
|
||||||
private String answer;
|
// private class TextUnit extends Unit {
|
||||||
|
// private String answer;
|
||||||
public TextUnit() {
|
//
|
||||||
super();
|
// public TextUnit() {
|
||||||
}
|
// super();
|
||||||
|
// }
|
||||||
public String getAnswer() {
|
//
|
||||||
return answer;
|
// public String getAnswer() {
|
||||||
}
|
// return answer;
|
||||||
|
// }
|
||||||
public void setAnswer(String answer) {
|
//
|
||||||
this.answer = answer;
|
// public void setAnswer(String answer) {
|
||||||
}
|
// this.answer = answer;
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
private class TextUnitRepositoryList implements UnitRepository<TextUnit> {
|
//
|
||||||
|
// private class TextUnitRepositoryList implements UnitRepository {
|
||||||
List<TextUnit> textUnits = new ArrayList<>();
|
//
|
||||||
|
// List<TextUnit> textUnits = new ArrayList<>();
|
||||||
|
//
|
||||||
@Override
|
//
|
||||||
public void addUnit(TextUnit unit) {
|
// @Override
|
||||||
textUnits.add(unit);
|
// public void addUnit(TextUnit unit) {
|
||||||
}
|
// textUnits.add(unit);
|
||||||
|
// }
|
||||||
@Override
|
//
|
||||||
public void addUnits(List<TextUnit> units) {
|
// @Override
|
||||||
textUnits.addAll(units);
|
// public void addUnits(List<TextUnit> units) {
|
||||||
}
|
// textUnits.addAll(units);
|
||||||
|
// }
|
||||||
@Override
|
//
|
||||||
public List<TextUnit> menuUnits() {
|
// @Override
|
||||||
List<TextUnit> units = new ArrayList<>();
|
// public List<TextUnit> menuUnits() {
|
||||||
for (TextUnit textUnit : textUnits) {
|
// List<TextUnit> units = new ArrayList<>();
|
||||||
units.add(textUnit);
|
// for (TextUnit textUnit : textUnits) {
|
||||||
}
|
// units.add(textUnit);
|
||||||
return units;
|
// }
|
||||||
}
|
// return units;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//}
|
Loading…
Reference in New Issue
Block a user