Java+Python+Paddle提取长文本文章中词频,用于Echart词云图数据

公司有个需求,就是需要提供给echart词云图的数据,放在以前我们的数据来源都是从产品那直接要,产品也是跑的别的接口,那怎么行呢,当然有自己的一套可以随便搞了,那么操作来了

Java

package cn.iocoder.yudao.module.nlp.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @author: hyj
 * @createDate: 2023/04/26
 * @description: 词频提取 json(给词云图用)
 */
@Component
public class WordFrequencyUtil {

    private static final WordFrequencyUtil staticInstance = new WordFrequencyUtil();

    @Value("${python.path}")
    private String path;

//    private String path = "E:/LanZhou/manage_api/nlp/nlp-biz/src/main/resources/static/python/";

    /**
     * @param content: 文本
     * @return: 词云图json对象的string
     */
    public static String extraction(String content) {
        String result;
        try {
            result = RunPyUtils.runCmd3(staticInstance.path + "wordFrequency.py", content, staticInstance.path);
        } catch (Exception e) {
            result = "error";
        }
        return result;
    }

    /**
     * 测试的时候把什么注解path换一下
     */
    public static void main(String[] args) {
        String content = "这几天,法国、西方乃至中国的部分媒体,围绕着中国驻法国大使卢沙野在法国LCI电视台专题节目中所阐述的一些观点展开了激烈辩论。支持者为卢大使鼓掌,认为我们应该勇于在国际舞台上应对挑战发声,但也有一些观点认为外媒向来对中国不怀好意,我们在和他们打交道时不能顺着人家的“坑”跳。\n" +
                "因为我在法国担任常驻记者的时候,就经常应邀参加法国电视台、电台的辩论节目,因此对孤身一人、舌战群魔的艰难处境深有体会。我非常深切地感受到,尽管我们明知道其中会有很多陷阱、阴谋、困难,但我们也一定要敢于、勇于、善于参与这类活动;因为只有跻身其中、仗义直言,才有可能有朝一日打破这类陷阱,将我们的话语权真正地夺回来,把我们的声音真正地传播出去,传向全世界。\n" +
                "所以,我对卢沙野大使勇于应邀前往法国电视台发声、在明显充满敌意的环境中敢于发声,执百分之百支持的态度!我要高呼:Bravo!Monsieurl'Ambassadeur!(棒极了!大使先生!)\n" +
                "西方媒体与我们中国媒体在这类电视辩论节目中,从目的、形式到效果,可以说都是南辕北辙、截然相反的。我曾担任过中国中央电视台法语频道专题节目《On ne vous dit pas tout》的主持人;也在福建省电视台东南卫视《中国正在说》专题节目中担任主持人。\n" +
                "我在法国时,也应邀参加过法国主流电视台“LCI”“France5”、国家电视台“法兰西电视二台”,24小时连续新闻台“BFM TV”“CNEWS”、以及法国对外电视台“France 24”等各大电视台的辩论节目。我甚至成为法国国家“世界5台(TV5 Monde)”的常邀嘉宾,非常有规律地参加其电视辩论节目。因此我对双方新闻节目、特别是电视辩论节目的制作过程、方式方法,以及从手段到目的等各个环节都非常了解。\n" +
                "仅就新闻和辩论节目的目的而言,中法媒体就是不一样的。\n" +
                "我在中央电视台法语频道担任主持人时,我的节目经常邀请法国人来参加辩论。我们的新闻出发点是非常明确的,那就是阐述事实、表明观点、消除误会、增进彼此的了解和理解。\n" +
                "以我采访阿尔斯通前高管、《美国陷阱》一书的作者皮耶鲁齐(Frédéric Pierucci)为例。我们采访他的目的,一是要他本人亲自来阐述他在美国的遭遇;二是介绍他的《美国陷阱》中文版;三是表明我们对他的正义事业的支持。在采访前,我就把采访提纲完整地发给他,让他能够事先有充分的准备;而我在整个采访过程中基本就是按提纲上的问题来询问他。当然,当他的回答能够给我新的提问动机时,我也会进一步深入下去。但总体上而言,我们的目的是共同的、一致的。\n" +
                "皮耶鲁齐在采访结束后与我愉快地交谈时说,我知道中国新闻媒体是非常严肃、认真的,今天果然如此,我几乎是畅所欲言,完全吐露了我想说的一切。当我们从中国观众的角度出发,我们就可以看到,有关皮耶鲁齐的几乎一切经历、遭遇,我们都了解到了。观众也更理解他在《美国陷阱》一书中阐述的观点。对于我和央视而言,如果美国司法当局也想接受我们的采访来解释一下美国为什么要逮捕皮耶鲁齐的话,我们也同样会给他们类似的发言权。这样,中国观众便能够更为客观地了解到了整个事件的来龙去脉。";
        String result = extraction(content);
        JSONArray json = JSON.parseArray(result);
        for (int i = 0; i < json.size(); i++) {
            JSONObject jb = json.getJSONObject(i);
            System.out.println(jb);
        }
    }

