Java+Python+HanLP自然语言处理包实现解析文本分词

news2025/1/24 5:47:03

目录

需要安装

Python部分

Java部分


需要安装

HanLP官网Api教程 https://bbs.hanlp.com/t/hanlp2-1-restful-api/53

首先需要电脑安装Python环境并配置环境变量(网上搜就可以一大堆教程),建议Python版本3+

然后根据HanLP官网教程安装hanlp包(配完python环境变量后cmd执行会自动下载到你配的磁盘位置)

hanlp restful安装客户端

pip install hanlp_restful

hanlp

pip install hanlp -U

上面两个我没用restful,因为restful的写法要在脚本代码里引入api url,不要这种的,所以我安的下面那个,两种写法官网都有样例,可以照扒

 

Python部分

然后开始编写脚本文件,我们要实现从前台传给后台(Java部分),然后后台去执行py脚本(python部分),返回结果。

编写脚本

import hanlp
import sys

hanlp.pretrained.mtl.ALL  # 语种见名称最后一个字段或相应语料库
HanLP = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_BASE_ZH)
print(HanLP(sys.argv[1], tasks='tok*'))

这里说一下,编辑器推荐使用JetBrains公司的PyCharm,因为这个编辑器可以初始自动加载环境,不需要额外配什么,包括运行需要哪些包也可以自动去下载

首次需要执行下脚本,会自动下载脚本里写的语料库到本地,不执行的话没有语料库解析不了。

代码里tasks后的参数,/前是任务,/后是细分标准,tok就是分词任务,后面*等于全部,执行会显示全部结果

 如果想要实现具体的细粒度,单改tasks

前面sys.argv[1]是java那边传过来的参数

Java部分

package org.jeecg.common.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;


/**
 * @Description: 调用制定Python方法的工具类
 * @Date: 2023/2/11
 * @author: TCZ
 */
