赞
踩
HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
HanLP提供下列功能:
在提供丰富功能的同时,HanLP内部模块坚持低耦合、模型坚持惰性加载、服务坚持静态提供、词典坚持明文发布,使用非常方便。默认模型训练自全世界最大规模的中文语料库,同时自带一些语料处理工具,帮助用户训练自己的模型。
在线演示、Python调用、Solr及Lucene插件、论文引用、更多信息。
下载后解压到任意目录,接下来通过配置文件告诉HanLP数据包的位置。
HanLP中的数据分为词典和模型,其中词典是词法分析必需的,模型是句法分析必需的。
- data
- │
- ├─dictionary
- └─model
用户可以自行增删替换,如果不需要句法分析等功能的话,随时可以删除model文件夹。
解压后如图:
配置文件的作用是告诉HanLP数据包的位置,只需修改第一行
root=D:/JavaProjects/HanLP/
为data的父目录即可,比如data目录是/Users/hankcs/Documents/data
,那么root=/Users/hankcs/Documents/
。
最后将hanlp.properties
放入classpath即可,对于多数项目,都可以放到src或resources目录下,编译时IDE会自动将其复制到classpath中。除了配置文件外,还可以使用环境变量HANLP_ROOT
来设置root
。安卓项目请参考demo。
如果放置不当,HanLP会提示当前环境下的合适路径,并且尝试从项目根目录读取数据集。
注意:在lib文件夹中也要放配置文件,不然编译错误。
配置完成项目如图:
HanLP几乎所有的功能都可以通过工具类HanLP
快捷调用,当你想不起来调用方法时,只需键入HanLP.
,IDE应当会给出提示,并展示HanLP完善的文档。
所有Demo都位于com.hankcs.demo下,比文档覆盖了更多细节,更新更及时,强烈建议运行一遍。此处仅列举部分常用接口。
System.out.println(HanLP.segment("你好,欢迎使用HanLP汉语处理包!"));
运行成功如下:
[你好/vl, ,/w, 欢迎/v, 使用/v, HanLP/nx, 汉语/gi, 处理/vn, 包/v, !/w]
- List<Term> termList = StandardTokenizer.segment("商品和服务");
- System.out.println(termList);
Tokenizer
结尾,在接下来的例子中会继续介绍。HanLP.segment
其实是对StandardTokenizer.segment
的包装。- System.out.println(NLPTokenizer.segment("我新造一个词叫幻想乡你能识别并标注正确词性吗?"));
- // 注意观察下面两个“希望”的词性、两个“晚霞”的词性
- System.out.println(NLPTokenizer.analyze("我的希望是希望张晚霞的背影被晚霞映红").translateLabels());
- System.out.println(NLPTokenizer.analyze("支援臺灣正體香港繁體:微软公司於1975年由比爾·蓋茲和保羅·艾倫創立。"));
NLPTokenizer
会执行词性标注和命名实体识别,由结构化感知机序列标注框架支撑。9970
万字的大型综合语料库,是已知范围内全世界最大的中文分词语料库。语料库规模决定实际效果,面向生产环境的语料库应当在千万字量级。欢迎用户在自己的语料上训练新模型以适应新领域、识别新的命名实体。- List<Term> termList = IndexTokenizer.segment("主副食品");
- for (Term term : termList)
- {
- System.out.println(term + " [" + term.offset + ":" + (term.offset + term.word.length()) + "]");
- }
IndexTokenizer
是面向搜索引擎的分词器,能够对长词全切分,另外通过term.offset
可以获取单词在文本中的偏移量。Segment
的enableIndexMode
方法激活索引模式。- Segment nShortSegment = new NShortSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);
- Segment shortestSegment = new DijkstraSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);
- String[] testCase = new String[]{
- "今天,刘志军案的关键人物,山西女商人丁书苗在市二中院出庭受审。",
- "刘喜杰石国祥会见吴亚琴先进事迹报告团成员",
- };
- for (String sentence : testCase)
- {
- System.out.println("N-最短分词:" + nShortSegment.seg(sentence) + "\n最短路分词:" + shortestSegment.seg(sentence));
- }
NShortSegment
比最短路分词器慢,但是效果稍微好一些,对命名实体识别能力更强。- CRFLexicalAnalyzer analyzer = new CRFLexicalAnalyzer();
- String[] tests = new String[]{
- "商品和服务",
- "上海华安工业(集团)公司董事长谭旭光和秘书胡花蕊来到美国纽约现代艺术博物馆参观",
- "微软公司於1975年由比爾·蓋茲和保羅·艾倫創立,18年啟動以智慧雲端、前端為導向的大改組。" // 支持繁体中文
- };
- for (String sentence : tests)
- {
- System.out.println(analyzer.analyze(sentence));
- }
- /**
- * 演示极速分词,基于AhoCorasickDoubleArrayTrie实现的词典分词,适用于“高吞吐量”“精度一般”的场合
- * @author hankcs
- */
- public class DemoHighSpeedSegment
- {
- public static void main(String[] args)
- {
- String text = "江西鄱阳湖干枯,中国最大淡水湖变成大草原";
- System.out.println(SpeedTokenizer.segment(text));
- long start = System.currentTimeMillis();
- int pressure = 1000000;
- for (int i = 0; i < pressure; ++i)
- {
- SpeedTokenizer.segment(text);
- }
- double costTime = (System.currentTimeMillis() - start) / (double)1000;
- System.out.printf("分词速度:%.2f字每秒", text.length() * pressure / costTime);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。