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<Term> standardList = StandardTokenizer.segment("商品和服务");
- System.out.println(standardList);
结果:
注意:HanLP.segment
其实是对StandardTokenizer.segment
的包装。
2.索引分词
- List<Term> indexList = IndexTokenizer.segment("主副食品");
- for (Term term : indexList)
- {
- System.out.println(term + " [" + term.offset + ":" + (term.offset + term.word.length()) + "]");
- }
结果:
注意:索引分词IndexTokenizer
是面向搜索引擎的分词器,能够对长词全切分,另外通过term.offset
可以获取单词在文本中的偏移量。
3.自然语言分词
- List<Term> 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<Term> 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<CoreDictionary.Attribute>()
- {
- @Override
- public void hit(int begin, int end, CoreDictionary.Attribute value)
- {
- System.out.printf("[%d:%d]=%s %s\n", 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<Term> termList = segment2.seg(sentence);
- System.out.println(termList);
- }
结果:
注意:目前分词器基本上都默认开启了中国人名识别,比如HanLP.segment()
接口中使用的分词器等等,用户不必手动开启;
8.关键字提取
- String content = "程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。";
- List<String> 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通过《同义词词林扩展版》计算而来。
HanLP汉语言分析框架的更多相关文章
- 符号执行-基于python的二进制分析框架angr
转载:All Right 符号执行概述 在学习这个框架之前首先要知道符号执行.符号执行技术使用符号值代替数字值执行程序,得到的变量的值是由输入变 量的符号值和常量组成的表达式.符号执行技术首先由Kin ...
- OSNIT信息收集分析框架OSRFramework
OSNIT信息收集分析框架OSRFramework OSNIT是一种从公开的信息资源搜集信息的有效方式.Kali Linux集成了一款专用分析工具集OSRFramework.该工具集包含多个常用工具 ...
- 开源网络抓包与分析框架学习-Packetbeat篇
开源简介packbeat是一个开源的实时网络抓包与分析框架,内置了很多常见的协议捕获及解析,如HTTP.MySQL.Redis等.在实际使用中,通常和Elasticsearch以及kibana联合使用 ...
- cube.js 开源模块化分析框架
cube.js 是一款很不错的模块化web 应用分析框架.cube.js 的设计主要是面向serverless 服务, 但是同时也支持所有rdbms, cube.js不是一个单体应用,包含了以下部分: ...
- Dubbo学习系列之十六(ELK海量日志分析框架)
外卖公司如何匹配骑手和订单?淘宝如何进行商品推荐?或者读者兴趣匹配?还有海量数据存储搜索.实时日志分析.应用程序监控等场景,Elasticsearch或许可以提供一些思路,作为业界最具影响力的海量搜索 ...
- Dshell----开源攻击分析框架
前言 随着互联网的高速发展,网络安全问题变得至关重要,随着网络的不断规模化和复杂化,网络中拒绝服务(Denial of Service,DoS)攻击和分布式拒绝服务(Distributed Denia ...
- 音频分析框架pyAudioAnalysis文档
“ pyAudioAnalysis是一个非常好用且强大的音频分析开源工具,能实现音频的特征提取.分类和回归模型的训练和执行,以及其他一些实用的功能.此外,本文档并非直译,也有部分比较简略,可以结合源码 ...
- druid.io 海量实时OLAP数据仓库 (翻译+总结) (1)——分析框架如hive或者redshift(MPPDB)、ES等
介绍 我是NDPmedia公司的大数据OLAP的资深高级工程师, 专注于OLAP领域, 现将一个成熟的可靠的高性能的海量实时OLAP数据仓库介绍给大家: druid.io NDPmedia在2014年 ...
- nginx源代码分析--框架设计 & master-worker进程模型
Nginx的框架设计-进程模型 在这之前,我们首先澄清几点事实: nginx作为一个高性能server的特点.事实上这也是全部的高性能server的特点,依赖epoll系统调用的高效(高效是相对sel ...
随机推荐
- Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 上一篇总结了下ArrayList .LinkedList和Vector比较,今天泥瓦匠总结下Hash ...
- Dependency injection in .NET Core的最佳实践
我们知道依赖注入(DI)是一种实现对象及其协作者或依赖关系之间松散耦合的技术. ASP.NET Core包含一个简单的内建容器来支持构造器注入. 我们试图将DI的最佳实践带到.NET Core应用程序 ...
- 呕心沥血之作,最多坑mysql5.7安装教程
前言: 业务需要,需要数据库接binlog发数据变更消息,但是项目用到的数据库是mysql5.6,不支持,于是就有了接下来的一切一切,新的测试服务器上安装mysql5.7 安装步骤: 1.官网下载my ...
- Win32知识之窗口绘制.窗口第一讲
Win32知识之窗口本质 一丶摘要 在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么. 窗口的本质是不断绘制.是windows通过消息机制进行绘制的. 我们知道. ...
- vue+vue-router+vuex实战
shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...
- vim之添加多行和删除多行
1.复制单行和多行. 1)单行复制 在命令模式下,将光标移到将要复制的行处,按“yy”进行复制,按“p”进行粘贴. 2)多行复制 在命令模式下,将光标移到将要复制的行处,按“nyy”进行复制(n代表行 ...
- 数据可视化 seaborn绘图(1)
seaborn是基于matplotlib的数据可视化库.提供更高层的抽象接口.绘图效果也更好. 用seaborn探索数据分布 绘制单变量分布 绘制二变量分布 成对的数据关系可视化 绘制单变量分布 se ...
- SET NOCOUNT { ON | OFF }
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数) SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数. 当 SET NOC ...
- ABP Changing Httpcode status
小弟初来乍到,分享一些工作学习中遇到的问题和解决方式,如有不准确或是有错误的地方,希望不吝赐教,谢过了. --Dogtwo 起因: ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. Abp ...
- 动态编程(Dynamic Programming)
本文素材来自视频,请自备梯子观看:What Is Dynamic Programming and How To Use It Dynamic Programming:动态编程分为如下几步: 将复杂问题 ...