diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/DocInfoController.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/DocInfoController.java index 4e87dc2..799f6ab 100644 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/DocInfoController.java +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/DocInfoController.java @@ -1,17 +1,21 @@ package com.ruoyi.biemo.business.controller; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.hankcs.hanlp.corpus.document.sentence.Sentence; +import com.hankcs.hanlp.corpus.document.sentence.word.IWord; +import com.hankcs.hanlp.corpus.document.sentence.word.Word; import com.ruoyi.biemo.business.domain.Category; import com.ruoyi.biemo.business.domain.DocInfo; import com.ruoyi.biemo.business.service.CategoryService; import com.ruoyi.biemo.business.service.DocInfoService; import com.ruoyi.biemo.core.page.Page; import com.ruoyi.biemo.core.page.PageFactory; +import com.ruoyi.biemo.nlp.DependencyParserUtils; import com.ruoyi.biemo.utils.MyObjects; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +23,10 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import java.util.Map; /** @@ -81,14 +88,68 @@ public class DocInfoController extends BaseController { */ @PreAuthorize("@ss.hasPermi('biemo:docInfo:query')") @GetMapping(value = "/getInfoDelHtml/{id}") - public AjaxResult getInfoDelHtml(@PathVariable("id") String id) - { - DocInfo docInfo = docInfoService.selectDocInfoById(id); + public AjaxResult getInfoDelHtml(@PathVariable("id") String docInfoId) throws IOException { + DocInfo docInfo = docInfoService.selectDocInfoById(docInfoId); + JSONObject result = new JSONObject(); String content = docInfo.getContent(); content = MyObjects.delHTMLTag(content); content = MyObjects.delSpace(content); - docInfo.setContent(content); - return AjaxResult.success(docInfo); + JSONArray labels = new JSONArray(); + result.put("content",content); + result.put("connections",new JSONArray()); + result.put("connectionCategories",MyObjects.connectionCategories); + result.put("labelCategories",MyObjects.labelCategories); + Sentence sentence = DependencyParserUtils.nerAnalysis(content); + List wordList = sentence.wordList; + if(wordList!=null&&wordList.size()>0){ + int offset = 0; + int id = 0; + for(int i=0;i wordList = new ArrayList<>(); + if(labels!=null&&labels.size()>0){ + for(int i=0;i> getMyNERTagSet(String[] strArr) throws Exception{ Map> result = new HashMap<>(); if(strArr!=null&&strArr.length>0){ diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/utils/MyObjects.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/utils/MyObjects.java index 906d462..89dd3f1 100644 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/utils/MyObjects.java +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/utils/MyObjects.java @@ -1,14 +1,100 @@ package com.ruoyi.biemo.utils; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MyObjects { + public static Map wordsMapping = new HashMap<>(); + public static Map wordsMappingIndex = new HashMap<>(); + + public static JSONArray labelCategories = new JSONArray(); + public static JSONArray connectionCategories = new JSONArray(); + + + static{ + wordsMapping.put("n",0);//名词 + wordsMapping.put("nr",1);// 人名 + wordsMapping.put("ns",2);// 地名 + wordsMapping.put("nt",3);// 机构团体 + wordsMapping.put("v",4);//动词 + wordsMapping.put("a",5);//形容词 + wordsMapping.put("d",6);//副词 + + wordsMappingIndex.put(0,"n");//名词 + wordsMappingIndex.put(1,"nr");// 人名 + wordsMappingIndex.put(2,"ns");// 地名 + wordsMappingIndex.put(3,"nt");// 机构团体 + wordsMappingIndex.put(4,"v");//动词 + wordsMappingIndex.put(5,"a");//形容词 + wordsMappingIndex.put(6,"d");//副词 + + JSONObject labelCategoriesMap1 = new JSONObject(); + labelCategoriesMap1.put("id",0); + labelCategoriesMap1.put("text","名词"); + labelCategoriesMap1.put("color","#eac0a2"); + labelCategoriesMap1.put("border-color","#8c7361"); + labelCategories.add(labelCategoriesMap1); + JSONObject labelCategoriesMap2 = new JSONObject(); + labelCategoriesMap2.put("id",1); + labelCategoriesMap2.put("text","人名"); + labelCategoriesMap2.put("color","#eac0a2"); + labelCategoriesMap2.put("border-color","#8c7361"); + labelCategories.add(labelCategoriesMap2); + JSONObject labelCategoriesMap3 = new JSONObject(); + labelCategoriesMap3.put("id",2); + labelCategoriesMap3.put("text","地名"); + labelCategoriesMap3.put("color","#eac0a2"); + labelCategoriesMap3.put("border-color","#8c7361"); + labelCategories.add(labelCategoriesMap3); + JSONObject labelCategoriesMap4 = new JSONObject(); + labelCategoriesMap4.put("id",3); + labelCategoriesMap4.put("text","机构团体"); + labelCategoriesMap4.put("color","#eac0a2"); + labelCategoriesMap4.put("border-color","#8c7361"); + labelCategories.add(labelCategoriesMap4); + JSONObject labelCategoriesMap5 = new JSONObject(); + labelCategoriesMap5.put("id",4); + labelCategoriesMap5.put("text","动词"); + labelCategoriesMap5.put("color","#619dff"); + labelCategoriesMap5.put("border-color","#3c619d"); + labelCategories.add(labelCategoriesMap5); + JSONObject labelCategoriesMap6 = new JSONObject(); + labelCategoriesMap6.put("id",5); + labelCategoriesMap6.put("text","形容词"); + labelCategoriesMap6.put("color","#9d61ff"); + labelCategoriesMap6.put("border-color","#613C9D"); + labelCategories.add(labelCategoriesMap6); + JSONObject labelCategoriesMap7 = new JSONObject(); + labelCategoriesMap7.put("id",6); + labelCategoriesMap7.put("text","副词"); + labelCategoriesMap7.put("color","#ff9d61"); + labelCategoriesMap7.put("border-color","#995e3a"); + labelCategories.add(labelCategoriesMap7); + + + JSONObject connectionCategoriesMap1 = new JSONObject(); + connectionCategoriesMap1.put("id",0); + connectionCategoriesMap1.put("text","修饰"); + connectionCategories.add(connectionCategoriesMap1); + JSONObject connectionCategoriesMap2 = new JSONObject(); + connectionCategoriesMap2.put("id",1); + connectionCategoriesMap2.put("text","限定"); + connectionCategories.add(connectionCategoriesMap2); + JSONObject connectionCategoriesMap3 = new JSONObject(); + connectionCategoriesMap3.put("id",2); + connectionCategoriesMap3.put("text","是...的动作"); + connectionCategories.add(connectionCategoriesMap3); + } + /** * 判断对象是否为空,且对象的所有属性都为空 * ps: boolean类型会有默认值false 判断结果不会为null 会影响判断结果 diff --git a/ruoyi-hanlp/src/test/java/com/hankcs/demo/DemoPerceptronLexicalAnalyzer.java b/ruoyi-hanlp/src/test/java/com/hankcs/demo/DemoPerceptronLexicalAnalyzer.java index 1165b77..7b9e969 100644 --- a/ruoyi-hanlp/src/test/java/com/hankcs/demo/DemoPerceptronLexicalAnalyzer.java +++ b/ruoyi-hanlp/src/test/java/com/hankcs/demo/DemoPerceptronLexicalAnalyzer.java @@ -11,10 +11,15 @@ package com.hankcs.demo; import com.hankcs.hanlp.HanLP; +import com.hankcs.hanlp.corpus.document.sentence.Sentence; +import com.hankcs.hanlp.corpus.document.sentence.word.IWord; +import com.hankcs.hanlp.corpus.document.sentence.word.Word; import com.hankcs.hanlp.model.perceptron.PerceptronLexicalAnalyzer; import com.hankcs.hanlp.utility.TestUtility; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * 基于感知机序列标注的词法分析器,可选多个模型。 @@ -36,12 +41,19 @@ public class DemoPerceptronLexicalAnalyzer extends TestUtility //System.out.println(analyzer.analyze("微软公司於1975年由比爾·蓋茲和保羅·艾倫創立,18年啟動以智慧雲端、前端為導向的大改組。").translateLabels()); // 任何模型总会有失误,特别是98年这种陈旧的语料库 - System.out.println(analyzer.analyze("总统普京与特朗普通电话讨论太空探索技术公司").translateLabels()); - System.out.println(analyzer.seg2sentence("总统普京与特朗普通电话讨论太空探索技术公司")); + System.out.println(analyzer.analyze("总统普京与特朗普通电话讨论太空探索技术公司,麻皮粗壮是我的名字")); + //System.out.println(analyzer.seg2sentence("总统普京与特朗普通电话讨论太空探索技术公司")); // 支持在线学习 - //analyzer.learn("与/c 特朗普/nr 通/v 电话/n 讨论/v [太空/s 探索/vn 技术/n 公司/n]/nt"); + List wordList = new ArrayList<>(); + Word word = new Word(null,null); + word.setLabel("nt"); + word.setValue("俄乌冲突"); + wordList.add(word); + Sentence sentence = new Sentence(wordList); + analyzer.learn(sentence); + // 学习到新知识 - System.out.println(analyzer.analyze("总统普京与特朗普通电话讨论太空探索技术公司")); + System.out.println(analyzer.analyze("总统普京与特朗普通电话讨论太空探索技术公司,麻皮粗壮是我的名字")); // 还可以举一反三 //System.out.println(analyzer.analyze("主席和特朗普通电话")); @@ -51,8 +63,9 @@ public class DemoPerceptronLexicalAnalyzer extends TestUtility //System.out.println(analyzer.analyze("我在四川金华出生,我的名字叫金华")); // 在线学习后的模型支持序列化,以分词模型为例: - //analyzer.getPerceptronSegmenter().getModel().save("data/model/perceptron/pku199801/cws.bin"); - //analyzer.getPerceptronPOSTagger().getModel().save(HanLP.Config.PerceptronPOSModelPath); + analyzer.getPerceptronSegmenter().getModel().save(HanLP.Config.PerceptronCWSModelPath); + analyzer.getPerceptronPOSTagger().getModel().save(HanLP.Config.PerceptronPOSModelPath); + analyzer.getPerceptionNERecognizer().getModel().save(HanLP.Config.PerceptronNERModelPath); // 请用户按需执行对空格制表符等的预处理,只有你最清楚自己的文本中都有些什么奇怪的东西 // System.out.println(analyzer.analyze("空格 \t\n\r\f 统统都不要" // .replaceAll("\\s+", "") // 去除所有空白符 diff --git a/ruoyi-ui/public/tmp/content/code.jpg b/ruoyi-ui/public/tmp/content/code.jpg new file mode 100644 index 0000000..a991934 Binary files /dev/null and b/ruoyi-ui/public/tmp/content/code.jpg differ diff --git a/ruoyi-ui/public/tmp/content/logo.png b/ruoyi-ui/public/tmp/content/logo.png new file mode 100644 index 0000000..a23dee1 Binary files /dev/null and b/ruoyi-ui/public/tmp/content/logo.png differ diff --git a/ruoyi-ui/public/tmp/content/tg1.mp4 b/ruoyi-ui/public/tmp/content/tg1.mp4 new file mode 100644 index 0000000..2beda73 Binary files /dev/null and b/ruoyi-ui/public/tmp/content/tg1.mp4 differ diff --git a/ruoyi-ui/public/tmp/content/tg2.mp4 b/ruoyi-ui/public/tmp/content/tg2.mp4 new file mode 100644 index 0000000..6076313 Binary files /dev/null and b/ruoyi-ui/public/tmp/content/tg2.mp4 differ diff --git a/ruoyi-ui/src/api/biemo/docInfo.js b/ruoyi-ui/src/api/biemo/docInfo.js index 3f9daa6..a1d5dcc 100644 --- a/ruoyi-ui/src/api/biemo/docInfo.js +++ b/ruoyi-ui/src/api/biemo/docInfo.js @@ -16,14 +16,21 @@ export function getDocInfo(id) { method: 'get' }) } -// 查询文章管理详细 +// 查询文章详情 组装词性标注 export function getInfoDelHtml(id) { return request({ url: '/makesoft/docInfo/getInfoDelHtml/' + id, method: 'get' }) } - +// 上传词性标注 +export function uploadPosTag(data) { + return request({ + url: '/makesoft/docInfo/uploadPosTag/', + method: 'post', + data: data + }) +} // 新增文章管理 export function addDocInfo(data) { return request({ diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 3cee607..091f10b 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -98,7 +98,8 @@ Vue.config.productionTip = false import {setToken} from '@/utils/auth'; import {ticket2token} from '@/api/login' import {getQueryObject} from '@/utils/index'; -let ticket = getQueryObject().ticket; +//let ticket = getQueryObject().ticket; +let ticket = null; if(ticket){ ticket2token({ticket:ticket}).then(res =>{ let sysToken = res.data; diff --git a/ruoyi-ui/src/permission.js b/ruoyi-ui/src/permission.js index 6bb0a1f..5f566c2 100644 --- a/ruoyi-ui/src/permission.js +++ b/ruoyi-ui/src/permission.js @@ -8,7 +8,7 @@ import { isRelogin } from '@/utils/request' NProgress.configure({ showSpinner: false }) -const whiteList = ['/login', '/auth-redirect', '/bind', '/register'] +const whiteList = ['/login', '/auth-redirect', '/bind', '/register','/review'] router.beforeEach((to, from, next) => { NProgress.start() diff --git a/ruoyi-ui/src/router/index.js b/ruoyi-ui/src/router/index.js index db84eaf..885a8be 100644 --- a/ruoyi-ui/src/router/index.js +++ b/ruoyi-ui/src/router/index.js @@ -46,6 +46,11 @@ export const constantRoutes = [ component: () => import('@/views/login'), hidden: true }, + { + path: '/review', + component: () => import('@/views/review'), + hidden: true + }, { path: '/register', component: () => import('@/views/register'), diff --git a/ruoyi-ui/src/views/posTagging/detail.vue b/ruoyi-ui/src/views/posTagging/detail.vue index 51fb697..f0f347e 100644 --- a/ruoyi-ui/src/views/posTagging/detail.vue +++ b/ruoyi-ui/src/views/posTagging/detail.vue @@ -1,5 +1,5 @@