首页 文章 精选 留言 我的

精选列表

搜索[PaaS框架],共10000篇文章
优秀的个人博客,低调大师

HanLP汉语言分析框架

HanLP(Han Language Processing)是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。 HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 环境搭建 1.创建java项目,导入HanLP必要的包 2.把对应的配置文件放置在src下 3.修改hanlp.properties配置文件,使其指向data(data中包含词典和模型)的上级路径,修改如下, 代码运行 1.第一个Demo System.out.println(HanLP.segment("你好,欢迎使用HanLP汉语处理包!"));//标准分词List standardList = StandardTokenizer.segment("商品和服务");System.out.println(standardList);结果: 注意:HanLP.segment其实是对StandardTokenizer.segment的包装。 2.索引分词 List indexList = IndexTokenizer.segment("主副食品");for (Term term : indexList){System.out.println(term + " [" + term.offset + ":" + (term.offset + term.word.length()) + "]");}结果: 注意:索引分词IndexTokenizer是面向搜索引擎的分词器,能够对长词全切分,另外通过term.offset可以获取单词在文本中的偏移量。 3.自然语言分词 List nlpList = NLPTokenizer.segment("中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程");System.out.println(nlpList);结果: 注意:自然语言分词NLPTokenizer会执行全部命名实体识别和词性标注。 4.最短路径分词&N-最短路径分词 String[] testCase = new String[]{"今天,刘志军案的关键人物,山西女商人丁书苗在市二中院出庭受审。","刘喜杰石国祥会见吴亚琴先进事迹报告团成员",};//N-最短路径分词Segment nShortSegment = new NShortSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);for (String sentence : testCase){System.out.println("N-最短分词:" + nShortSegment.seg(sentence));}//最短路径分词Segment shortestSegment = new DijkstraSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);for (String sentence : testCase){System.out.println("最短路分词:" + shortestSegment.seg(sentence));}结果: 注意: N最短路分词器NShortSegment比最短路分词器慢,但是效果稍微好一些,对命名实体识别能力更强。 一般场景下最短路分词的精度已经足够,而且速度比N最短路分词器快几倍,请酌情选择。 5.CRF(条件随机场算法)分词 Segment segment = new CRFSegment();segment.enablePartOfSpeechTagging(true);List crfList = segment.seg("你看过环太平洋吗");System.out.println(crfList);for (Term term : crfList){if (term.nature == null){System.out.println("识别到新词:" + term.word);}}结果: 注意:CRF对新词有很好的识别能力,但是无法利用自定义词典。 6.用户自定义词典 // 动态增加CustomDictionary.add("攻城狮");// 强行插入CustomDictionary.insert("白富美", "nz 1024");// 删除词语(注释掉试试)//CustomDictionary.remove("攻城狮");System.out.println(CustomDictionary.add("单身狗", "nz 1024 n 1"));System.out.println("单身狗 : " + CustomDictionary.get("单身狗"));String text2 = "攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰";String text23 = "王重阳和步惊云一起讨论盖聂的百步飞剑的诀窍! ";// AhoCorasickDoubleArrayTrie自动机分词final char[] charArray = text23.toCharArray();CustomDictionary.parseText(charArray, new AhoCorasickDoubleArrayTrie.IHit(){@Overridepublic void hit(int begin, int end, CoreDictionary.Attribute value){System.out.printf("[%d:%d]=%s %sn", begin, end, new String(charArray, begin, end - begin), value);}}); 结果: 注意: CustomDictionary是一份全局的用户自定义词典,可以随时增删,影响全部分词器。 另外可以在任何分词器中关闭它。通过代码动态增删不会保存到词典文件。 7.中国人名识别 String[] testCase2 = new String[]{"签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。","张浩和胡健康复员回家了","编剧邵钧林和稽道青说","这里有关天培的有关事迹","龚学平等领导,邓颖超生前",};Segment segment2 = HanLP.newSegment().enableNameRecognize(true);for (String sentence : testCase2){List termList = segment2.seg(sentence);System.out.println(termList);}结果: 注意:目前分词器基本上都默认开启了中国人名识别,比如HanLP.segment()接口中使用的分词器等等,用户不必手动开启; 8.关键字提取 String content = "程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。";List keywordList = HanLP.extractKeyword(content, 5);System.out.println(keywordList);结果: 注意:其内部采用TextRankKeyword(类谷歌的PageRank)实现,用户可以直接调用TextRankKeyword.getKeywordList(document, size)。 9.简繁转换 System.out.println(HanLP.convertToTraditionalChinese("用笔记本电脑写程序"));System.out.println(HanLP.convertToSimplifiedChinese("「以後等妳當上皇后,就能買士多啤梨慶祝了」"));结果: 10.语义距离 String[] wordArray2 = new String[]{"香蕉","苹果","白菜","水果","蔬菜"};for (String a : wordArray2){ for (String b : wordArray2) { System.out.println(a + "t" + b + "t之间的距离是t" + CoreSynonymDictionary.distance(a, b)); }} 结果: 注意: 说明 设想的应用场景是搜索引擎对词义的理解,词与词并不只存在“同义词”与“非同义词”的关系,就算是同义词,它们之间的意义也是有微妙的差别的。 算法 为每个词分配一个语义ID,词与词的距离通过语义ID的差得到。语义ID通过《同义词词林扩展版》计算而来。

