提取关键词作为标题---Java调用Python实现

提取,关键词,作为,标题,java,调用,python,实现 · 浏览次数 : 30

小编点评

## 脚本解析问题分析与解决方案 **问题1:jieba.analyse.extract_tags()参数设置问题** * **解决方法 1:** 在 `jieba.analyse.extract_tags()` 函数中添加 `return` 语句,并将参数设置成 `list` 类型。例如: ```python keywords = "\n".join(jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())) return keywords ``` * **解决方法 2:** 在 `jieba.analyse.extract_tags()` 函数中使用 `yield` 语句,并将参数设置成 `generator` 类型。例如: ```python def extract_keywords(sentence): yield jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) keywords = list(extract_keywords(sentence)) ``` **问题2:模块找不到问题** * **解决方法 1:** 确保 `jieba` 模块已安装。可以使用 `pip install jieba` 命令安装。 * **解决方法 2:** 在使用 `jieba` 模块之前,确保 Python 版本正确匹配 `jieba` 的版本要求。 **最终版本脚本解决方案:** ```python import jieba.analyse try: # 设置命令行传入参数 str = "python D:/workspace____java/anlysistSentence/src/main/resources/helloworld3.py" process = Runtime.getRuntime().exec(str) reader = BufferedReader(InputStreamReader(process.getInputStream(), "gb2312")) # 读取标题 title = "\n".join(jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())) # 打印标题 print(f"标题:{title}") except Exception as e: e.printStackTrace() ```

正文

前景提示

  • 一个朋友参加面试,在成都面的一家,问我如何给一篇没有标题的文章取个标题,是根据内容分析内容,然后获取标题,写个程序让程序分析内容,提炼出一个最适合的标题.
  • 提示:先找出高频率的关键词,然后再根据段首段尾段中的不同权重结合同一个关键词出现的频率来综合判断,最后取一个权重最高,重复最多的词作为标题.

思考

  • 这种题目一般属于大数据人工智能词语分析功能,就根据这个去百度算法.

序号 名称 地址
1 原文参考 NLP算法原文地址
  • 但是,算法用的是python方式实现的,但是,这边都是Java开发,那么Java开发如何实现呢?最简单的方式就是Java调用python脚本,因为Java不擅长做这种计算的工作.

企业级处理方案流程图

  • 企业级也是调用第三方, 因为Java本身很耗内存,如果是几百万,上亿的文档效率会直线下降,所以,就使用Java调用计算能力更好的Python来做.

Python 实现的方式

  • 需要安装好pyhon环境,下载好jieba的包.
序号 名称 地址
1 python环境安装 https://www.cnblogs.com/liuyangfirst/p/16202614.html
  • 进入cmd界面,下载jieba包


   pip install jieba

  • 实现代码.

import jieba.analyse
  sentence  = "人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。2017年12月,人工智能入选“2017年度中国媒体十大流行语”。"
  keywords = "  ".join(jieba.analyse.extract_tags(sentence , topK=20, withWeight=False, allowPOS=()))
  print(keywords)

  • 运行代码.

Java实现

导入Maven包

  • 导入这个可以

   <dependencies>

    <dependency>
      <groupId>org.python</groupId>
      <artifactId>jython-standalone</artifactId>
      <!--python版本是2.x还是3.x在这里指定-->
      <version>2.7.0</version>
    </dependency>

  </dependencies>


书写代码

  • 代码实现.

