PatentRightSplitKRService.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package cn.cslg.pas.service.patentRightSplit;
  2. import cn.cslg.pas.common.PatentRightContent;
  3. import cn.cslg.pas.common.model.params.PatentRightParams;
  4. import cn.cslg.pas.domain.PatentRight;
  5. import cn.cslg.pas.domain.QuestionRecord;
  6. import cn.cslg.pas.service.upLoadPatent.QuestionRecordService;
  7. import lombok.RequiredArgsConstructor;
  8. import org.springframework.stereotype.Service;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import java.util.regex.Matcher;
  12. import java.util.regex.Pattern;
  13. /**
  14. * 拆分权要类(韩国专利KR)
  15. *
  16. * @author chenyu
  17. * @date 2023/8/30
  18. */
  19. @RequiredArgsConstructor
  20. @Service
  21. public class PatentRightSplitKRService implements PatentRightSplitService {
  22. private final QuestionRecordService questionRecordService;
  23. @Override
  24. public List<PatentRightContent> formatPatentRight(PatentRightParams params) {
  25. try {
  26. //创建一个权要集合,用于返回结果
  27. ArrayList<PatentRightContent> patentRightContents = new ArrayList<>();
  28. //原文
  29. String content = params.getContent();
  30. //第1步 ↓:拆分权要原文
  31. //将原文和译文的所有换行符 "\r\n"和"\n" 替换成特殊符号 "##@@&&",这样可以使得全文连在一起,其次再根据特殊符号##@@&&拆分权要
  32. content = content.replace("\r\n", "##@@&&").replace("\n", "##@@&&");
  33. //若原文没有换行符则全文按照句号"。"拆分
  34. if (!content.contains("##@@&&")) {
  35. if (content.contains("。")) { //若有句号"。"
  36. content = content.replace("。", "。\n");
  37. } else { //若没有句号"。",则全文按照权要序号如 "청구항 1" "청구항 2" "청구항 3"进行拆分
  38. Matcher matcher = Pattern.compile("청구항 [0-9]+").matcher(content);
  39. while (matcher.find()) {
  40. String macherGroup = matcher.group(); //청구항 2
  41. if (!macherGroup.equals("청구항 1")) {
  42. content = content.replaceFirst(macherGroup, "\n" + macherGroup); //"\n청구항 2"
  43. }
  44. }
  45. }
  46. } else {
  47. //定义正则表达式
  48. String regex = "##@@&&청구항 [0-9]+";
  49. Matcher matcher = Pattern.compile(regex).matcher(content);
  50. while (matcher.find()) {
  51. String macherGroup = matcher.group();
  52. content = content.replaceFirst(macherGroup, "\n" + macherGroup.substring(macherGroup.indexOf("##@@&&") + 6));
  53. }
  54. //去除所有特殊符号"##@@&&"
  55. content = content.replace("##@@&&", "");
  56. }
  57. //最后按照换行符"\n"将权要拆成多个
  58. String[] strs = content.split("\n");
  59. //第2步 ↓:理出权要的类型(type为 1主权要还是 0附属权要)、权要之间的层级关系(每个权要的父级权要序号parentSort)
  60. String regex1 = "제[0-9]+항에 있어서";
  61. //String regex2 = "权利要求[0-9]+[至或~-]+[0-9]+";
  62. for (int i = 0; i < strs.length; i++) {
  63. //创建权要对象装载当前权要
  64. PatentRightContent patentRightContent = new PatentRightContent()
  65. .setContent(strs[i])
  66. .setSort(i);
  67. //创建父级排序号集合,装载父级序号
  68. ArrayList<Integer> parentSorts = new ArrayList<>();
  69. String macherGroup;
  70. ////判断若该权要有逗号(即超过一句话)并且它第一句话中有"权利要求"4个字 或者 该权要没有逗号(即只有一句话),并且它有"权利要求"4个字,则该权要类型为附属权要
  71. //if ((strs[i].contains(",") && strs[i].substring(0, strs[i].indexOf(",")).contains("权利要求")) || (!strs[i].contains(",") && strs[i].contains("权利要求"))) {
  72. //判断若不是权要1,并且含有"항에 있어서"几个字,则为附属权要
  73. if (i != 0 && strs[i].substring(strs[i].indexOf("청구항")).contains("항에 있어서")) {
  74. //则该权要为附权要
  75. patentRightContent.setType(0);
  76. Matcher matcher1 = Pattern.compile(regex1).matcher(strs[i]);
  77. //Matcher matcher2 = Pattern.compile(regex2).matcher(strs[i]);
  78. // if (matcher2.find()) { //"权利要求2~4"、权利要求"2-4"、权利要求"2至4"、权利要求"2或4"
  79. // macherGroup = matcher2.group();
  80. // String parentNum = macherGroup.substring(macherGroup.indexOf("权利要求") + 4); //"2~4"、"2-4"、"2至4"、"2或4"
  81. // String[] parentNumStrs = new String[0]; //[2, 4]
  82. // if (parentNum.contains("~")) {
  83. // parentNumStrs = parentNum.split("~");
  84. // } else if (parentNum.contains("-")) {
  85. // parentNumStrs = parentNum.split("-");
  86. // } else if (parentNum.contains("至")) {
  87. // parentNumStrs = parentNum.split("至");
  88. // } else if (parentNum.contains("或")) {
  89. // parentNumStrs = parentNum.split("或");
  90. // }
  91. //
  92. // if (parentNum.contains("或")) { //"2或4"
  93. // for (String parentNumStr : parentNumStrs) {
  94. // parentSorts.add(Integer.parseInt(parentNumStr) - 1); //sort:{1, 3}
  95. // }
  96. // } else { //"2~4"、"2-4"、"2至4"
  97. // for (int i1 = Integer.parseInt(parentNumStrs[0]); i1 <= Integer.parseInt(parentNumStrs[parentNumStrs.length - 1]); i1++) {
  98. // parentSorts.add(i1 - 1); //sort:{1, 2, 3}
  99. // }
  100. // }
  101. // } else
  102. if (matcher1.find()) { //"제4항에 있어서"
  103. macherGroup = matcher1.group();
  104. String parentNum = macherGroup.substring(macherGroup.indexOf("제") + 1, macherGroup.indexOf("항에 있어서")); //"4"
  105. int parentSort = Integer.parseInt(parentNum) - 1;
  106. parentSorts.add(parentSort); //sort:{3}
  107. }
  108. patentRightContent.setParentSorts(parentSorts);
  109. } else {
  110. //否则该权要为主权要
  111. parentSorts.add(-1); //sort:{-1}
  112. patentRightContent
  113. .setType(1)
  114. .setParentSorts(parentSorts);
  115. }
  116. patentRightContents.add(patentRightContent);
  117. }
  118. return patentRightContents;
  119. } catch (Exception e) {
  120. e.printStackTrace();
  121. //1.记录当前拆分出错专利,记住问题记录表"question_records"
  122. QuestionRecord questionRecord = new QuestionRecord()
  123. .setPatentNo(params.getPatentNo())
  124. .setRemark("查询权要树时拆分出错")
  125. .setCell(-1);
  126. questionRecordService.save(questionRecord);
  127. //2.返回原文
  128. ArrayList<PatentRightContent> patentRightContents = new ArrayList<>();
  129. patentRightContents.add(new PatentRightContent().setSort(-1).setType(-1).setContent(params.getContent()));
  130. return patentRightContents;
  131. }
  132. }
  133. }