优秀的个人博客,低调大师

aop 框架底层的 Javassist API

javassist 可以实现 java 的动态性 比如在 java 程序运行时, 动态的添加新方法修改类结构 该类 API 与 java.lang.Class API 相似 动态的创建一个 class 对象 ClassPool pool = ClassPool.getDefault(); /** 声明类名及包名 */ CtClass ctClass = pool.makeClass("com.znsd.javassist.Emp"); /** 创建属性 */ CtField ctField = CtField.make("private Integer id;", ctClass); ctClass.addField(ctField); /** 创建方法 */ CtMethod ctMethod = CtMethod.make("public Integer getId(){return id;}", ctClass); ctClass.addMethod(ctMethod); // 将生成好的类输出在本地磁盘上 ctClass.writeFile("F:/"); System.out.println("执行成功!"); 获取类的基本信息 ClassPool classPool = ClassPool.getDefault(); CtClass ctClass = classPool.get("com.znsd.javassist.Student"); System.out.println("获取类路径: " + ctClass.getName()); System.out.println("获取类名: " + ctClass.getSimpleName()); System.out.println("获取父类: " + ctClass.getSuperclass()); System.out.println("获取接口: " + ctClass.getInterfaces()); 动态创建方法 ClassPool classPool = ClassPool.getDefault(); CtClass ctClass = classPool.get("com.znsd.javassist.Student"); /** 声明好一个方法 */ CtMethod ctMethod = CtNewMethod.make("public int add(int i, int j){return i + j;}", ctClass); ctClass.addMethod(ctMethod); /** 获取 Class 对象用于调用创建好的方法 */ Class classes = ctClass.toClass(); Object newInstance = classes.newInstance(); Method declaredMethod = classes.getDeclaredMethod("add", int.class, int.class); Object result = declaredMethod.invoke(newInstance, 110, 120); System.out.println(result); 实现 aop 编程 ClassPool classPool = ClassPool.getDefault(); CtClass ctClass = classPool.get("com.znsd.javassist.Student"); CtMethod ctMethod = ctClass.getDeclaredMethod("show"); // 在方法前插入一些代码 ctMethod.insertBefore("System.out.println(\"aop:before\");"); // 在方法后插入一些代码 ctMethod.insertAfter("System.out.println(\"aop:after\");"); // 指定在哪一行插入一些代码 ctMethod.insertAt(29, "System.out.println(\"insertAt\");"); Class classes = ctClass.toClass(); Object newInstance = classes.newInstance(); Method method = classes.getDeclaredMethod("show"); method.invoke(newInstance);

优秀的个人博客,低调大师

Java 集合框架 ArrayList 源码剖析

ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。 size(), isEmpty(), get(), set()方法均能在常数时间内完成,add()方法的时间开销跟插入位置有关,addAll()方法的时间开销跟添加元素的个数成正比。其余方法大都是线性时间。 为追求效率,ArrayList没有实现同步(synchronized),如果需要多个线程并发访问,用户可以手动同步,也可使用Vector替代。 方法剖析 set() 既然底层是一个数组ArrayList的set()方法也就变得非常简单,直接对数组的指定位置赋值即可。 public E set(int index, E element) { rangeCheck(index);//下标越界检查 E oldValue = elementData(index); elementData[index] = element;//赋值到指定位置,复制的仅仅是引用 return oldValue; } get() get()方法同样很简单,唯一要注意的是由于底层数组是Object[],得到元素后需要进行类型转换。 public E get(int index) { rangeCheck(index); return (E) elementData[index];//注意类型转换 } add() 跟C++ 的vector不同,ArrayList没有bush_back()方法,对应的方法是add(E e),ArrayList也没有insert()方法,对应的方法是add(int index, E e)。这两个方法都是向容器中添加新元素,这可能会导致capacity不足,因此在添加元素之前,都需要进行剩余空间检查,如果需要则自动扩容。扩容操作最终是通过grow()方法完成的。 private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//原来的3倍 if (newCapacity – minCapacity < 0) newCapacity = minCapacity; if (newCapacity – MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity);//扩展空间并复制 } 由于Java GC自动管理了内存,这里也就不需要考虑源数组释放的问题。 空间的问题解决后,插入过程就显得非常简单。 add(int index, E e)需要先对元素进行移动,然后完成插入操作,也就意味着该方法有着线性的时间复杂度。 addAll() addAll()方法能够一次添加多个元素,根据位置不同也有两个把本,一个是在末尾添加的addAll(Collection c)方法,一个是从指定位置开始插入的addAll(int index, Collection c)方法。跟add()方法类似,在插入之前也需要进行空间检查,如果需要则自动扩容;如果从指定位置插入,也会存在移动元素的情况。addAll()的时间复杂度不仅跟插入元素的多少有关,也跟插入的位置相关。 remove() remove()方法也有两个版本,一个是remove(int index)删除指定位置的元素,另一个是remove(Object o)删除第一个满足o.equals(elementData[index])的元素。删除操作是add()操作的逆过程,需要将删除点之后的元素向前移动一个位置。需要注意的是为了让GC起作用,必须显式的为最后一个位置赋null值。 public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size – index – 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[–size] = null; //清除该位置的引用,让GC起作用 return oldValue; } 关于Java GC这里需要特别说明一下,有了垃圾收集器并不意味着一定不会有内存泄漏。对象能否被GC的依据是是否还有引用指向它,上面代码中如果不手动赋null值,除非对应的位置被其他元素覆盖,否则原来的对象就一直不会被回收。 原文发布时间为:2018-08-06本文作者:Java杂记本文来自云栖社区合作伙伴“Java杂记”,了解相关信息可以关注“Java杂记”

优秀的个人博客,低调大师

POI框架:Java程序读取Excel

APACHE-POI What:POI是什么? Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 HOW:如何使用java程序读取Excel文件中的内容? 1.坐标(导包) <!--APACHE POI--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.11</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.11</version> </dependency> 2.准备一份你要读取的Excel文件,这里我拿北京市的省市区的Excel文件作为示例文件。 北京市区域划分Excel文件 3.编码 public class POIDemo { @Test public void poiTestMethod() throws Exception { //1.读取Excel文档对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream("D:\\Solr\\测试数据.xls")); //2.获取要解析的表格(第一个表格) HSSFSheet sheet = hssfWorkbook.getSheetAt(0); //获得最后一行的行号 int lastRowNum = sheet.getLastRowNum(); for (int i = 0; i <= lastRowNum; i++) {//遍历每一行 //3.获得要解析的行 HSSFRow row = sheet.getRow(i); //4.获得每个单元格中的内容(String) String stringCellValue0 = row.getCell(0).getStringCellValue(); String stringCellValue1 = row.getCell(1).getStringCellValue(); String stringCellValue2 = row.getCell(2).getStringCellValue(); String stringCellValue3 = row.getCell(3).getStringCellValue(); String stringCellValue4 = row.getCell(4).getStringCellValue(); System.out.println(stringCellValue0+"--"+stringCellValue1+"--"+stringCellValue2+"--"+stringCellValue3+"--"+stringCellValue4); } } } 4.显示读取结果 "C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" ... 区域编号--省份--城市--区域--邮编 QY001--北京市--北京市--东城区--110101 QY002--北京市--北京市--西城区--110102 QY003--北京市--北京市--朝阳区--110105 QY004--北京市--北京市--丰台区--110106 QY005--北京市--北京市--石景山区--110107 QY006--北京市--北京市--海淀区--110108 QY007--北京市--北京市--门头沟区--110109 QY008--北京市--北京市--房山区--110111 QY009--北京市--北京市--通州区--110112 QY010--北京市--北京市--顺义区--110113 QY011--北京市--北京市--昌平区--110114 QY012--北京市--北京市--大兴区--110115 QY013--北京市--北京市--怀柔区--110116 QY014--北京市--北京市--平谷区--110117 QY015--北京市--北京市--密云县--110228 QY016--北京市--北京市--延庆县--110229

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册