public class App {
    public static void main(String[] args) {
        try {

            String a = "人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。2017年12月,人工智能入选“2017年度中国媒体十大流行语”。";

            System.out.println(".................start.................");
            //设置命令行传入参数
            String[] str = new String[]{"python", "D:/workspace____java/anlysistSentence/src/main/resources/helloworld3.py",a};
            Process pr = Runtime.getRuntime().exec(str);

            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gb2312"));
            System.out.println();
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            pr.waitFor();
            System.out.println();
            System.out.println("..............end.................");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}


  • 脚本放在这里.

  • 运行结果.

最终版本

  • 脚本已经不是文章开头的样子了,python脚本.

          # coding=utf-8

          import jieba.analyse
          import sys

          jieba.setLogLevel(jieba.logging.INFO)

          if __name__ == '__main__':
              for i in range(1, len(sys.argv)):
                  sentence = sys.argv[i]
                  keywords = "  ".join(jieba.analyse.extract_tags(
                      sentence,
                      topK=20,
                      withWeight=False,
                      allowPOS=()
                  ))
                  print(keywords)





public class App {
    public static void main(String[] args) {
        try {

            String a = "人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。2017年12月,人工智能入选“2017年度中国媒体十大流行语”。";

            System.out.println(".................start.................");
            //设置命令行传入参数
            String[] str = new String[]{"python", "D:/workspace____java/anlysistSentence/src/main/resources/helloworld3.py",a};
            System.out.println(str);


            Process pr = Runtime.getRuntime().exec(str);

            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gb2312"));
            System.out.println();
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            pr.waitFor();
            System.out.println();
            System.out.println("..............end.................");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}




遗留问题:

  • 1.jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())这个方法是写死的,这里的参数,都应该是外部传递进来控制的

  • 2.现在的python脚本只是做print打印分析结果,应该是以return的方式返回结果.

    1. java接收到的python的返回结果如何处理,才能确定最终的标题选取

遇到问题

1.无法解析.


Exception in thread "main" SyntaxError: ("mismatched input ':' expecting NEWLINE", ('<string>', 1, 1, 'D:\\workspace____java\\anlysistSentence\\src\\main\\resources\\helloworld2.py\n'))


  • 无法解析脚本的路径.刚开始采用的是如下的带码方式,但是,这个只能解析简单的语句,导入第三方包和执行脚本都会报错,


 public static void main(String[] args) {


        //首先调用python的解释器 ----------- 只能实现简单的调用,调用的脚本中不能有第三方库
        PythonInterpreter interpreter = new PythonInterpreter();

        //选择执行的的Python语句
        interpreter.exec("print ('hello')");

        // 这里就是无法解析
        // interpreter.exec("D:\\workspace____java\\anlysistSentence\\src\\main\\resources\\helloworld2.py");

    }


  • 最后改用了上述的方法解决了.

2.模块找不到.

  • 报错如下.
  Traceback (most recent call last):
    File "D:\workspace____java\anlysistSentence\src\main\resources\helloworld3.py", line 3, in <module>
      import jieba.analyse
  ModuleNotFoundError: No module named 'jieba'


  • 解决方式就是用pip install jieba.

3.乱码处理

  • 首先要知道python的编码格式是什么.在代码里加入如红框代码,然后,查看输出.('cp936' 就是"gb2312")

  • 因此要去除python脚本里的所有中文,无论注释不注释,在如下代码里加入设置.

  BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gb2312"));
          

版本

序号 描述 日期
1 第一版 2023-07-16
2 第二版 2023-07-24

继续死命问

  • 往死问:如果段首段尾的权重一样,现在有不同的关键词,重复的次数也一样,那该取哪一个?
  • 往死问:假设已经提出来一堆关键词了,现在我要怎么结合段落的权重来决定取哪一个做为标题.
  • 未完待续 .......

与提取关键词作为标题---Java调用Python实现相似的内容:

提取关键词作为标题---Java调用Python实现

[TOC] # 前景提示 * 一个朋友参加面试,在成都面的一家,问我如何给一篇没有标题的文章取个标题,是根据内容分析内容,然后获取标题,写个程序让程序分析内容,提炼出一个最适合的标题. * 提示:先找出高频率的关键词,然后再根据段首段尾段中的不同权重结合同一个关键词出现的频率来综合判断,最后取一个权

[转帖]浅析TiDB二阶段提交

https://cloud.tencent.com/developer/article/1608073 关键内容说明: TiDB 对于每个事务,会涉及改动的所有key中,选择出一个作为当前事务的Primary Key,其他的则为Secondary keys。 当Primary Key提交成功,标识整

使用Mask R-CNN模型实现人体关键节点标注

摘要:在本案例中,我们将展示如何对基础的Mask R-CNN进行扩展,完成人体关键节点标注的任务。 本文分享自华为云社区《使用Mask R-CNN模型实现人体关键节点标注》,作者: 运气男孩。 前言 ModelArts 是面向开发者的一站式 AI 开发平台,为机器学习与深度学习提供海量数据预处理及交

揭秘报表新玩法!标配插件不再单调,如何用柱形图插件让你的报表瞬间高大上!

> 摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 # 前言 图表作为一款用于可视化数据的工具,可以帮助我们更好的分析和理解数据,并发现数据之间的关系和趋势。下面以柱形图为例介绍如何使用JavaScript在报表中引入图表。 本文使用软件

探索ChatGPT的Fine-tuning和Embeddings

1.概述 今天我们将深入探索ChatGPT的两项核心技术:Fine-tuning(微调)和Embeddings(嵌入)。这些技术在现代自然语言处理领域扮演着至关重要的角色,为模型的性能提升和适应特定任务需求提供了关键支持。ChatGPT作为GPT家族的一员,已经在多个领域展现了出色的表现,而其背后的

绝对值码盘接口卡的广泛应用与创新实践

绝对值码盘接口卡作为一种关键的测量和控制设备接口组件,在众多领域发挥着重要作用,为实现高精度的位置和角度测量提供了可靠的解决方案。 以下将通过多个具体的应用案例来展示其广泛的应用场景和显著的价值。 一、数控机床领域 在现代数控机床中,精度和稳定性是至关重要的。绝对值码盘接口卡被广泛应用于机床的坐标轴

vue和react的相同点和不同点

Vue和React作为现代前端开发中流行的两个JavaScript框架,它们有诸多相似之处,同时也存在一些关键性的不同。以下是Vue和React的一些主要相同点和不同点: 相同点: 虚拟DOM:Vue和React都使用虚拟DOM(Virtual DOM)来提高性能,减少直接操作真实DOM的频率,从而

使用 GitHub Action 自动更新 Sealos 集群的应用镜像

在 IT 领域,自动化无疑已成为提高工作效率和减少人为错误的关键。Sealos 作为一个强大的云操作系统,已经为许多企业和开发者提供了稳定可靠的服务。与此同时,随着技术不断发展,集成更多的功能和服务变得尤为重要。考虑到这一点,本文将介绍如何利用 GitHub Action 来进一步丰富 Sealos

35个Redis企业级性能优化点与解决方案

Redis作为企业级应用中广泛使用的高性能键值存储数据库,其性能优化是一个复杂且多面的话题。以下是V 哥整理的一些关键的优化点和相应的解决方案,提供给兄弟们参考。 Redis的性能优化涉及到硬件选择、配置调整、客户端优化、持久化策略等多个层面。 1. 硬件优化 解决方案:选择更快的CPU、更多的内存

Visual Studio 智能代码插件:CodeGeeX

前言 在软件开发领域,高效的编程助手一直是提升开发者效率和质量的关键。随着人工智能技术的不断发展,智能编程助手逐渐成为开发者们不可或缺的工具。其中,CodeGeeX作为一款专为Visual Studio设计的免费智能编程助手,凭借其强大的功能和便捷的使用体验,赢得了广大开发者的青睐。 CodeGee