diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/config/BaiduConfig.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/config/BaiduConfig.java new file mode 100644 index 00000000..e990b52e --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/config/BaiduConfig.java @@ -0,0 +1,15 @@ +package com.xueyi.nlt.nlt.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "secret.baidu") +public class BaiduConfig { + private String apiKey; + private String secretKey; + private String authUrl; + private String dnnUrl; +} 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 new file mode 100644 index 00000000..451561fe --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java @@ -0,0 +1,10 @@ +package com.xueyi.nlt.nlt.domain.vo; + +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 new file mode 100644 index 00000000..b83ee614 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmWordProcessManager.java @@ -0,0 +1,10 @@ +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 new file mode 100644 index 00000000..17fe18ee --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmWordProcessManager.java @@ -0,0 +1,99 @@ +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 new file mode 100644 index 00000000..5a045bf6 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java @@ -0,0 +1,7 @@ +package com.xueyi.nlt.nlt.service; + +import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; + +public interface IDmWordProcessService { + public WordProcessVo handle (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 new file mode 100644 index 00000000..6e3f5be6 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java @@ -0,0 +1,28 @@ +package com.xueyi.nlt.nlt.service.impl; + +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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DmWordProcessServiceImpl implements IDmWordProcessService { + @Autowired + IDmWordProcessManager dmWordProcessManager; + + private static final Logger log = LoggerFactory.getLogger(DmWordProcessServiceImpl.class); + + 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; + }; + + } +}