| @@ -0,0 +1,21 @@ | |||||
| package com.xueyi.nlt.api.nlt.feign; | |||||
| import com.alibaba.fastjson2.JSONObject; | |||||
| import com.xueyi.nlt.api.nlt.feign.factory.RemoteBaiduNLPFallbackFactory; | |||||
| import org.springframework.cloud.openfeign.FeignClient; | |||||
| import org.springframework.web.bind.annotation.PostMapping; | |||||
| import org.springframework.web.bind.annotation.RequestBody; | |||||
| import org.springframework.web.bind.annotation.RequestHeader; | |||||
| import org.springframework.web.bind.annotation.RequestParam; | |||||
| @FeignClient(url = "${notification.baidunlp.url}",name = "baidu-nlp", fallbackFactory = RemoteBaiduNLPFallbackFactory.class) | |||||
| public interface RemoteBaiduNLPService { | |||||
| @PostMapping(path = "/oauth/2.0/token", consumes = "application/x-www-form-urlencoded") | |||||
| JSONObject getAccessToken(@RequestBody String body); | |||||
| @PostMapping(path = "/rpc/2.0/nlp/v2/dnnlm_cn", consumes = "application/json") | |||||
| JSONObject detected(@RequestParam(value = "charset", defaultValue = "UTF-8") String charset, | |||||
| @RequestParam("access_token") String accessToken, | |||||
| @RequestBody String body); | |||||
| } | |||||
| @@ -0,0 +1,15 @@ | |||||
| package com.xueyi.nlt.api.nlt.feign.factory; | |||||
| import com.xueyi.nlt.api.nlt.feign.RemoteBaiduNLPService; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import org.springframework.cloud.openfeign.FallbackFactory; | |||||
| import org.springframework.stereotype.Component; | |||||
| @Slf4j | |||||
| @Component | |||||
| public class RemoteBaiduNLPFallbackFactory implements FallbackFactory<RemoteBaiduNLPService> { | |||||
| @Override | |||||
| public RemoteBaiduNLPService create(Throwable cause) { | |||||
| return null; | |||||
| } | |||||
| } | |||||
| @@ -5,6 +5,5 @@ import lombok.Data; | |||||
| @Data | @Data | ||||
| public class WordProcessVo{ | public class WordProcessVo{ | ||||
| private String metadata; | private String metadata; | ||||
| private String method; | |||||
| private String processedResult; | private String processedResult; | ||||
| } | } | ||||
| @@ -1,10 +0,0 @@ | |||||
| package com.xueyi.nlt.nlt.manager; | |||||
| import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; | |||||
| public interface IDmWordProcessManager { | |||||
| public WordProcessVo semanticIntegrityDetection(WordProcessVo wordProcessVo); | |||||
| public WordProcessVo split(WordProcessVo wordProcessVo); | |||||
| } | |||||
| @@ -1,99 +0,0 @@ | |||||
| package com.xueyi.nlt.nlt.manager.impl; | |||||
| import com.alibaba.fastjson2.JSONObject; | |||||
| import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |||||
| import com.xueyi.nlt.nlt.config.BaiduConfig; | |||||
| import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; | |||||
| import com.xueyi.nlt.nlt.manager.IDmWordProcessManager; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.stereotype.Component; | |||||
| import okhttp3.*; | |||||
| import java.io.*; | |||||
| @Component | |||||
| public class DmWordProcessManager implements IDmWordProcessManager { | |||||
| @Autowired | |||||
| private BaiduConfig baiduConfig; | |||||
| static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); | |||||
| private static final Logger log = LoggerFactory.getLogger(DmWordProcessManager.class); | |||||
| @Override | |||||
| public WordProcessVo semanticIntegrityDetection(WordProcessVo wordProcessVo) { | |||||
| String result = detected(wordProcessVo.getMetadata()); | |||||
| log.info("语义完整性检测结果:" + result); | |||||
| if(result != null){ | |||||
| JSONObject jsonObject = JSONObject.parseObject(result); | |||||
| if(jsonObject.containsKey("error_code")){ | |||||
| String errorMsg = String.format("语义完整性检测失败,错误码:%d,错误信息:%s", jsonObject.getInteger("error_code"),jsonObject.getString("error_msg")); | |||||
| log.error(errorMsg); | |||||
| }else{ | |||||
| Double ppl = jsonObject.getDouble("ppl"); | |||||
| if(ppl < 300) { | |||||
| wordProcessVo.setProcessedResult("2"); | |||||
| }else if(ppl > 1000){ | |||||
| wordProcessVo.setProcessedResult("0"); | |||||
| }else{ | |||||
| wordProcessVo.setProcessedResult("1"); | |||||
| } | |||||
| log.info("语义完整性检测结果:" + wordProcessVo.getProcessedResult()); | |||||
| } | |||||
| }else{ | |||||
| log.error("语义完整性检测失败,未获取到返回结果"); | |||||
| } | |||||
| return wordProcessVo; | |||||
| } | |||||
| private String detected(String question) { | |||||
| MediaType mediaType = MediaType.parse("application/json"); | |||||
| RequestBody body = RequestBody.create(mediaType, "{\"text\":\"" + question + "\"}"); | |||||
| String accessToken = getAccessToken(); | |||||
| if(StringUtils.isNotEmpty(accessToken)){ | |||||
| Request request = new Request.Builder() | |||||
| .url(baiduConfig.getDnnUrl() + accessToken) | |||||
| .method("POST", body) | |||||
| .addHeader("Content-Type", "application/json") | |||||
| .addHeader("Accept", "application/json") | |||||
| .build(); | |||||
| try(Response response = HTTP_CLIENT.newCall(request).execute();) { | |||||
| if(response.body() != null) { | |||||
| return response.body().string(); | |||||
| }else{ | |||||
| return null; | |||||
| } | |||||
| }catch (IOException e){ | |||||
| return null; | |||||
| } | |||||
| }else{ | |||||
| return null; | |||||
| } | |||||
| } | |||||
| private String getAccessToken(){ | |||||
| MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); | |||||
| RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + baiduConfig.getApiKey() | |||||
| + "&client_secret=" + baiduConfig.getSecretKey()); | |||||
| Request request = new Request.Builder() | |||||
| .url(baiduConfig.getAuthUrl()) | |||||
| .method("POST", body) | |||||
| .addHeader("Content-Type", "application/x-www-form-urlencoded") | |||||
| .build(); | |||||
| try (Response response = HTTP_CLIENT.newCall(request).execute();){ | |||||
| if(response.body() != null){ | |||||
| String result = response.body().string(); | |||||
| return JSONObject.parseObject(result).getString("access_token"); | |||||
| }else{ | |||||
| return null; | |||||
| } | |||||
| }catch (IOException e) { | |||||
| return null; | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public WordProcessVo split(WordProcessVo dmWordProcessVo){ | |||||
| return null; | |||||
| } | |||||
| } | |||||
| @@ -3,5 +3,5 @@ package com.xueyi.nlt.nlt.service; | |||||
| import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; | import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; | ||||
| public interface IDmWordProcessService { | public interface IDmWordProcessService { | ||||
| public WordProcessVo handle (WordProcessVo dmWordProcessVo); | |||||
| public WordProcessVo semanticIntegrityDetection (WordProcessVo dmWordProcessVo); | |||||
| } | } | ||||
| @@ -1,8 +1,9 @@ | |||||
| package com.xueyi.nlt.nlt.service.impl; | package com.xueyi.nlt.nlt.service.impl; | ||||
| import com.alibaba.fastjson2.JSONObject; | |||||
| import com.xueyi.nlt.api.nlt.feign.RemoteBaiduNLPService; | |||||
| import com.xueyi.nlt.nlt.config.BaiduConfig; | |||||
| import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; | import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; | ||||
| import com.xueyi.nlt.nlt.manager.IDmWordProcessManager; | |||||
| import com.xueyi.nlt.nlt.manager.impl.DmWordProcessManager; | |||||
| import com.xueyi.nlt.nlt.service.IDmWordProcessService; | import com.xueyi.nlt.nlt.service.IDmWordProcessService; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| @@ -11,18 +12,40 @@ import org.springframework.stereotype.Service; | |||||
| @Service | @Service | ||||
| public class DmWordProcessServiceImpl implements IDmWordProcessService { | public class DmWordProcessServiceImpl implements IDmWordProcessService { | ||||
| @Autowired | @Autowired | ||||
| IDmWordProcessManager dmWordProcessManager; | |||||
| RemoteBaiduNLPService remoteBaiduNLPService; | |||||
| private static final Logger log = LoggerFactory.getLogger(DmWordProcessServiceImpl.class); | |||||
| @Autowired | |||||
| private BaiduConfig baiduConfig; | |||||
| public WordProcessVo handle (WordProcessVo wordProcessVo){ | |||||
| log.info("wordProcessVo.getMethod() = " + wordProcessVo.getMethod() + " wordProcessVo.getMetadata() = " + wordProcessVo.getMetadata()); | |||||
| return switch (wordProcessVo.getMethod()) { | |||||
| case "integrity" -> dmWordProcessManager.semanticIntegrityDetection(wordProcessVo); | |||||
| case "split" -> dmWordProcessManager.split(wordProcessVo); | |||||
| default -> null; | |||||
| }; | |||||
| private static final Logger log = LoggerFactory.getLogger(DmWordProcessServiceImpl.class); | |||||
| public WordProcessVo semanticIntegrityDetection (WordProcessVo wordProcessVo){ | |||||
| log.info("元数据:" + wordProcessVo.getMetadata()); | |||||
| String body = "grant_type=client_credentials&client_id=" + baiduConfig.getApiKey() + "&client_secret=" + baiduConfig.getSecretKey(); | |||||
| JSONObject accessJson = remoteBaiduNLPService.getAccessToken(body); | |||||
| JSONObject result = remoteBaiduNLPService.detected("UTF-8", accessJson.getString("access_token"), "{\"text\":\"" + wordProcessVo.getMetadata() + "\"}"); | |||||
| if(result.containsKey("ppl")){ | |||||
| if(result != null){ | |||||
| if(result.containsKey("error_code")){ | |||||
| String errorMsg = String.format("语义完整性检测失败,错误码:%d,错误信息:%s", result.getInteger("error_code"),result.getString("error_msg")); | |||||
| log.error(errorMsg); | |||||
| }else{ | |||||
| Double ppl = result.getDouble("ppl"); | |||||
| if(ppl < 300) { | |||||
| wordProcessVo.setProcessedResult("2"); | |||||
| }else if(ppl > 1000){ | |||||
| wordProcessVo.setProcessedResult("0"); | |||||
| }else{ | |||||
| wordProcessVo.setProcessedResult("1"); | |||||
| } | |||||
| log.info("语义完整性检测结果:" + wordProcessVo.getProcessedResult()); | |||||
| } | |||||
| }else{ | |||||
| log.error("语义完整性检测失败,未获取到返回结果"); | |||||
| } | |||||
| } | |||||
| return wordProcessVo; | |||||
| } | } | ||||
| } | } | ||||