目录
1、分析返回结果示例
2、自定义封装类
在【内容审核】Java实现七牛云内容审核功能七牛 java 审核-CSDN博客 中实现了文本、图片和视频的审核功能,但是这些功能灵活性不够,既不能自己设置审核的强度,也不能内容违规的详细信息,所以可以在原来代码的基础上对这些功能进行一个改造。这第一步就是需要自定义封装类来封装审核结果。
1、分析返回结果示例
要想知道七牛云内容审核返回结果中的详细信息,就需要定义实体类来接收这些信息再进行处理。
要自定义这些返回结果的封装类,那就需要先分析这些返回结果的格式。文本、图片和视频审核结果的返回结果示例如下:
仔细把上面的图看一下,我们可以发现在文本、图片和视频这三种JSON格式的返回结果中,视频的返回结果是最复杂的,但是这三种返回结果中有许多属性是一样的,现在我们就开始来分析这些JSON格式的数据,并定义他们的封装类。
2、自定义封装类
我们从最内部的字段开始分析,能得到 "score" 、 "label" 、 "suggestion" 、 "offset" 这几个字段,再结合这些字段对应的“值”,我们能推断除:"score"应该被定义为Double类型;"label"应该被定义为String类型;"suggestion"应该被定义为String类型;"offset"应该被定义为Long类型。
再进一步分析,我们分析"details"字段,"details"字段在三种返回示例中不一样,在文本审核结果中的"details"字段内部只包含"score"字段和"label"字段,而在视频和图片审核结果中的"details"字段内部除了包含"score"字段和"label"字段还包含"suggestion"字段,所以在"details"字段对应的封装类中就应该包含"score"、"label"和"suggestion"这三个属性,因为java中没有"details"字段对应的封装类,所以我们要自定义封装类DetailsJson。代码如下:
DetailsJson类
@Data
@ToString
public class DetailsJson implements Serializable {
String label; // 标签
Double score; // 分数,该分类的置信度分数
String suggestion; // 建议
}
定义了封装类DetailsJson后,我们继续分析,可以定义CutsJson类来封装视频审核结果中 "cuts"字段下的"details"、"offset"和"suggestion"字段,代码如下:
CutsJson类
@Data
@ToString
public class CutsJson implements Serializable {
List<DetailsJson> details; // 视频中,这个时间段审核结果的详细信息
Long offset; // 这个时间段的偏移量
String suggestion; // 建议
}
然后我们直接看文本、图片和视频审核结果中的"scenes"字段,我们对这三种返回结果的"scenes"字段下所包含的字段做一个并集操作,我们可以得到 "politician"、"pulp"、"terror"和"antispam"字段,然后再对这四个字段下所包含的字段做一个并集操作,我们可以得到 "cuts"、"details"和"suggestion"这三个字段。所以我们完全可以定义一个封装类来封装"cuts"、"details"和"suggestion"这三个字段,来对应"politician"、"pulp"、"terror"和"antispam"这四个字段,代码如下:
TypeJson类
/**
* @Author 小涛Tao
* @Date: 2024/08/17/16:49
* version 1.0 注释:TypeJson 表示【文本、视频和图片】审核结果中的审核类型,TypeJson 的属性为审核类型下的子部分。
* 文本审核类型主要为 "antispam"
* 视频和图片的审核类型主要为 "pulp" 、 "terror" 和 "politician"
* 文本审核结果的 "antispam" 下有 details 和 suggestion
* 视频审核结果的 "pulp" 和 "terror" 下有 cuts 和 suggestion ; 而 "politician" 下有 cuts 和 suggestion ,但 cuts 没有 details
* 图片审核结果的 "pulp" 和 "terror" 下有 details 和 suggestion ; 而 "politician" 下只有 suggestion
**/
@Data
@ToString
public class TypeJson implements Serializable {
String suggestion; // 建议
List<CutsJson> cuts; // 视频中不同时段的审核结果集合
List<DetailsJson> details; // 详细信息
}
再定义一个类来封装 "politician"、"pulp"、"terror"和"antispam"这四个字段,代码如下:
ScenesJson类
/**
* @Author 小涛Tao
* @Date: 2024/08/17/17:01
* version 1.0 注释:JSON审核结果中 "result" 下的 "scenes"
* "scenes" 下有哪些审核类型得看是【文本、图片和视频】哪一种审核
**/
@Data
@ToString
public class ScenesJson implements Serializable {
private TypeJson terror; // 恐怖内容,鉴恐
private TypeJson politician; // 敏感人物识别,涉政
private TypeJson pulp; // 低俗色情内容,鉴黄
private TypeJson antispam; // 文本反垃圾,过滤垃圾
}
再像前面一样往上分析,继续定义类。
ResultChildJson类(视频JSON结果中 "result" 中的 "result")
/**
* @Author 小涛Tao
* @Date: 2024/08/17/17:14
* version 1.0 注释:视频JSON结果中 "result" 中的 "result"
* 同时,文本和图片的返回结果中的 result 就用这个来转换成 JSON 结构
**/
@Data
@ToString
public class ResultChildJson implements Serializable {
String suggestion; // 建议
ScenesJson scenes; // 场景 scenes 下包含具体的审核类型(场景)结果
}
ResultJson类(视频JSON结果中 最外层的"result")
/**
* @Author 小涛Tao
* @Date: 2024/08/17/17:19
* version 1.0 注释:视频JSON结果中 最外层的"result"
**/
@Data
@ToString
public class ResultJson implements Serializable {
Integer code; // 状态码
String message; // 提示信息
ResultChildJson resultChile; // 结果体 resultChile
}
BodyJson类:封装视频审核结果,同时提供getPolitician()方法、getTerror()方法和getPulp()方法来获取对应场景下的DetailsJson集合,然后就可以通过遍历这些DetailsJson集合来处理里面的score属性,这些处理的代码可以根据自己的一个想法来编写。
/**
* @Author 小涛Tao
* @Date: 2024/08/17/17:24
* version 1.0 注释:
**/
@Data
@ToString
public class BodyJson implements Serializable {
String id; // 这次视频审核请求任务的唯一标识符
String status; // 这个审核任务的状态,有没有完成
ResultJson result; // 结果JSON结果中的 "result"
// 比较 value 是否在 min 和 max 之间
public boolean compare(Double min, Double max, Double value) {
return value >= min && value <= max;
}
// 检查结果中所有 detail 中的 score 是否在 min 和 max 中,只要里面有一个这样的情况,就算中了
public boolean checkViolation(List<CutsJson> types, Double min, Double max) {
for (CutsJson cutsJson : types) {
if (!ObjectUtils.isEmpty(cutsJson.details)) {
for (DetailsJson detail : cutsJson.details) {
if (compare(min, max, detail.score)) {
return true;
}
}
}
}
return false;
}
// 获取图片或视频审核结果中的 Terror 审核类型下的信息,视频直接就是 Cuts ,图片为 details 和 suggestion
public List<CutsJson> getTerror() {
final TypeJson terror = result.getResultChile().getScenes().getTerror();
// 如果这是视频审核结果,那么结果中的 Terror 审核类型下就有 Cuts ,直接返回这个 Cuts
if (!ObjectUtils.isEmpty(terror.getCuts())) {
return terror.getCuts();
}
// 否则证明这是图片的审核结果,因为图片审核结果中的 Terror 审核类型下没有 Cuts
// 那么就创建一个 CutsJson 来封装图片 Terror 审核类型下的 details 和 suggestion
final CutsJson cutsJson = new CutsJson();
cutsJson.setDetails(terror.getDetails());
cutsJson.setSuggestion(terror.getSuggestion());
return Collections.singletonList(cutsJson); // 设置为只有一个元素的集合来返回
}
// 获取图片或视频审核结果中的 Politician 审核类型下的信息
public List<CutsJson> getPolitician(){
final TypeJson politician = result.getResultChile().getScenes().getPolitician();
if (!ObjectUtils.isEmpty(politician.getCuts())){
return politician.getCuts();
}
// 我:如果是图片的审核结果,politician(TypeJson) 下没有 cuts(CutsJson),所以直接设置 details 和 suggestion
final CutsJson cutsJson = new CutsJson();
cutsJson.setDetails(politician.getDetails());
cutsJson.setSuggestion(politician.getSuggestion());
return Collections.singletonList(cutsJson);
}
// 获取图片或视频审核结果中的 Pulp 审核类型下的信息
public List<CutsJson> getPulp(){
final TypeJson pulp = result.getResultChile().getScenes().getPulp();
if (!ObjectUtils.isEmpty(pulp.getCuts())){
return pulp.cuts;
}
final CutsJson cutsJson = new CutsJson();
cutsJson.setDetails(pulp.getDetails());
cutsJson.setSuggestion(pulp.getSuggestion());
return Collections.singletonList(cutsJson);
}
}
先写到这里,后续再写处理数据的流程和代码。
推荐:
【内容审核】Java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)_七牛 java 审核-CSDN博客https://blog.csdn.net/m0_65277261/article/details/140902624?spm=1001.2014.3001.5501