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

news2024/11/16 19:28:02

公司有个需求,就是需要提供给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

测试

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

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

相关文章

推荐几款2023年还在用的IDE工具

近期有不少刚学编程的小伙伴来问我&#xff0c;市面上那么多IDE工具&#xff0c;该怎么选&#xff1f;今天在这里跟大家分享几款个人比较钟爱的IDE工具&#xff0c;供大家参考。 Visual Studio 优点&#xff1a;支持多种语言&#xff0c;包括C#, C, Visual Basic等&#xff0c…

【Linux】进程信号“疑问?坤叫算信号吗?“

鸡叫当然也算信号啦~ 文章目录 前言一、认识信号量二、信号的产生 1.调用系统函数向进程发信号2.由软件条件产生信号3.硬件异常产生信号总结 前言 信号在我们生活中很常见&#xff0c;下面我们举一举生活中信号的例子&#xff1a; 你在网上买了很多件商品&#xff0c;再等待不…

【跟着陈七一起学C语言】今天总结:函数、数组、指针之间的关系

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

深度学习实战29-AIGC项目:利用GPT-2(CPU环境)进行文本续写与生成歌词任务

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习实战29-AIGC项目&#xff1a;利用GPT-2(CPU环境)进行文本续写与生成歌词任务。在大家没有GPU算力的情况&#xff0c;大模型可能玩不动&#xff0c;推理速度慢&#xff0c;那么我们怎么才能跑去生成式的模型…

14 KVM虚拟机配置-配置虚拟设备(其它常用设备)

文章目录 14 KVM虚拟机配置-配置虚拟设备&#xff08;其它常用设备&#xff09;14.1 概述14.2 元素介绍14.3 配置示例 14 KVM虚拟机配置-配置虚拟设备&#xff08;其它常用设备&#xff09; 14.1 概述 除存储设备、网络设备外&#xff0c;XML配置文件中还需要指定一些其他外部…

Python+selenium,轻松搭建 Web 自动化测试框架

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

云渲染靠谱吗,使用云渲染会不会被盗作品?

云渲染靠谱吗、安全吗&#xff1f;如果使用 云渲染会不会被盗作品......Renderbus瑞云渲染作为一个正经的云渲染平台&#xff0c;也时不时会收到这类疑问&#xff0c;首先&#xff0c;瑞云渲染是肯定靠谱的,各位可以放心使用。另外小编也将在本篇教你如何辨别云渲染平台是否安全…

通达信W底形态选股公式,也称双底形态

W底形态&#xff0c;也称双底形态&#xff0c;是一种经典的技术分析形态&#xff0c;代表了跌势的逆转。看起来像字母 "W"&#xff0c;描述了一波下跌&#xff0c;反弹&#xff0c;再次下跌到与上一波下跌相同或相近的位置&#xff0c;最后是另一波反弹。W底形态两次…

【细读Spring Boot源码】@ComponentScan是如何生效的?

前言 在使用SpringBoot使用过程中 RestController、Service、Repository这几个注解类上都标有Component注解 启动类上标有的SpringBootApplication注解类上有个ComponentScan注解。那么ComponentScan如何把相关的对象注册到BeanFactory的&#xff1f; 找到处理ComponentScan注…

【Qt 从入门到入土】下篇

【Qt 从入门到入土】上篇 一个非常好的学习 Qt 的视频 本文目录 6. 对话框QDialog6.1 基本概念6.2 标准对话框6.3 自定义消息框6.4 消息对话框6.5 标准文件对话框 7. 布局管理器7.1 系统提供的布局控件7.2 利用widget做布局 8. 常用控件8.1 QLabel 控件使用8.2 QLineEdit8.3 其…

1_5 pytorch操作

一、torch 算子 1、torch.nn.functional.affine_grid(theta, size) 给定一组仿射矩阵(theta)&#xff0c;生成一个2d的采样位置(流场)&#xff0c;通常与 grid_sample() 结合使用,用于空间仿射变换网络&#xff0c;用于对2D或3D数据进行仿射变换。 输入&#xff1a;theta(Te…

5.20 牛奶咖啡·仙羽「重生」巡回演唱会 武汉站 告白夜浪漫收官

牛奶咖啡主唱仙羽「重生」主题巡回演唱会将于2023年5月20日浪漫收官。经历多次延期&#xff0c;「重生」巡回演唱会武汉站 终于与大家见面&#xff0c;届时会为大家带来多首传唱度极高的歌曲&#xff0c;与歌迷朋友共度一个难忘的告白夜。 关于仙羽仙羽&#xff08;kiki&#…

微服务架构演变

微服务架构演变 认识微服务 服务架构演变 单体架构&#xff1a;将业务的所有功能集中在一个项目种开发&#xff0c;打成一个包部署 优点&#xff1a; 架构简单部署成本低 缺点&#xff1a; 耦合度高 分布式架构&#xff1a;根据业务功能对系统进行拆分&#xff0c;每个业…

python4delphi之初体验

最近需要做一个excel导入的工具, excel表格是python的强项,于是想delphi结合python实现 delphi环境xe2 python 3.6.6 上图可以看到,真的很爽,我在vscode写python脚本,然后给delphi调用 读取了一个excel文件,打印出了列头。 最爽的是,我在没wps,office环境的机…

【计算机视觉 | 目标检测】Grounding DINO 深度学习环境的配置(含案例)

“Grounding DINO&#xff1a;Marrying DINO with Grounded Pre-Training for Open-Set Object Detection”的官方 PyTorch 实现&#xff1a;SoTA 开放集对象检测器。 文章目录 一、Helpful Tutorial二、相关的论文工作2.1 相关的论文整理2.2 论文的亮点2.3 论文介绍2.4 Marryi…

shell脚本之数组与冒泡排序

目录 一. 数组1.1 数组定义&#xff1a;1.2 数组包括的数据类型&#xff1a;1.3 向函数传入数组的值 二. 冒泡排序算法 一. 数组 1.1 数组定义&#xff1a; 方法一&#xff1a; 数组名&#xff08; 1 2 3 4 5 &#xff09; 方法二&#xff1a; 数组名&#xff08; [0]1 [1]2 […

Nginx 概述和缓存能力

官方说明 理解说明 Nginx是一个高性能的Web服务器和反向代理服务器&#xff0c;其设计思想和执行机制可以概括如下&#xff1a; 异步事件驱动&#xff1a;Nginx采用基于事件驱动的异步I/O模型&#xff0c;这意味着它能够处理大量并发连接而不会消耗太多的系统资源。 单线程模…

(六)Kubernetes - 手动部署(二进制方式安装)

Kubernetes - 手动部署 [ 5 ] 1 部署NginxKeepalived高可用负载均衡器1.1 安装软件包(Master1/Master2)1.2 Nginx配置文件(主备相同)1.3 keepalived配置文件(Master1)1.4 keepalived配置(master2)1.5 Nginx增加Steam模块1.5.1 查看Nginx版本模块1.5.2 下载同一个版本的nginx1.5…

如何提高执行力

在最近的工作中很多事情容易拖延的&#xff0c;导致部分工作和自己的生活容易因为拖延导致混乱&#xff0c;比如没有提前预订好抢票&#xff0c;结果导致放假买不到票等等的事情出现。 所以很多事懒的原因是执行力差&#xff0c;为什么执行力差&#xff0c;说明事情不重要。那就…

DNS欺骗、ARP攻击及钓鱼网站制作

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 一、背景 钓鱼者运用社会工程学( social engineering)知识诱骗受害者&#xff0c;以在…