    @PostConstruct
    public void init() {
        staticInstance.path = path;
    }

}

java直接写的工具,因为这个目前还没让我写接口模式,后续可能需要同事多人调用并且他们搞对外接口,所以我临时这么写测试一下

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


/**
 * @Description: 调用制定Python方法的工具类
 * @Date: 2023/2/11
 * @author: TCZ
 */

public class RunPyUtils {

    
    /**
     * @param path   python文件路径
     * @param value1 python脚本参数
     * @param value2 python脚本参数
     */
    public static String runCmd3(String path, String value1, String value2) throws Exception {
        String system = System.getProperty("os.name");
        BufferedReader br = null;
        try {
            String[] args = new String[]{system.contains("Windows") ? "python" : "python3", path, value1, value2};//第二个为python脚本所在位置,后面的为所传参数(得是字符串类型)
            Process proc = Runtime.getRuntime().exec(args);
            br = new BufferedReader(new InputStreamReader(proc.getInputStream(), system.contains("Windows") ? "gb2312" : "utf-8"));
            String line;
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }

            System.out.println(proc.waitFor() != 0 ? "脚本执行失败" : "脚本执行成功");

            InputStream errorStream = proc.getErrorStream();
            BufferedReader error = new BufferedReader(new InputStreamReader(errorStream, "gbk"));
            String lineError;
            while ((lineError = error.readLine()) != null) {
                System.out.println("----------------------------------------------------失败原因为:" + lineError);
            }
            error.close();

            return sb.toString();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

这个java调用python的方法网上写法都是一样的,不描述了

Python

from collections import Counter
from paddlenlp import Taskflow
import sys

# 处理文本提取关键词和词频
# 从java来源接参数
text = sys.argv[1]

# 数据清理(分词和去掉停用词)
def clearWord(content):
    #  分词
    seg1 = Taskflow("word_segmentation", mode="accurate")
    seg_list = seg1(content)
    # 读取停用词
    with open(sys.argv[2] + 'StopWord.txt', encoding="utf-8") as f:
        stopwords = f.read()
        new_text = []
        # 去掉停用词
        for w in seg_list:
            if w not in stopwords:
                if len(w) > 1:
                    new_text.append(w)
        return new_text


# 数据整理(统计词频)
def statisticalData(text):
    # 统计每个词的词频
    counter = Counter(text)
    # 输出词频最高的15个单词
    return counter.most_common(100)


A = clearWord(text)
B = statisticalData(A)
resultList = []
for item in B:
    result = {"name": item[0], "value": item[1]}
    resultList.append(result)
print(resultList)

这里有个非常重要的步骤就是清理停用词,什么是停用词?就是我们文章中什么逗号了句号了,或者是啊、呵、哈这种语气词等等等对于我们要提取词频的词做不到关键性作用的,我们不需要提取,需要把他们清除掉

这里面使用的停用词来源

最全中文停用词表整理(1893个)

新建文件StopWord.txt放入数据

后面再利用python拼接返回数据name-value的json对象数组格式,因为这个格式需要echart的词云图使用

注意,我们python分词利用的paddlenlp包做分词处理,所以在此之前需要安装padllenlp环境和下载分词的模型包,至于怎么下载,只需要用python运行一下分词模型,就会自动下载

paddleNlp安装使用

https://github.com/PaddlePaddle/PaddleNLP

paddleNlp所有功能

https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/model_zoo/taskflow.md

测试

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十四届蓝桥杯大赛软件赛省赛(Java 大学A组)

蓝桥杯 2023年省赛真题 Java 大学A组 试题 A: 特殊日期  试题 B: 与或异或  试题 I: 高塔 把填空挂上跟大伙对对答案&#xff0c;然后 I \rm I I 题出的还行就先讲讲&#xff0c;剩下的最近有点忙&#xff0c;先放放。 试题 A: 特殊日期 本题总分&#xff1a;5 分 【问题描…

PMP课堂模拟题目及解析(第5期)

41. 项目的混凝土供应商通知项目经理&#xff0c;材料将比预定时间晚三个星期交付。项目经理更新了进度计划并通知项目团队。在这种情况下&#xff0c;哪种合同类型承担的风 险最小&#xff1f; A. 总价加激励费用合同。 B. 总价加经济价格调整合同。 C. 工料合同。 D. 固…

利用阿里云免费部署openai的Chatgpt国内直接用

背景 国内无法直接访问ChatGPT&#xff0c;一访问就显示 code 1020。而且最近OpenAI查的比较严格&#xff0c;开始大规模对亚洲地区开始封号&#xff0c;对于经常乱跳IP的、同一个ip一堆账号的、之前淘宝机刷账号的&#xff0c;账号被封的可能性极大。 那么有没有符合openai规定…

PLC与无线开关量测控终端之间Modbus通信实例

本方案是基于Modbus RTU协议下实现的1主多从自组网无线通信形式&#xff0c;主站为S7-1200 PLC&#xff0c;DTD433H作为从站。DTD433H具备输入和输出开关量信号功能&#xff0c;信号传输方向由用户原系统主从设备所实现的功能决定。方案中采用无线开关量信号测控终端DTD433H与欧…

NC – 靶向特定功能的神经元细胞类型治疗脑部疾病

神经元是大脑的主要功能单位。这些细胞中传递的信号——以电波的形式——导致所有思维、感觉、运动、记忆和情感。 塞达斯-西奈医学中心的研究人员利用计算机模型来弥合“试管”神经元数据和这些细胞在大脑中的功能之间的差距。他们的研究有助于开发靶向特定功能的神经元类型治…

迅为国产化RK3588开发平台16G大内存64G存储2路千兆以太网4G/5G通信

iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代AloT高端应用芯片采用8nmLP制程&#xff0c;搭载八核64位CPU(四核Cortex-A76四核Cortex-A55架构)集成MaliG610MP4四核GPU&#xff0c;内置AI加速器NPU&#xff0c;算力达6Tops&#xff0c;集成独立的8K视频硬件编码…

HTML-CSS学习笔记

day1-01.CSS的元素显示模式 元素的显示模式就是元素&#xff08;标签&#xff09;以什么方式进行展示&#xff0c;比如<div>自己占一行&#xff0c;<span>一行可以放多个。 HTML元素一般分为块元素和行内元素两种类型。 块元素 如果在p标签中放了div标签&#xff…

企业邮箱选购,需关注哪些重要因素?

企业邮箱选择考虑哪些问题&#xff1f;应该从企业邮箱安全、企业邮箱的稳定性、企业邮箱专业、方便迁移到新的企业邮箱、企业邮箱邮件的到达率、功能强大的企业邮箱、企业邮箱手机客户端设置等方面考虑。 1.企业邮箱安全 企业邮箱应考虑病毒防治能力。Zoho Mail企业邮箱从物理安…

【LeetCode困难】1263. 推箱子

「推箱子」是一款风靡全球的益智小游戏&#xff0c;玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示&#xff0c;其中每个元素可以是墙、地板或者是箱子。 现在你将作为玩家参与游戏&#xff0c;按规则将箱子 ‘B’ 移动到目标位置 ‘T’ &am…

创新指南|5大策略让创新业务扩张最大避免“增长痛苦”

公司在开发和孵化新业务计划方面进行了大量投资&#xff0c;但很少有公司遵循严格的途径来扩大新业务规模。虽然80%的公司声称构思和孵化新企业&#xff0c;但只有16%的公司成功扩大了规模。典型案例是百思买在许多失败倒闭的扩大新业务取得了成功。它经历了建立新业务所需的3个…

手残也不该敲的命令

Linux命令是一种很有趣且有用的东西&#xff0c;但在你不知道会带来什么后果的时候&#xff0c;它又会显得非常危险。所以&#xff0c;在输入某些命令前&#xff0c;请多多检查再敲回车。 rm –rf rm –rf是删除文件夹和里面附带内容的一种最快捷的方法&#xff0c;但是细微的…

深度学习03-卷积神经网络(CNN)

简介 CNN&#xff0c;即卷积神经网络&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一种常用于图像和视频处理的深度学习模型。与传统神经网络相比&#xff0c;CNN 有着更好的处理图像和序列数据的能力&#xff0c;因为它能够自动学习图像中的特征&…

安全防线再升级 | 中睿天下全流量安全分析系统重磅回归

随着信息化的加速&#xff0c;企业网络日趋完善。企业数字化的加速&#xff0c;让越来越多的关键业务运行在计算机网络基础之上&#xff0c;越来越多的重要信息通过网络传送&#xff0c;企业网络面临日益严重的安全威胁&#xff0c;这些安全威胁以窃取信息和收集情报为主&#…

中文润色神器-中文润色软件

中文写作润色软件 中文写作润色软件是一种基于自然语言处理技术和人工智能算法的工具&#xff0c;旨在提高中文文本的语言风格、表达能力和可读性。它可以自动检测文本中出现的语法、拼写、标点符号等语言问题&#xff0c;并给出相应的修正和修改建议。 中文写作润色软件的主…

Spark 从入门到精通

Spark 从入门到精通 环境搭建 准备工作 创建安装目录 mkdir /opt/soft cd /opt/soft下载scala wget https://downloads.lightbend.com/scala/2.13.10/scala-2.13.10.tgz -P /opt/soft解压scala tar -zxvf scala-2.13.10.tgz修改scala目录名称 mv scala-2.13.10 scala-2下…

进程(二)

进程二 2.6 调度的概念、层次2.6.1 基本概念2.6.2 三个层次2.6.3 三层调度的联系、对比2.6.4 补充知识2.6.5 本小节总结 2.7 进程调度的时机、切换与过程、方式2.7.1 进程调度的时机2.7.2 切换与过程2.7.3 进程调度的方式2.7.4 总结 2.8 调度器/调度程序/闲逛线程2.9 调度算法的…

Python基础入门编程代码练习(六)

一、模拟房产经纪人来管理房屋信息 编写业务实现 家具类&#xff1a;HouseItem 属性&#xff1a;名字 name&#xff0c;占地面积 area 方法&#xff1a;__init__ , __str__ 类名&#xff1a;房子类 House 属性&#xff1a;户型 name&#xff0c;总面积&#xff1a;total_are…

Word怎么分页,提高效率就靠这3种方法!

案例&#xff1a;Word怎么分页 【文档要进行分页处理&#xff0c;但是我尝试了好多次还是不行&#xff01;大家知道Word怎么分页吗&#xff1f;】 在使用Microsoft Word处理文档时&#xff0c;我们常常需要进行分页操作。Word的分页功能可以将文档分成多个页面&#xff0c;以…

【Selenium上】——全栈开发——如桃花来

目录索引 Selenium是什么&#xff1a;下载和配置环境变量&#xff1a;1. 基本使用&#xff1a;导入五个常用包&#xff1a;基本代码&#xff1a; 实例引入&#xff1a;声明不同浏览器对象&#xff1a;访问页面&#xff1a; Selenium是什么&#xff1a; Selenium是一个用于Web应…

怎么把pdf中的某一页分出来?

怎么把pdf中的某一页分出来&#xff1f;PDF格式的文档在日常生活中是非常常见的&#xff0c;相信大家都对其有所了解&#xff0c;并且经常使用。它的主要特点是不允许用户随意编辑其中的内容&#xff0c;当我们仅需要阅读时&#xff0c;PDF文档无疑是十分方便的&#xff0c;尤其…