使用HanLP框架为内容分词并计算词频

HanLP网址 http://hanlp.com/

一、首先 Maven引入如下包:


    com.hankcs
    hanlp
    portable-1.7.3

二、下载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 wordDemoFun(String content,int topNum){
	        //需要过滤的字符
	        String filterStr = "`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、? ";
	        //保存数据分词数据
	        Map extractLabelMap = new HashMap(16);
	        //计算分词
	        List termList = HanLP.segment(content);
	        //过滤一下字符
	        List 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 extractLabellist = new ArrayList(extractLabelMap.values());
	        //针对词频数量降序排序
	        Collections.sort(extractLabellist, new Comparator() {
	            @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 list = new Demo().wordDemoFun("这是测试呀测试测呀 斯卡萨",5);
			System.out.println(list);
			
	    }
	
}

你可能感兴趣的:(HanLP)