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. Linux编程 17 文件权限(权限设置chmod,改变文件属主属组关系chown,chgrp)

    一. 概述 如果创建了一个目录或文件,有时会需要改变它的安全性设置,在linux系统上有一些工具可以完成这任务,包括使用chmod命令改变已有默认权限,分别能对属主,属组,其它用户的权限的控制分别以读 ...

  2. Android--多线程之图文混排

    前言 本周一直在说Android多线程的那些事儿,本篇博客聊一聊Android开发中一个比较经典的案例,网络数据图文混排,本片博客的案例只涉及关于开启多线程访问网络数据,不涉及缓存的内容.众所周知,从 ...

  3. Python快速学习01:Eclipse上配置PyDev & 'Hello World !'

    前言 系列文章:[传送门] 答应了Vamei,帮他传文章,Python,顺自己学学. 很喜欢这种黏黏的语言 突然发现--我用的GoAgent(谷歌FQ软件),竟然是Python编的. 简介 Pytho ...

  4. springboot情操陶冶-SpringApplication(二)

    承接前文springboot情操陶冶-SpringApplication(一),本文将对run()方法作下详细的解析 SpringApplication#run() main函数经常调用的run()方 ...

  5. Spring Boot (二)集成Jsp与生产环境部署

    一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...

  6. RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用

    深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...

  7. Jenkins入门之导航操作

    通过前面章节讲解我们已经创建了构建任务,我们已经进入了三层目录,如何回到上一级界面?如何直接回到主界面?如何知道我当前所在的位置? 我们看一下红框框选的部分,为Jenkins导航树,从这个导航树,很多 ...

  8. shell脚本动画小工具

    shell脚本动画小工具 看gif图: shell脚本版 脚本内容如下: #!/usr/bin/env bash ## ---------------------------------------- ...

  9. python工程遇到的错误

    1.SyntaxError: Non-ASCII character '\xe5' in file D:\eclipseworkspace\test\test_urllib2.py on line2 ...

  10. iframe关闭操作

    关闭自定义 Div+Iframe弹窗 :window.parent.$("div的id/class/name").remove();//移除div 关闭Iframe弹窗:windo ...