diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java new file mode 100644 index 00000000..71937949 --- /dev/null +++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java @@ -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); +} diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java new file mode 100644 index 00000000..af6e3589 --- /dev/null +++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java @@ -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 { + @Override + public RemoteBaiduNLPService create(Throwable cause) { + return null; + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java index 451561fe..4ac69899 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java @@ -5,6 +5,5 @@ import lombok.Data; @Data public class WordProcessVo{ private String metadata; - private String method; private String processedResult; } diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmWordProcessManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmWordProcessManager.java deleted file mode 100644 index b83ee614..00000000 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmWordProcessManager.java +++ /dev/null @@ -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); -} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmWordProcessManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmWordProcessManager.java deleted file mode 100644 index 17fe18ee..00000000 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmWordProcessManager.java +++ /dev/null @@ -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; - } -} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java index 5a045bf6..003af48f 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java @@ -3,5 +3,5 @@ package com.xueyi.nlt.nlt.service; import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; public interface IDmWordProcessService { - public WordProcessVo handle (WordProcessVo dmWordProcessVo); + public WordProcessVo semanticIntegrityDetection (WordProcessVo dmWordProcessVo); } diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java index 6e3f5be6..701192f3 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java @@ -1,8 +1,9 @@ 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.manager.IDmWordProcessManager; -import com.xueyi.nlt.nlt.manager.impl.DmWordProcessManager; import com.xueyi.nlt.nlt.service.IDmWordProcessService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,18 +12,40 @@ import org.springframework.stereotype.Service; @Service public class DmWordProcessServiceImpl implements IDmWordProcessService { + @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; } }