基于ansj_seg和nlp-lang的简单nlp工具类

1、首先在pom中引入ansj_seg和nlp-lang的依赖包,

  ansj_seg包的作用:

    这是一个基于n-Gram+CRF+HMM的中文分词的java实现;

    分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以上;

    目前实现了.中文分词. 中文姓名识别 . 用户自定义词典,关键字提取,自动摘要,关键字标记等功能;

    可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目;

  nlp-lang包的作用(nlp常用工具和组件):

    工具:词语标准化、tire树结构、双数组tire树、文本断句、html标签清理、Viterbi算法增加;

    组件:汉字转拼音、简繁体转换、bloomfilter、指纹去重、SimHash文章相似度计算、词贡献统计、基于内存的搜索提示、WordWeight词频统计,词idf统计,词类别相关度统计;

Maven:

<!-- nlp-lang -->
<dependency><groupId>org.nlpcn</groupId><artifactId>nlp-lang</artifactId><version>1.7.2</version>
</dependency>
<!-- ansj_seg -->
<dependency><groupId>org.ansj</groupId><artifactId>ansj_seg</artifactId><version>5.1.2</version>
</dependency>

2、创建WordUtil类,如下:

package com.mengyao.nlp.util;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;import org.ansj.app.keyword.KeyWordComputer;
import org.ansj.app.keyword.Keyword;
import org.ansj.app.summary.SummaryComputer;
import org.ansj.app.summary.pojo.Summary;
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.IndexAnalysis;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.ansj.splitWord.analysis.ToAnalysis;
import org.apache.commons.lang3.StringUtils;
import org.nlpcn.commons.lang.jianfan.JianFan;
import org.nlpcn.commons.lang.pinyin.Pinyin;
import org.nlpcn.commons.lang.util.WordAlert;
import org.nlpcn.commons.lang.util.WordWeight;/*** * @author mengyao**/
public class WordUtil {public static void main(String[] args) {System.out.println("2016/06/25".matches("^\\d{4}(\\-|\\/|\\.)\\d{1,2}\\1\\d{1,2}$"));System.out.println("20160625".matches("^\\d{8}$"));}/*** 文章摘要* @param title* @param content* @return*/public static String getSummary(String title, String content) {SummaryComputer summaryComputer = new SummaryComputer(title, content);Summary summary = summaryComputer.toSummary();return summary.getSummary();}/*** 带标题的文章关键词提取* @param title* @param content* @return*/public static List<Keyword> getKeyWord(String title, String content) {List<Keyword> keyWords = new ArrayList<Keyword>();KeyWordComputer<NlpAnalysis> kwc = new KeyWordComputer<NlpAnalysis>(20);Collection<Keyword> result = kwc.computeArticleTfidf(title, content);for (Keyword keyword : result) {keyWords.add(keyword);}return keyWords;} /*** 不带标题的文章关键词提取* @param content* @return*/public static List<Keyword> getKeyWord2(String content) {List<Keyword> keyWords = new ArrayList<Keyword>();KeyWordComputer<NlpAnalysis> kwc = new KeyWordComputer<NlpAnalysis>(20);Collection<Keyword> result = kwc.computeArticleTfidf(content);for (Keyword keyword : result) {keyWords.add(keyword);}return keyWords;} /*** 标准分词* @param text* @return*/public static List<Term> getToSeg(String text) {List<Term> words = new ArrayList<Term>();Result parse = ToAnalysis.parse(text);for (Term term : parse) {if (null!=term.getName()&&!term.getName().trim().isEmpty()) {words.add(term);}}return words;}/*** NLP分词* @param text* @return*/public static List<Term> getNlpSeg(String text) {List<Term> words = new ArrayList<Term>();Result parse = NlpAnalysis.parse(text);for (Term term : parse) {if (null!=term.getName()&&!term.getName().trim().isEmpty()) {words.add(term);}}return words;}/*** Index分词* @param text* @return*/public static List<Term> getIndexSeg(String text) {List<Term> words = new ArrayList<Term>();Result parse = IndexAnalysis.parse(text);for (Term term : parse) {if (null!=term.getName()&&!term.getName().trim().isEmpty()) {words.add(term);}}return words;}/*** 简体转繁体* @param word* @return*/public static String jian2fan(String text) {return JianFan.j2f(text);}/*** 繁体转简体* @param word* @return*/public static String fan2jian(String text) {return JianFan.f2j(text);}/*** 拼音(不带音标)* @param word* @return*/public static String pinyin(String text) {StringBuilder builder = new StringBuilder();List<String> pinyins = Pinyin.pinyin(text);for (String pinyin : pinyins) {if (null != pinyin) {builder.append(pinyin+" ");                }}return builder.toString();}/*** 拼音(不带音标,首字母大写)* @param word* @return*/public static String pinyinUp(String text) {StringBuilder builder = new StringBuilder();List<String> pinyins = Pinyin.pinyin(text);for (String pinyin : pinyins) {if (StringUtils.isEmpty(pinyin)) {continue;}builder.append(pinyin.substring(0,1).toUpperCase()+pinyin.substring(1));}return builder.toString();}/*** 拼音(带数字音标)* @param word* @return*/public static String tonePinyin(String text) {StringBuilder builder = new StringBuilder();List<String> pinyins = Pinyin.tonePinyin(text);for (String pinyin : pinyins) {if (null != pinyin) {builder.append(pinyin+" ");                }}return builder.toString();}/*** 拼音(带符号音标)* @param word* @return*/public static String unicodePinyin(String text) {StringBuilder builder = new StringBuilder();List<String> pinyins = Pinyin.unicodePinyin(text);for (String pinyin : pinyins) {if (null != pinyin) {builder.append(pinyin+" ");                }}return builder.toString();}/*** 词频统计* @param words* @return*/public static Map<String, Double> wordCount(List<String> words) {WordWeight ww = new WordWeight();for (String word : words) {ww.add(word);}return ww.export();}/*** 词频统计* @param words* @return*/public static List<String> wordCount1(List<String> words) {List<String> wcs = new ArrayList<String>();WordWeight ww = new WordWeight();for (String word : words) {ww.add(word);}Map<String, Double> export = ww.export();for (Entry<String, Double> entry : export.entrySet()) {wcs.add(entry.getKey()+":"+entry.getValue());}return wcs;}/*** 语种识别:1英文;0中文* @param words* @return*/public static int language(String word) {return WordAlert.isEnglish(word)?1:0;}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArrayList的四种初始化方法

转载&#xff1a;https://beginnersbook.com/2013/12/how-to-initialize-an-arraylist/ Method 1: Initialization using Arrays.asList Syntax: ArrayList<Type> obj new ArrayList<Type>(Arrays.asList(Object o1, Object o2, Object o3, ....so on)); Exam…

C++ Deque(双向队列

C Deque(双向队列)C Deque(双向队列) 是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问&#xff0c;但它不像vector 把所有的对象保存在一块连续的内存块&#xff0c;而是采用多个连续的存储块&#xff0c;并且在一个映射结构中保存…

java.lang.IllegalArgumentException: URLDecoder异常解决

异常&#xff1a; Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u9" at java.net.URLDecoder.decode(URLDecoder.java:194) at com.hbzx.co…

STL迭代器

STL迭代器及总结解释迭代器是一种对象&#xff0c;它能够用来遍历STL容器中的部分或全部元素&#xff0c;每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口&#xff0c;所谓迭代器是一种概念上的抽象&#xff1a;那些行为上象迭代器的东西都可以叫做迭代器。…

C++ Sets MultiSets

C Sets & MultiSetsSTL Set介绍 集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合(Sets)相像&#xff0c;只不过支持重复对象,其用法与set基本相同。Set 又称集合&#xff0c;实际上就是一组元素的集合&#xff0c;但其中所包含的元素的值是唯一的&am…

SSDB 配置文件详解

SSDB 的配置非常简单, 附带的 ssdb.conf 你不用修改便可以使用. 如果你要高度定制, 还是需要修改一些配置的. 下面做介绍. SSDB 的配置文件是一种层级 key-value 的静态配置文件, 通过一个 TAB 缩进来表示层级关系. 以 # 号开始的行是注释. 标准的配置文件如下: # ssdb-serve…

C++ Maps MultiMaps

C Maps & MultiMapsC Maps & MultiMaps C Maps是一种关联式容器&#xff0c;包含“关键字/值”对。C Multimaps和maps很相似&#xff0c;但是MultiMaps允许重复的元素。1.begin() 返回指向map头部的迭代器2.clear() 删除所有元素3.count() 返回指定元素出现的次数语法…

英语单词词干化表

博客&#xff1a;https://blog.csdn.net/potato012345/article/details/78091939 下载地址&#xff1a;https://github.com/Zhangtd/MorTransformation

c++ List(双向链表)

c List(双向链表)List(双向链表)介绍: List是一个线性链表结构&#xff0c;它的数据由若干个节点构成&#xff0c;每一个节点都包括一个信息块&#xff08;即实际存储的数据&#xff09;、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩&#x…

Arrays.deepToString的使用

今天看别人的代码引用了这个函数&#xff0c;发现原来遍历数组(非List&#xff0c;例如&#xff1a;int [][] 类型等)可以直接调用Arrays.deepToString(数组名)可以直接输出结果&#xff0c;以前还傻不啦叽的的转换成List数组或者是for循环遍历。 Integer[][] allMovieComment…

C++ Vector(向量容器)

Vector介绍C Vector&#xff08;向量容器&#xff09; 是一个线性顺序结构。相当于数组&#xff0c;但其大小可以不预先指定&#xff0c;并且自动扩展。它可以像数组一样被操作&#xff0c;由于它的特性我们完全可以将vector 看作动态数组。 在创建一个vector 后&#xff0c;它…

出现特殊分隔符无法分隔解决方案

今天处理文本数据时候遇到这种文本用空格和tab正则匹配没有作用&#xff0c;后来问了同事发现可以用“\\uf8f5”去匹配。 待处理文本&#xff1a; A abbr.安  A-10IInone.美空军主力近距离空中支援攻击机&#xff0c;无愧为“坦克杀手”。 A-12none.夭折的美海…

java英文单词单复数转换

package steam;import java.util.*; import java.util.regex.*; /*** * 单复数转换类* 2018年12月30日*/public class Inflector {private static final Pattern UNDERSCORE_PATTERN_1 Pattern.compile("([A-Z])([A-Z][a-z])");private static final Pattern UNDERS…

最全英语单词下载地址

这两天搜集英文单词做词干化处理&#xff0c;虽说standford-NLP可以处理&#xff0c;但是效率不高&#xff0c;自己动手找单词做映射表&#xff0c;找单词真的痛苦&#xff01;&#xff01;&#xff01;放出以下地址最为保存和分享 github&#xff1a; https://github.com/dw…

NLP英文缩写词性含义

1. CC Coordinating conjunction 连接词 2. CD Cardinal number 基数词 3. DT Determiner 限定词&#xff08;如this,that,these,those,such&#xff0c;不定限定词&#xff1a;no,some,any,each,every,enough,either,neither,all,both,half,sever…

redis通过expire设置存活期注意问题

今天老大检查之前所做的项目发现项目过期数据仍然残留并没有删除&#xff0c;本以为自己设置了存活期就不用管数据了会自动删除掉&#xff0c;啊&#xff0c;果然自己太马虎了&#xff0c;如果是传统的kv类型&#xff0c;通过expire(key&#xff0c;alive_time)没有错误&#x…

次幂函数取模算法

次幂函数取模算法 高次幂函数取模算法 在平常的工作学习中&#xff0c;我们经常需要用到求取一个数字或者幂运算的余数&#xff0c;尤其在密码学中最为常用的RSA算法就经常要用到这种运算&#xff0c;我们称之为高次幂函数的取模运算。 在本篇文章中&#xff0c;将会首先介绍运…

【转载保存】接口压力测试安装与使用

https://blog.csdn.net/qq_26525215/article/details/79182674

mysql日期格式转换

select * from news where DATE_FORMAT(news_time, %Y-%m-%d %k:%i:%s) < " "" curDate "

java单例模式双重检查

public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton null) {synchronized (Singleton.class) {if (singleton null) {singleton new Singleton();}}}return singleton;} }