public class RunPyUtils {
    /**
     * @param path python文件路径
     * @return
     * @throws Exception
     */
    public static String runCmd1(String path) throws Exception {
        BufferedReader br = null;
        try {
            String[] args = new String[]{"python", path};//第二个为python脚本所在位置
            Process proc = Runtime.getRuntime().exec(args);
            br = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gb2312"));
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            return sb.toString();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * @param path  python文件路径
     * @param value python脚本参数
     * @return
     * @throws Exception
     */
    public static String runCmd2(String path, String value) throws Exception {
        BufferedReader br = null;
        try {

            String[] args = new String[]{"python", path, value};//第二个为python脚本所在位置,后面的为所传参数(得是字符串类型)
            Process proc = Runtime.getRuntime().exec(args);
            br = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gb2312"));
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            return sb.toString();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * @param path   python文件路径
     * @param value1 python脚本参数
     * @param value2 python脚本参数
     * @return
     * @throws Exception
     */
    public static String runCmd3(String path, String value1, String value2) throws Exception {
        BufferedReader br = null;
        try {

            String[] args = new String[]{"python", path, value1, value2};//第二个为python脚本所在位置,后面的为所传参数(得是字符串类型)
            Process proc = Runtime.getRuntime().exec(args);
            br = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gb2312"));
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            return sb.toString();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        try {
//            String content = runCmd1("D:\\python_demo\\fenci.py");
            String content = runCmd2("D:\\python_demo\\demo.py", "今天我上街丢了200块钱,回到家后发现手机也被偷了");
            System.out.println(content);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

java部分全部照扒,需要jeecg包,maven刷新下载就行,main执行里面参数可看方法解释

执行结果

 

 

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

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

相关文章

「JVM 原理使用」 实际开发中的应用

Class 文件格式、执行引擎主要以 Class 文件描述了存储格式、类何时加载、如何连接、VM 如何执行字节码指令,这些动作基本都是 JVM 直接控制,用户代码无法干预和改变; 用户可以干预的只有字节码生成、类加载器两部分,而这两部分的…

Android 面试 基础知识汇总

Android常用的设计模式HTTP和HTTPS的区别TCP/UDP的区别

PendingIntent兼容安卓12 的一个问题

这是我第一次遇到这个问题,反正我也是第一次做完整的安卓app,很多个第一次。我之前做的那个老旧手机做桌面摆件的app,因为原来的“无干预”版本无法使用,所以又用回了“和风版”,但这个版本很久没用了,有些…

实用机器学习-学习笔记

文章目录9.1模型调参9.1.1思考与总结9.1.2 基线baseline9.1.3SGD ADAM9.1.4 训练代价9.1.5 AUTOML9.1.6 要多次调参管理9.1.7复现实验的困难9.1模型调参 9.1.1思考与总结 1了解了baseline和调参基本原则 2了解了adams和sgd的优劣 3了解了训练树和神经网络的基本代价 4了解了a…

【蓝桥杯集训2】差分专题(3 / 4)

目录 差分模板 1、一维差分 2、二维差分 3729. 改变数组元素 - 差分 区间修改 100. 增减序列 - 差分模板 1、一维差分 活动 - AcWing 给a数组 [l,r] 区间的每个数c,只需要给其差分数组b做如下操作即可 b[l]c; b[r1]-c; 差分数组 a[]是b[]的前缀和数组 如果…

倒计时100天 | DBF深圳国际户外运动博览会5月一起狂飙初夏

狂飙初夏的大型户外运动嘉年华即将登场!2023年5月26日至28日,第四届DBF深圳国际户外运动博览会(简称DBF深圳户外展)将于深圳国际会展中心(宝安)举办。本届展会展览面积超过7万平方米,预计将吸引…

保姆级Vue3+Vite项目实战黑白模式切换

写在前面注:本文首发掘金签约专栏,此为文章同步!本文为 Vue3Vite 项目实战系列教程文章第四篇,系列文章建议从头观看效果更佳,大家可关注专栏防走失!点个赞再看有助于全文完整阅读!此系列文章主…

C/C++【内存管理】

✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 Love is a choice. It is a conscious commitment. It is something you choose to make work every day with a person who has chosen the same thi…

商城系统必备营销工具(五)——积分商城

做商城,流量必不可少,日活跃度也很重要。现在各大APP、网站、小程序和微商城,基本都在为了巩固流量做积分商城,虽然已经随处可见,但很多企业商家却并没有将积分商城运作起来,积分商城也没有人浏览兑换商品。…

跟ChatGPT,聊聊ChatGPT

不仅“上知天文、下知地理”,似乎还能对答如流、出口成诗,甚至还能写剧本、编音乐、写代码——最近,一款名叫ChatGPT的人工智能聊天机器人火爆全球。由此,一系列关于新一代技术变革、人工智能替代人力、巨头企业扎堆入局AI的讨论在…

Multi Paxos

basic paxos 是用于确定且只能确定一个值,“只确定一个值有什么用?这可解决不了我面临的问题,例如每个用户都要多次保存数据.” 你心中可能有这样的疑问。 原simple paxos论文里有提到一连串个instance of paxos [4] 但没有提出 multi paxos的概念&…

ChatGPT国内镜像站试用,聊天、Python代码生成。

ChatGPT国内镜像站试用,聊天、Python代码生成。 (本文获得CSDN质量评分【91】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… …

前端开发:关于diff算法详解

前言 前端开发中,关于JS原生的内容和前端算法相关的内容一直都是前端工作中的核心,不管是在实际的前端业务开发还是前端求职面试,都是非常重要且必备的内容。那么本篇博文来分享一个关于前端开发中必备内容:diff算法,d…

ChatGPT背后的技术可以给数据治理带来哪些神奇的效果?_光点科技

最近,由美国人工智能研究室OpenAI开发的全新“聊天机器人”ChatGPT火了。作为一款人工智能语言模型,它不仅能和人展开互动,还可以写文章、制定方案、创作诗歌,甚至编写代码、检查漏洞样样精通,上线仅两个月全球活跃用户…

Python雪花代码

前言 用python画个雪花玩玩,源码在文末公众号哈。 雪花类 class Snow(): #雪花类 def __init__(self): self.r 6 #雪花的半径 self.x ra.randint(-1000,1000) #雪花的横坐标 self.y ra.randint(-500,5…

剑指 Offer 10- I. 斐波那契数列[c语言]

目录题目思路代码结果该文章只是用于记录考研复试刷题题目 力扣斐波那契数列 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) 0, F(1) 1 …

卷积神经网络-D2L

从全连接层到卷积 企业级理解卷积 不稳定输入 稳定输出 求系统存量 - 信号系统周围像素点如何产生影响 - 图像处理一个像素点如何试探 - 图像识别 好处: 平移不变性和局部性 图像卷积 import torch from torch import nn from d2l import torch as d2ldef try_…

Java高频面试题,ReentrantLock 是如何实现锁公平和非公平性的?

我先解释一下个公平和非公平的概念。 公平,指的是竞争锁资源的线程,严格按照请求顺序来分配锁。 非公平,表示竞争锁资源的线程,允许插队来抢占锁资源。 ReentrantLock 默认采用了非公平锁的策略来实现锁的竞争逻辑。 其次&…

SqlServer的LDF文件丢失, 如何仅用MDF文件恢复数据库呢?(已解决)

笔者的一个大小为2 TB的SQL Server的database的LDF文件在玩存储盘映射的过程中莫名其妙的丢失了. 好在MDF文件还在. 笔者慌了, Bruce Ye告诉笔者, 不用着急, 光用MDF也可以把数据库弄回来的. 笔者就问Bruce, 假设我可以容忍LDF中信息的丢失的话, 那么该如何恢复这个数据库呢?我…

快速搭建个人在线书库,随时随地畅享阅读!

前边我们利用NAS部署了个人的导航页、小说站、云笔记,今天,我们再看看怎么部署一个个人的在线书库。 相信很多朋友都在自己的电脑中收藏了大量的PDF、MOBI等格式的电子书籍,但是一旦换了一台设备,要么是无法翻阅,要么…