java应用集成HanLP进行中文自然语言分词详细完整案例以及demo

news2024/12/24 0:10:05

本文可以作为上一篇《mysql/mariadb 实现全文检索》的补充,实现对字符串分词的逻辑

什么是自然语言,什么是自然语言分词及例子

什么是自然语言

狭义地讲,利用计算机进行语言分析的研究是一门语言学与计算机科学的交叉学科,学术界称之为计算语言学,或者是自然语言处理,可以理解为语言学范畴+计算模型[1]。其中,语言学范畴是指由语言学家定义的语言学概念和标准,如词、词性、语法、语义角色、篇章结构等,自然语言处理的任务大多来源于此,但具体实现的计算模型或算法通常由计算机学家研制。

一般来说,通用的自然语言处理总是与语言学领域的范畴直接相关联的,研究包括词干提取、分词、词性标注、命名实体识别、词义消歧、组块识别、句法分析、语义角色标注、篇章分析等。还有一些自然语言处理研究不与语言学范畴直接关联,而是面向文本处理应用的,比如机器翻译、信息抽取、情感分类、信息检索、问答系统等,这些面向应用的自然语言处理技术多少会依赖于前面所介绍的几类自然语言处理基础研究

什么是自然语言分词及例子

举个例子 ,这句话 “你好美丽的祖国大地,

你好美丽的大好河山”,如果分解成人类可以理解的词组,用程序的话该怎么分呢,程序不是人类,没法判断哪几个字组成一个词

所以这时候自然语言分词就该排上作用了,我跑自然分词得程序结果,“你好 美丽 的 祖国 大地 , 你好 美丽 的 大好河山”,

可以看得出基本上是按照人类理解的词语分词的

实现自然语言分词的一些框架

SnowNLP, Thulac, HanLP,LTP,CoreNLP

hanLP介绍以及优点

hanLP 官网域名 hanlp.hankcs.com

面向生产环境的多语种自然语言处理工具包,基于PyTorch和TensorFlow 2.x双引擎,目标是普及落地最前沿的NLP技术。HanLP具备功能完善、精度准确、性能高效、语料时新、架构清晰、可自定义的特点。

借助世界上最大的多语种语料库,HanLP2.1支持包括简繁中英日俄法德在内的130种语言上的10种联合任务以及多种单任务。HanLP预训练了十几种任务上的数十个模型并且正在持续迭代语料库与模型:

java应用程序集成hanLP实现自然语言分词

代码结构

在这里插入图片描述

自然语言包下载

自然语言包也就是输入字符串进行匹配我们类似新华字典或者单词词典的分词基础

也就是上图的hanlp-dir

自然语言包下载地址

在这里插入图片描述

最新版语言包下载地址

解压后将语言包放到某个目录下即可

自然语言包配置

resource资源文件夹下新建hanlp.perperties ,如下图:

在这里插入图片描述

hanlp.properties 配置文件内容如下:

#本配置文件中的路径的根目录,根目录+其他路径=完整路径(支持相对路径,请参考:https://github.com/hankcs/HanLP/pull/254)
#Windows用户请注意,路径分隔符统一使用/
root=E:/code/study/study-foundation/study-foundation-one/hanlp-dir

#好了,以上为唯一需要修改的部分,以下配置项按需反注释编辑。

#核心词典路径
#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 自行添加

重点是这个部分

这个是指定语言包根目录的

在这里插入图片描述

java 代码明细

Word.java

public class Word implements Comparable {

    // 词名
    private String name;
    // 词性
    private String pos;
    // 权重,用于词向量分析
    private Float weight;

    public Word(String name, String pos) {
        this.name = name;
        this.pos = pos;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(this.name);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Word other = (Word) obj;
        return Objects.equals(this.name, other.name);
    }

    @Override
    public String toString() {
        StringBuilder str = new StringBuilder();
        if (name != null) {
            str.append(name);
        }
        if (pos != null) {
            str.append("/").append(pos);
        }

        return str.toString();
    }

    @Override
    public int compareTo(Object o) {
        if (this == o) {
            return 0;
        }
        if (this.name == null) {
            return -1;
        }
        if (o == null) {
            return 1;
        }
        if (!(o instanceof Word)) {
            return 1;
        }
        String t = ((Word) o).getName();
        if (t == null) {
            return 1;
        }
        return this.name.compareTo(t);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPos() {
        return pos;
    }

    public void setPos(String pos) {
        this.pos = pos;
    }

    public Float getWeight() {
        return weight;
    }

    public void setWeight(Float weight) {
        this.weight = weight;
    }
}

Tokenizer.java

public class Tokenizer {

    /**
     * 分词
     */
    public static List<Word> segment(String sentence) {

        //1、 采用HanLP中文自然语言处理中标准分词进行分词
        List<Term> termList = HanLP.segment(sentence);

        //打印分词结果。
//        System.out.println(termList.toString());

        //2、重新封装到Word对象中(term.word代表分词后的词语,term.nature代表改词的词性)
        return termList.stream().map(
                term -> new Word(term.word, term.nature.toString())).collect(Collectors.toList()
        );
    }
}

TokenizerTester.java

/**
 * @Author alan.wang
 */
public class TokenizerTester {

