Sfoglia il codice sorgente

修改:

1、修改语义完整度的实现方式
dev-translate
10710 1 anno fa
parent
commit
2f46194b07
7 ha cambiato i file con 71 aggiunte e 122 eliminazioni
  1. +21
    -0
      xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java
  2. +15
    -0
      xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java
  3. +0
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java
  4. +0
    -10
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmWordProcessManager.java
  5. +0
    -99
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmWordProcessManager.java
  6. +1
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java
  7. +34
    -11
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java

+ 21
- 0
xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java Vedi File

@@ -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);
}

+ 15
- 0
xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java Vedi File

@@ -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;
}
}

+ 0
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java Vedi File

@@ -5,6 +5,5 @@ import lombok.Data;
@Data
public class WordProcessVo{
private String metadata;
private String method;
private String processedResult;
}

+ 0
- 10
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmWordProcessManager.java Vedi File

@@ -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);
}

+ 0
- 99
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmWordProcessManager.java Vedi File

@@ -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;
}
}

+ 1
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java Vedi File

@@ -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);
}

+ 34
- 11
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java Vedi File

@@ -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;
}
}

Caricamento…
Annulla
Salva