增加香薰机、等待指令

This commit is contained in:
wulin 2023-10-09 20:24:30 +08:00
parent ee0973628e
commit 3be3cd8461
8 changed files with 27054 additions and 38 deletions

View File

@ -66,9 +66,6 @@ public class SystemTalkAnswerConfigService extends GenericReactiveCrudService<Sy
} }
return item; return item;
}).doFinally(signalType -> { }).doFinally(signalType -> {
groupCommand.sort((a, b) ->{
return b.getAskKey().length() - a.getAskKey().length();
});
log.info("配置最多读取{}条,实际读取了{}条自定义回答指令,指令后参数名称{}条", MAX_COUT, group.size(), groupCommand.size()); log.info("配置最多读取{}条,实际读取了{}条自定义回答指令,指令后参数名称{}条", MAX_COUT, group.size(), groupCommand.size());
}).subscribeOn(Schedulers.single()).subscribe(); }).subscribeOn(Schedulers.single()).subscribe();

View File

@ -706,8 +706,16 @@ public enum ChinesePartSpeechEnum implements IChinesePartSpeech{
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities, List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities,
List<DeviceUserBindEntity> includs, List<DeviceUserBindEntity> includs,
List<SystemTalkAnswerConfigEntity> commands){ List<SystemTalkAnswerConfigEntity> commands){
//动词后面的名词只支持已经产生的action后面的不要
int index = Integer.parseInt(key.replace("#", "")); int index = Integer.parseInt(key.replace("#", ""));
action.setActionCommand(commands.get(index).getAskKey()); action.setActionCommand(commands.get(index).getAskKey());
for (Action ac: actions.getActions()
) {
if(!StringUtils.isNotEmpty(ac.getActionCommand())){
ac.setActionCommand(action.getActionCommand());
}
}
return action; return action;
} }
}, },

View File