    public static void main(String[] args){

        String text = "你好美丽的祖国大地,你好美丽的大好河山";
//        String text = "HanLP采用的数据预处理与拆分比例与流行方法未必相同,比如HanLP采用了完整版的MSRA命名实体识别语料,而非大众使用的阉割版;HanLP使用了语法覆盖更广的Stanford Dependencies标准,而非学术界沿用的Zhang and Clark (2008)标准;HanLP提出了均匀分割CTB的方法,而不采用学术界不均匀且遗漏了51个黄金文件的方法。HanLP开源了一整套语料预处理脚本与相应语料库,力图推动中文NLP的透明化。\n" +
//                "\n" +
//                "总之,HanLP只做我们认为正确、先进的事情,而不一定是流行、权威的事情。";
        List<Word> words = Tokenizer.segment(text);
        String wordStr = words.stream().map(word -> word.getName()).collect(Collectors.joining(" "));
        System.out.println(wordStr);
    }
}

验证分词结果

我们先输入字符串:你好美丽的祖国大地,你好美丽的大好河山
输出结果如下:
在这里插入图片描述
我们再输入字符串:HanLP采用的数据预处理与拆分比例与流行方法未必相同,比如HanLP采用了完整版的MSRA命名实体识别语料,而非大众使用的阉割版;HanLP使用了语法覆盖更广的Stanford Dependencies标准,而非学术界沿用的Zhang and Clark (2008)标准;HanLP提出了均匀分割CTB的方法,而不采用学术界不均匀且遗漏了51个黄金文件的方法。HanLP开源了一整套语料预处理脚本与相应语料库,力图推动中文NLP的透明化。总之,HanLP只做我们认为正确、先进的事情,而不一定是流行、权威的事情。
输出结果如下:
在这里插入图片描述

结语

从输入输出来看,基本上是按照我们自然语言进行分词的,达到了我们人类可以理解的中文分词需求,hanlp 还支持个人主动训练词库,如果自己有特殊分词需要可以按照自己定制化训练方式去训练自己的词库,然后放入词库

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

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

相关文章

CTFSHOW新手杯MISC部分WriteUp

引文 之前复现了CTFSHOW新人杯的WEB方向部分题目&#xff0c;今天就复现一下MISC为主的题目&#xff0c;可能有些读者不太明白MISC方向是什么意思&#xff0c;简单来说就是"杂项",包括&#xff1a;隐写&#xff0c;压缩包处理&#xff0c;流量分析&#xff0c;攻击取…

电容基础知识

电解电容负极有标识标有耐压值&#xff08;400V 450WV&#xff09; 容量 &#xff08;68UF&#xff09; 温度&#xff08;105摄氏度&#xff09;等 电容容量判断方法&#xff1a;直标法&#xff1a;上图&#xff0c;容量68微法&#xff0c;耐压值400V。数字表示法&#xff1a;方…

如何在公司审计中保持安全

如何在公司审计中保持安全 如今&#xff0c;财务弹性是决定您的公司能否在不确定时期适应和发展的主要属性之一。这可能令人很惊讶&#xff0c;但您的年度业务审计可以成为您提高业务敏捷性的秘密武器。它通过确定内部控制和财务报告的效果以及哪些流程改进应该在您的优先级列…

蓝桥杯Python练习题15-区间k大数查询

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定一个序列&#xff0c;每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式   第一行包含一个数n&#xf…

黑马Hive+Spark离线数仓工业项目-任务流调度工具AirFlow(2)

Oracle与MySQL调度方法 目标&#xff1a;了解Oracle与MySQL的调度方法 实施 Oracle调度&#xff1a;参考《oracle任务调度详细操作文档.md》 - step1&#xff1a;本地安装Oracle客户端 - step2&#xff1a;安装AirFlow集成Oracle库 - step3&#xff1a;创建Oracle连接 - ste…

ODT在手,DDR5布线可以任性走?

作者&#xff1a;一博科技高速先生成员 姜杰 ODT是On Die Termination的缩写&#xff0c;又叫片内端接&#xff0c;顾名思义&#xff0c;就是把端接电阻放在了芯片内部。作为一种端接&#xff0c;ODT可以减小反射&#xff0c;对信号质量的改善显而易见&#xff0c;SI攻城狮很…

家用宽带搭建个人服务器(二)

本文主要详记免费二级域名注册和免费DDNS解析 写在前头 近几年国内注册域名需要备案&#xff0c;域名解析服务商都陆续需要收费了&#xff0c;对于我这种想简单玩玩的人来说实在是太麻烦了(主要是费钱&#xff09;&#xff0c;花了点时间找到了免费域名注册和DDNS解析 本文基于…

Android绘制原理【通透版】

概述 Android 的显示过程可以简单概括为&#xff1a;Android 应用程序把经过测量、布局、绘制后的surface 缓存数据&#xff0c;通过 SurfaceFlinger 把数据渲染到显示屏幕上&#xff0c;通过 Android 的刷新机制 来刷新数据。也就是说应用层负责绘制&#xff0c;系统层负责渲…

豪掷千亿的卡塔尔,为什么建造可回收的足球场?

作者&#xff1a;木环 来自世界六大洲的八强&#xff0c;正为大力神杯做最后的角逐。在精彩的比赛之外&#xff0c;这届世界杯还留下了很多破圈元素&#xff1a;卡塔尔的两千亿、逗笑的饺子皮表情包、推迟到冬季举办的赛事、围困啤酒赞助商的禁酒令。 以及&#xff0c;一个标…

Jackson 自定义序列化器的使用

注意&#xff1a;从简单的例子去延伸使用&#xff0c;内容紧凑&#xff0c;排版就这样了哈 举例&#xff1a;自定义序列化器&#xff0c;让输出json的指定字段金额10 public class testMain {public static void main(String[] args) throws JsonProcessingException {Bill b…

【BP靶场portswigger-服务端5】业务逻辑漏洞-11个实验(全)

目录 一、业务逻辑漏洞 1、意义 2、业务逻辑漏洞的产生 3、产生的影响 二、过度信任客户端控件 1、简述 实验1&#xff1a;过度信任客户端控件 三、未处理非常规输入 1、简述 实验2&#xff1a;高级逻辑漏洞 实验5&#xff1a;低级逻辑缺陷 实验6&#xff1a;异常输入处…

服务器防勒索病毒经验分享

场景描述 互联网飞速发展&#xff0c;各企业均搭建了自己的服务器。包括文件服务器、代码服务器、业务系统服务器、数据库服务器等。目前大多数企业使用的服务器系统以Windows Server和Linux&#xff08;Centos&#xff09;居多&#xff0c;但随着国产操作系统的崛起&#xff…

Altium Designer 20 凡亿教育视频学习-03

第三部分学习 封装具备的元素 紫色部分就是阻焊部分&#xff0c;阻焊作用&#xff1a;防止绿油覆盖 封装制作 Tab键调出属性菜单 当放置焊盘的时候&#xff0c;按Tab键&#xff0c;可以打开属性面板&#xff0c;并且更改是贴片还是插孔的 测量距离 Ctrl M 测量功能 测量…

Day 17-其它 Composition API_ 依赖注入provide / inject

Provide / Inject 当我们需要从父组件向子组件传递数据时&#xff0c;我们使用 props可以实现&#xff01; 想象一下这样的结构&#xff1a;有一些深度嵌套的组件&#xff0c;而深层的子组件只需要父组件的部分内容。在这种情况下&#xff0c;如果仍然将 props 沿着组件链逐级…

CORS 跨域资源共享

目录 1. 接口的跨域问题 2. 使用 cors 中间件解决跨域问题 3. 什么是 CORS 4. CORS 的注意事项 5. CORS 响应头部 - Access-Control-Allow-Origin 6. CORS 响应头部 - Access-Control-Allow-Headers 7. CORS 响应头部 - Access-Control-Allow-Methods 8. CORS请求的…

SpringMVC程序详解

1.什么是 Spring MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为“Spring MVC”。 从上述定义我们可以得…

消息服务 + Serverless 函数计算如何助力企业降本提效?

作者&#xff1a;柳下 背景介绍 消息队列服务&#xff08;下文均以 Message Service 命名&#xff09;作为云计算 PaaS 领域的基础设施之一&#xff0c;其高并发、削峰填谷的特性愈发受到开发者关注。Message Service 对上承接消息生产者服务的请求&#xff0c;对下连接消费者…

指令格式与寻址方式

指令与指令系统 指令: 控制计算机完成某种操作的命令。 指令系统&#xff1a; 处理器所能识别的所有指令的集合。 指令的兼容性&#xff1a; 同一系列机的指令都是兼容的。 汇编语言&#xff1a; 指令助记符。 指令格式 例如&#xff1a; 寻址方式 操作数可能的来源或…

SpringCloud(11)— 微服务保护(Sentinel)

SpringCloud&#xff08;11&#xff09;— 微服务保护(Sentinel) 一 认识Sentinel 1.雪崩问题及其解决方案 微服务调用链路中的某个服务出现问题&#xff0c;引起整个链路中所有的微服务都不可用&#xff0c;这就是我们常说的雪崩问题。 如何解决雪崩问题&#xff1f; 常见…

Qt之实现自定义控件的两种方式——插件法

文章目录前言一、需求二、实现1、新建项目2、自定义控件类3、编译插件4、拖拽使用&#xff08;1&#xff09;在designer.exe中直接拖拽&#xff08;2&#xff09;在Qt Creator的设计师中直接拖拽5、在项目中正常使用前言 可以通过Qt设计师拖拽原生控件进行界面开发&#xff0c;…