HanLP网址 http://hanlp.com/
一、首先 Maven引入如下包:
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.7.3</version>
</dependency>
二、下载HanLP数据包(data文件)
点击下载HanLP数据包
三、加入HanLP配置文件,指定下HanLP数据包(只需要修改如下root参数即可,该参数指定data所在的目录)
root参数为data的父目录即可,比如data目录是 D:/demo/data ,那么root= D:/demo/ 即可。
最后将 hanlp.properties 配置文件放入classpath即可,对于多数项目,都可以放到src或resources目录下,编译时IDE会自动将其复制到classpath中。除了配置文件外,还可以使用环境变量HANLP_ROOT来设置root。
如果放置不当,HanLP会提示当前环境下的合适路径,并且尝试从项目根目录读取数据集。
配置文件如下:
#本配置文件中的路径的根目录,根目录+其他路径=完整路径(支持相对路径,请参考:https://github.com/hankcs/HanLP/pull/254)
#Windows用户请注意,路径分隔符统一使用/
root=D:/demo/
#好了,以上为唯一需要修改的部分,以下配置项按需反注释编辑。
#核心词典路径
#CoreDictionaryPath=data/dictionary/CoreNatureDictionary.txt
#2元语法词典路径
#BiGramDictionaryPath=data/dictionary/CoreNatureDictionary.ngram.txt
#自定义词典路径,用;隔开多个自定义词典,空格开头表示在同一个目录,使用“文件名 词性”形式则表示这个词典的词性默认是该词性。优先级递减。
#所有词典统一使用UTF-8编码,每一行代表一个单词,格式遵从[单词] [词性A] [A的频次] [词性B] [B的频次] ... 如果不填词性则表示采用词典的默认词性。
CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 现代汉语补充词库.txt; 全国地名大全.txt ns; 人名词典.txt; 机构名词典.txt; 上海地名.txt ns;data/dictionary/person/nrf.txt nrf;
#停用词词典路径
#CoreStopWordDictionaryPath=data/dictionary/stopwords.txt
#同义词词典路径
#CoreSynonymDictionaryDictionaryPath=data/dictionary/synonym/CoreSynonym.txt
#人名词典路径
#PersonDictionaryPath=data/dictionary/person/nr.txt
#人名词典转移矩阵路径
#PersonDictionaryTrPath=data/dictionary/person/nr.tr.txt
#繁简词典根目录
#tcDictionaryRoot=data/dictionary/tc
#HMM分词模型
#HMMSegmentModelPath=data/model/segment/HMMSegmentModel.bin
#分词结果是否展示词性
#ShowTermNature=true
#IO适配器,实现com.hankcs.hanlp.corpus.io.IIOAdapter接口以在不同的平台(Hadoop、Redis等)上运行HanLP
#默认的IO适配器如下,该适配器是基于普通文件系统的。
#IOAdapter=com.hankcs.hanlp.corpus.io.FileIOAdapter
#感知机词法分析器
#PerceptronCWSModelPath=data/model/perceptron/pku1998/cws.bin
#PerceptronPOSModelPath=data/model/perceptron/pku1998/pos.bin
#PerceptronNERModelPath=data/model/perceptron/pku1998/ner.bin
#CRF词法分析器
#CRFCWSModelPath=data/model/crf/pku199801/cws.txt
#CRFPOSModelPath=data/model/crf/pku199801/pos.txt
#CRFNERModelPath=data/model/crf/pku199801/ner.txt
#更多配置项请参考 https://github.com/hankcs/HanLP/blob/master/src/main/java/com/hankcs/hanlp/HanLP.java#L59 自行添加
以上三步环境就配置好了,下面我贴下演示代码如下:
package com;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;
/**
* 基于hanlp 分词 并计算 词频演示
* @author mszhou
*/
public class Demo {
//返回的分词对象
class WordLabe{
//分词
private String label;
//词频
private int wordFrequency;
public WordLabe() {}
public WordLabe(String label, int wordFrequency) {
this.label = label;
this.wordFrequency = wordFrequency;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public int getWordFrequency() {
return wordFrequency;
}
public void setWordFrequency(int wordFrequency) {
this.wordFrequency = wordFrequency;
}
}
/**
* 获取分词并计算词频
* @param content 需要分词的内容
* @param topNum 需要返回前多少条分词
* @return
*/
public List<WordLabe> wordDemoFun(String content,int topNum){
//需要过滤的字符
String filterStr = "`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、? ";
//保存数据分词数据
Map<String, WordLabe> extractLabelMap = new HashMap<String, WordLabe>(16);
//计算分词
List<Term> termList = HanLP.segment(content);
//过滤一下字符
List<String> list = termList.stream().map(a -> a.word).filter(s -> !filterStr.contains(s)).collect(Collectors.toList());
//计算词频并封装ExtractLabelDto对象
for (String word : list) {
//判断不存在则新增(去重)
if (extractLabelMap.get(word) == null) {
//计算获取词频(获取word在list中重复的次数)
int count = Collections.frequency(list, word);
//封装成WordLabe对象
extractLabelMap.put(word, new WordLabe(word, count));
}
}
//map转list
List<WordLabe> extractLabellist = new ArrayList<WordLabe>(extractLabelMap.values());
//针对词频数量降序排序
Collections.sort(extractLabellist, new Comparator<WordLabe>() {
@Override
public int compare(WordLabe o1, WordLabe o2) {
//降序排序
return o2.getWordFrequency() - o1.getWordFrequency();
}
});
//如果大于topNum 则返回前 topNum 个
return extractLabellist.size() > topNum ? extractLabellist.subList(0,topNum) : extractLabellist;
}
//测试
public static void main(String[] args) {
List<WordLabe> list = new Demo().wordDemoFun("这是测试呀测试测呀 斯卡萨",5);
System.out.println(list);
}
}