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. 导入项目的时候报错Error:Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha7

    问题描述 今天在导入项目的时候报错: Error:Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha ...

  2. Android布局中的空格以及占一个汉字宽度的空格,实现不同汉字字数对齐

    前言 在Android布局中进行使用到空格,以便实现文字的对齐.那么在Android中如何表示一个空格呢? 空格: (普通的英文半角空格但不换行) 窄空格:   (中文全角空格 (一个中文宽度))   ...

  3. Java的运行原理(转载)

    在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器.这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口.编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由 ...

  4. Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  5. 在关闭页面时自动清除Session cookie,页面缓存

    在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息. 清除session对 ...

  6. clion调试postgresql

    clion怎么调试postgresql呢? clion使用cmake去编译项目的,但是大家编译postgresql用的是make.虽然项目中也有CMakeLists.txt文件,但是cmake会报错, ...

  7. 读写锁ReentrantReadWriteLock:读读共享,读写互斥,写写互斥

    介绍 DK1.5之后,提供了读写锁ReentrantReadWriteLock,读写锁维护了一对锁:一个读锁,一个写锁.通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升.在读多写少的情况下, ...

  8. #2 Python面向对象(一)

    前言 对于萌新来说,面向对象,这是一个很陌生的词语.如果你接触过Linux,你一定知道“一切皆文件”,也就是说,在Linux中所有都是文件,鼠标是文件.键盘是文件.目录是文件等等一切都是文件:Pyth ...

  9. 深入MySQL复制(三):半同步复制

    1.半同步复制 半同步复制官方手册:https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html 默认情况下,MySQL的复制是异 ...

  10. [转]RPA简介

    本文转自:https://www.cnblogs.com/wendyzheng/articles/9211530.html 开篇: 公司正在全面推广RPA,正好借此机会学习一下,发现国内对RPA的了解 ...