@ -18,6 +18,7 @@ public class Actions {
* 记录名词或用户配置的词为1.一个循环后0 * 记录名词或用户配置的词为1.一个循环后0
*/ */
int b = 0; int b = 0;
/** /**
* 当前组合的名词 * 当前组合的名词
*/ */

View File

@ -0,0 +1,20 @@
package com.qiuguo.iot.third.nlp.entity;
import lombok.Data;
@Data
public class SystemTalkKeyAndDeviceName {
/**
* 关键字
*/
String key;
/**
* 所在队列中的所以呢
*/
int index;
/**
* 类型 0 系统自定义关键字 1 用户设备名称
*/
Integer type;
}

View File

@ -1,5 +1,6 @@
package com.qiuguo.iot.third.service; package com.qiuguo.iot.third.service;
import com.qiuguo.iot.base.enums.YesNo;
import com.qiuguo.iot.third.enums.ChinesePartSpeechEnum; import com.qiuguo.iot.third.enums.ChinesePartSpeechEnum;
import com.qiuguo.iot.base.enums.DeviceTypeEnum; import com.qiuguo.iot.base.enums.DeviceTypeEnum;
import com.qiuguo.iot.base.utils.StringUtils; import com.qiuguo.iot.base.utils.StringUtils;
@ -12,6 +13,7 @@ import com.qiuguo.iot.third.nlp.NlpKey;
import com.qiuguo.iot.third.nlp.action.Action; import com.qiuguo.iot.third.nlp.action.Action;
import com.qiuguo.iot.third.nlp.action.ActionTime; import com.qiuguo.iot.third.nlp.action.ActionTime;
import com.qiuguo.iot.third.nlp.action.Actions; import com.qiuguo.iot.third.nlp.action.Actions;
import com.qiuguo.iot.third.nlp.entity.SystemTalkKeyAndDeviceName;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -45,33 +47,53 @@ public class NlpService {
request.setPageSize(MAX_COUT); request.setPageSize(MAX_COUT);
return deviceUserBindService.selectDeviceUserBindsByRequest(request).flatMap(deviceUserBindEntityPagerResult -> { return deviceUserBindService.selectDeviceUserBindsByRequest(request).flatMap(deviceUserBindEntityPagerResult -> {
if(deviceUserBindEntityPagerResult.getData().size() > 0){ if(deviceUserBindEntityPagerResult.getData().size() > 0){
List<DeviceUserBindEntity> list = deviceUserBindEntityPagerResult.getData(); /*List<DeviceUserBindEntity> list = deviceUserBindEntityPagerResult.getData();
list.sort((a, b) -> { list.sort((a, b) -> {
return b.getBindName().length() - a.getBindName().length(); return b.getBindName().length() - a.getBindName().length();
});//按照名称由长到短排序 });//按照名称由长到短排序*/
List<DeviceUserBindEntity> includs = new ArrayList<>(); List<DeviceUserBindEntity> includs = new ArrayList<>();
List<SystemTalkAnswerConfigEntity> commands = new ArrayList<>(); List<SystemTalkAnswerConfigEntity> commands = new ArrayList<>();
String pText = text; List<SystemTalkKeyAndDeviceName> systemTalkKeyAndDeviceNameList = new ArrayList<>();
int i = 0; int i = 0;
//放在这里是因为用户有物联网设备才有意义 for(SystemTalkAnswerConfigEntity entity : systemTalkAnswerConfigService.getCommandList()){
for (SystemTalkAnswerConfigEntity entity:systemTalkAnswerConfigService.getCommandList() SystemTalkKeyAndDeviceName systemTalkKeyAndDeviceName = new SystemTalkKeyAndDeviceName();
) { systemTalkKeyAndDeviceName.setKey(entity.getAskKey());
if(pText.indexOf(entity.getAskKey()) >= 0){ systemTalkKeyAndDeviceName.setType(0);
//找到对应的名称 systemTalkKeyAndDeviceName.setIndex(i++);
pText = pText.replace(entity.getAskKey(), "#" + (i++) + "#"); systemTalkKeyAndDeviceNameList.add(systemTalkKeyAndDeviceName);
commands.add(entity);
}
}
i = 0;
for (DeviceUserBindEntity entity:list
) {
if(pText.indexOf(entity.getBindName()) >= 0){
//找到对应的名称
pText = pText.replace(entity.getBindName(), ">" + (i++) + ">");
includs.add(entity);
}
} }
i = 0;
for(DeviceUserBindEntity entity : deviceUserBindEntityPagerResult.getData()){
SystemTalkKeyAndDeviceName systemTalkKeyAndDeviceName = new SystemTalkKeyAndDeviceName();
systemTalkKeyAndDeviceName.setKey(entity.getBindName());
systemTalkKeyAndDeviceName.setType(1);
systemTalkKeyAndDeviceName.setIndex(i++);
systemTalkKeyAndDeviceNameList.add(systemTalkKeyAndDeviceName);
}
//字符由长到短排序
systemTalkKeyAndDeviceNameList.sort((a, b) ->{
return b.getKey().length() - a.getKey().length();
});
String pText = text;
i = 0;
int j = 0;
for(SystemTalkKeyAndDeviceName sysTalkKeyAndDeviceName :systemTalkKeyAndDeviceNameList){
if(pText.indexOf(sysTalkKeyAndDeviceName.getKey()) >= 0){
//找到对应的名称
if(sysTalkKeyAndDeviceName.getType().equals(YesNo.YES.getCode())){
//用户绑定设备名称
pText = pText.replace(sysTalkKeyAndDeviceName.getKey(), ">" + (i++) + ">");
includs.add(deviceUserBindEntityPagerResult.getData().get(sysTalkKeyAndDeviceName.getIndex()));
}else{
//是系统自定义动词后的名称
pText = pText.replace(sysTalkKeyAndDeviceName.getKey(), "#" + (j++) + "#");
commands.add(systemTalkAnswerConfigService.getCommandList().get(sysTalkKeyAndDeviceName.getIndex()));
}
}
}
if(includs.size() > 0) { if(includs.size() > 0) {
return getActions(pText, text, includs, commands); return getActions(pText, text, includs, commands);
} }
@ -90,9 +112,7 @@ public class NlpService {
return liguoNlpService.geSingletNlp(text).map(nlp -> { return liguoNlpService.geSingletNlp(text).map(nlp -> {
Actions actions = new Actions(); Actions actions = new Actions();
actions.setActions(new ArrayList<>()); actions.setActions(new ArrayList<>());
//nlp.getKeys().sort(Comparator.comparing(NlpKey::getType)); //解析,按照type从小到大排序
Action action = new Action(); Action action = new Action();
//String name = "";
actions.setRecordText(recordText); actions.setRecordText(recordText);
action.setLbs(new ArrayList<>()); action.setLbs(new ArrayList<>());
@ -101,6 +121,13 @@ public class NlpService {
for (NlpKey key : nlp.getKeys() for (NlpKey key : nlp.getKeys()
) { ) {
action = ChinesePartSpeechEnum.getEnumWithCode(key.getType()).getAction(systemTalkAnswerConfigService.getSystemTalkWithKeyGroup(),
key.getKey(),
actions,
action,
systemTalkAnswerConfigEntities,
includs,
commands);
if(actions.getA() + actions.getB() == 2){ if(actions.getA() + actions.getB() == 2){
actions.setA(0);// = 0; actions.setA(0);// = 0;
actions.setB(0);//b = 0; actions.setB(0);//b = 0;
@ -130,34 +157,39 @@ public class NlpService {
actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity()); actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity());
action = new Action(); action = new Action();
actions.setName("");//name = ""; actions.setName("");//name = "";
//action.setName(new ArrayList<>());
action.setLbs(new ArrayList<>()); action.setLbs(new ArrayList<>());
action.setAsk(actions.getRecordText()); action.setAsk(actions.getRecordText());
} }
action = ChinesePartSpeechEnum.getEnumWithCode(key.getType()).getAction(systemTalkAnswerConfigService.getSystemTalkWithKeyGroup(),
key.getKey(),
actions,
action,
systemTalkAnswerConfigEntities,
includs,
commands);
} }
//下面判断最后一个名词 //下面判断最后一个名词
if(StringUtils.isNotEmpty(actions.getName())){ if(StringUtils.isNotEmpty(action.getName()) && actions.getA() == 0){
//这说明已经匹配到设备了,但是没有匹配到动作
action.setSystemTalkAnswerConfigEntity(actions.getLastSystemTalkAnswerConfigEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
actions.setLastSystemTalkAnswerConfigEntity(null);
actions.setLastName("");
actions.setLastDeviceUserBindEntity(null);
actions.setB(1);//b = 1;
actions.setA(1);
}else if(StringUtils.isNotEmpty(actions.getName())){
//中途拼接到一些词还未匹配到看是否有识别到名词
//先看是否为自定义指令 //先看是否为自定义指令
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(actions.getName()); SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(actions.getName());
if(entity != null){ if(entity != null){
systemTalkAnswerConfigEntities.add(entity); systemTalkAnswerConfigEntities.add(entity);
actions.setA(1);//a = 1; actions.setA(1);//a = 1;
}else{ }else{//这里没雨匹配到设备需要执行时查询数据库
action.setName(actions.getName());//.add(name); action.setName(actions.getName());//.add(name);
actions.setB(1);//b = 1; actions.setB(1);//b = 1;
actions.setLastSystemTalkAnswerConfigEntity(null);
actions.setLastName("");
actions.setLastDeviceUserBindEntity(null);
} }
}else{ }else if(actions.getA() == 1){
if(StringUtils.isNotEmpty(actions.getLastName())){ //匹配到动作但是没有设备名称
if(StringUtils.isNotEmpty(actions.getLastName())){//如果还有多就用最后一次匹配到的设备信息
action.setName(actions.getLastName());//.add(lastName); action.setName(actions.getLastName());//.add(lastName);
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity()); action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
actions.setB(1);//b = 1; actions.setB(1);//b = 1;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff