HanLP(Han Language Processing)是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。

HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。

环境搭建

1.创建java项目,导入HanLP必要的包

2.把对应的配置文件放置在src下

3.修改hanlp.properties配置文件,使其指向data(data中包含词典和模型)的上级路径,修改如下,

代码运行

1.第一个Demo

  1. System.out.println(HanLP.segment("你好,欢迎使用HanLP汉语处理包!"));
  2. //标准分词
  3. List<Term> standardList = StandardTokenizer.segment("商品和服务");
  4. System.out.println(standardList);

结果:

注意:HanLP.segment其实是对StandardTokenizer.segment的包装。

2.索引分词

  1. List<Term> indexList = IndexTokenizer.segment("主副食品");
  2. for (Term term : indexList)
  3. {
  4. System.out.println(term + " [" + term.offset + ":" + (term.offset + term.word.length()) + "]");
  5. }

结果:

注意:索引分词IndexTokenizer是面向搜索引擎的分词器,能够对长词全切分,另外通过term.offset可以获取单词在文本中的偏移量。

3.自然语言分词

  1. List<Term> nlpList = NLPTokenizer.segment("中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程");
  2. System.out.println(nlpList);

结果:

注意:自然语言分词NLPTokenizer会执行全部命名实体识别和词性标注。

4.最短路径分词&N-最短路径分词

  1. String[] testCase = new String[]{
  2. "今天,刘志军案的关键人物,山西女商人丁书苗在市二中院出庭受审。",
  3. "刘喜杰石国祥会见吴亚琴先进事迹报告团成员",
  4. };
  5. //N-最短路径分词
  6. Segment nShortSegment = new NShortSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);
  7. for (String sentence : testCase)
  8. {
  9. System.out.println("N-最短分词:" + nShortSegment.seg(sentence));
  10. }
  11. //最短路径分词
  12. Segment shortestSegment = new DijkstraSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);
  13. for (String sentence : testCase)
  14. {
  15. System.out.println("最短路分词:" + shortestSegment.seg(sentence));
  16. }

结果:

注意:

  • N最短路分词器NShortSegment比最短路分词器慢,但是效果稍微好一些,对命名实体识别能力更强。

  • 一般场景下最短路分词的精度已经足够,而且速度比N最短路分词器快几倍,请酌情选择。

5.CRF(条件随机场算法)分词

  1. Segment segment = new CRFSegment();
  2. segment.enablePartOfSpeechTagging(true);
  3. List<Term> crfList = segment.seg("你看过环太平洋吗");
  4. System.out.println(crfList);
  5. for (Term term : crfList)
  6. {
  7. if (term.nature == null)
  8. {
  9. System.out.println("识别到新词:" + term.word);
  10. }
  11. }

结果:

注意:CRF对新词有很好的识别能力,但是无法利用自定义词典。

6.用户自定义词典

  1. // 动态增加
  2. CustomDictionary.add("攻城狮");
  3. // 强行插入
  4. CustomDictionary.insert("白富美", "nz 1024");
  5. // 删除词语(注释掉试试)
  6. //CustomDictionary.remove("攻城狮");
  7. System.out.println(CustomDictionary.add("单身狗", "nz 1024 n 1"));
  8. System.out.println("单身狗 : " + CustomDictionary.get("单身狗"));
  9. String text2 = "攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰";
  10. String text23 = "王重阳和步惊云一起讨论盖聂的百步飞剑的诀窍! ";
  11. // AhoCorasickDoubleArrayTrie自动机分词
  12. final char[] charArray = text23.toCharArray();
  13. CustomDictionary.parseText(charArray, new AhoCorasickDoubleArrayTrie.IHit<CoreDictionary.Attribute>()
  14. {
  15. @Override
  16. public void hit(int begin, int end, CoreDictionary.Attribute value)
  17. {
  18. System.out.printf("[%d:%d]=%s %s\n", begin, end, new String(charArray, begin, end - begin), value);
  19. }
  20. });

结果:

注意:

  • CustomDictionary是一份全局的用户自定义词典,可以随时增删,影响全部分词器。

  • 另外可以在任何分词器中关闭它。通过代码动态增删不会保存到词典文件。

7.中国人名识别

  1. String[] testCase2 = new String[]{
  2. "签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。",
  3. "张浩和胡健康复员回家了",
  4. "编剧邵钧林和稽道青说",
  5. "这里有关天培的有关事迹",
  6. "龚学平等领导,邓颖超生前",
  7. };
  8. Segment segment2 = HanLP.newSegment().enableNameRecognize(true);
  9. for (String sentence : testCase2)
  10. {
  11. List<Term> termList = segment2.seg(sentence);
  12. System.out.println(termList);
  13. }

结果:

注意:目前分词器基本上都默认开启了中国人名识别,比如HanLP.segment()接口中使用的分词器等等,用户不必手动开启;

8.关键字提取

  1. String content = "程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。";
  2. List<String> keywordList = HanLP.extractKeyword(content, 5);
  3. System.out.println(keywordList);

结果:

注意:其内部采用TextRankKeyword(类谷歌的PageRank)实现,用户可以直接调用TextRankKeyword.getKeywordList(document, size)。

9.简繁转换

  1. System.out.println(HanLP.convertToTraditionalChinese("用笔记本电脑写程序"));
  2. 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通过《同义词词林扩展版》计算而来。

HanLP汉语言分析框架的更多相关文章

  1. 符号执行-基于python的二进制分析框架angr

    转载:All Right 符号执行概述 在学习这个框架之前首先要知道符号执行.符号执行技术使用符号值代替数字值执行程序,得到的变量的值是由输入变 量的符号值和常量组成的表达式.符号执行技术首先由Kin ...

  2. OSNIT信息收集分析框架OSRFramework

     OSNIT信息收集分析框架OSRFramework OSNIT是一种从公开的信息资源搜集信息的有效方式.Kali Linux集成了一款专用分析工具集OSRFramework.该工具集包含多个常用工具 ...

  3. 开源网络抓包与分析框架学习-Packetbeat篇

    开源简介packbeat是一个开源的实时网络抓包与分析框架,内置了很多常见的协议捕获及解析,如HTTP.MySQL.Redis等.在实际使用中,通常和Elasticsearch以及kibana联合使用 ...

  4. cube.js 开源模块化分析框架

    cube.js 是一款很不错的模块化web 应用分析框架.cube.js 的设计主要是面向serverless 服务, 但是同时也支持所有rdbms, cube.js不是一个单体应用,包含了以下部分: ...

  5. Dubbo学习系列之十六(ELK海量日志分析框架)

    外卖公司如何匹配骑手和订单?淘宝如何进行商品推荐?或者读者兴趣匹配?还有海量数据存储搜索.实时日志分析.应用程序监控等场景,Elasticsearch或许可以提供一些思路,作为业界最具影响力的海量搜索 ...

  6. Dshell----开源攻击分析框架

    前言 随着互联网的高速发展,网络安全问题变得至关重要,随着网络的不断规模化和复杂化,网络中拒绝服务(Denial of Service,DoS)攻击和分布式拒绝服务(Distributed Denia ...

  7. 音频分析框架pyAudioAnalysis文档

    “ pyAudioAnalysis是一个非常好用且强大的音频分析开源工具,能实现音频的特征提取.分类和回归模型的训练和执行,以及其他一些实用的功能.此外,本文档并非直译,也有部分比较简略,可以结合源码 ...

  8. druid.io 海量实时OLAP数据仓库 (翻译+总结) (1)——分析框架如hive或者redshift(MPPDB)、ES等

    介绍 我是NDPmedia公司的大数据OLAP的资深高级工程师, 专注于OLAP领域, 现将一个成熟的可靠的高性能的海量实时OLAP数据仓库介绍给大家: druid.io NDPmedia在2014年 ...

  9. nginx源代码分析--框架设计 &amp; master-worker进程模型

    Nginx的框架设计-进程模型 在这之前,我们首先澄清几点事实: nginx作为一个高性能server的特点.事实上这也是全部的高性能server的特点,依赖epoll系统调用的高效(高效是相对sel ...

随机推荐

  1. 项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化

    原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 弟子规 圣人训 首孝弟 次谨信 泛爱众 而亲仁 有余力 则学文 Written In ...

  2. 从零开始学 Web 之 Vue.js(五)Vue的动画

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  3. spring3.0框架检测方法运行时间测试(转)

    主要利用了Spring AOP 技术,对想要统计的方法进行横切处理,方法执行前开始计时,方法执行后停止计时,得到计时方法就是该方法本次消耗时间. 步骤: 首先编写自己的Interceptor类来实现M ...

  4. [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  5. vue-07-自定义指令

    1, 全局指令 在main.js中引入 // 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserte ...

  6. Python3获取拉勾网招聘信息

    为了了解跟python数据分析有关行业的信息,大概地了解一下对这个行业的要求以及薪资状况,我决定从网上获取信息并进行分析.既然想要分析就必须要有数据,于是我选择了拉勾,冒着危险深入内部,从他们那里得到 ...

  7. Java中的Interrupt使用

    初心 用interrupt中断程序 初步实现 public class InterruptionInJava implements Runnable{ @Override public void ru ...

  8. 痞子衡嵌入式:开源软件协议(MIT/BSD/Apache/LGPL/MPL/GPL)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是关于开源软件协议基本知识. 牛顿曾说过:"如果我比别人看得更远,那是因为我站在巨人的肩上".在软件开发中如果说也存在巨 ...

  9. LeetCode算法扫题系列19

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9104677.html LeetCode算法第19题(难度:中等) 题目:给定一个链表,删 ...

  10. 简单说明CGI和动态请求是什么

    1. CGI是什么 CGI是common gateway interface的缩写,大家都译作通用网关接口,但很不幸,我们无法见名知意. 我们知道,web服务器所处理的内容都是静态的,要想处理动态内容 ...