提取关键词作为标题---Java调用Python实现
前景提示
- 一个朋友参加面试,在成都面的一家,问我如何给一篇没有标题的文章取个标题,是根据内容分析内容,然后获取标题,写个程序让程序分析内容,提炼出一个最适合的标题.
- 提示:先找出高频率的关键词,然后再根据段首段尾段中的不同权重结合同一个关键词出现的频率来综合判断,最后取一个权重最高,重复最多的词作为标题.
思考
- 这种题目一般属于大数据人工智能词语分析功能,就根据这个去百度算法.

| 序号 | 名称 | 地址 |
|---|---|---|
| 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的方式返回结果.
- 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实现的更多相关文章
- Python一键转Jar包,Java调用Python新姿势!
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...
- Java 调用python说明文档
Java 调用python说明文档 通过java调用python脚本主要如下三种方式: 1.直接执行python脚本: 2.执行python.py文件: 3.使用Runtime.getRuntime( ...
- java调用python程序以及向python程序传递参数
在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python ...
- java调用python脚本并向python脚本传递参数
1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...
- java调用python的惨痛史(无法获取环境变量)
环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle 事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用pyt ...
- (转)java调用python脚本
这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...
- [Java/Python] java调用python脚本问题记录
Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...
- Runtime.getRuntime().exec()实现Java调用python程序
使用Runtime.getRuntime().exec()来实现Java调用python,调用代码如下所示: import java.io.BufferedReader; import java.io ...
- java调用python的几种用法(看这篇就够了)
java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...
- Java调用Python相关问题:指定python环境、传入参数、返回结果
本篇文章涉及到的操作均在Windows系统下进行,Java调用python在原理上不难,但是可能在实际应用中会有各种各样的需求,网上其他的资料很不全,所以又总结了这篇文章,以供参考. 一.指定pyth ...
随机推荐
- #矩阵乘法,线段树#CF575A Fibonotci
题目 分析 \(K\)那么大肯定是矩阵乘法, 带修改可以用线段树单点修改, 转移矩阵类似于斐波那契数列, 这题思维难度不大,细节很多,需要很长时间QWQ 时间复杂度\(O(mlog_2K)\),具体注 ...
- 基于tapd的git commit规范
现状 开发团队中,总是有人提交代码时的commit内容乱写一通,或者不明确不完整.当回溯代码的时候,很难通过commit内容定位历史记录,只能一条一条查看,找不到就要去问历史参与开发的其他同事,沟通成 ...
- ThinkPHP6.x 使用指南
PHP 版本:PHP 8.1.0 框架版本:ThinkPHP 6 编辑工具:PHPStorm 2021.3.3 系统环境:Windows 10 0x01 概述 (1)简介 ThinkPHP 框架简称 ...
- Spring Cloud Alibaba 官方实践指南【文章有点长自备咖啡茶点】
注:本文内容均转自官方文档,方便胖友们学习,不代表博主观点. 链接地址:SpringCloudAlibaba | Spring Cloud Alibaba 基于网关实现 SpringCloud 服务发 ...
- js 使用flow
前言 what is flow?我想是的,很多人都没有接触过,的确,他是一个新的项目,是的facebook开发的东西,一般还是可以的,有必要去学习一下,在react还是比较重要的. 它做的一件事叫做静 ...
- c# semaphoreSlim限制线程数
前言 我们在使用线程的时候,如果多个线程数去访问一个资源的时候,那么是非常影响程序的运行的,因为如果有写的操作,那么需要写锁,那么线程都会堵在同一个地方,那么我们可以限制一下访问一个资源的线程数. 正 ...
- 重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
前言 前面写过二分法使用的是递归手法,然后该节才有不递归的方式执行. 二分法的时间复杂度为log(2)n.空间复杂度为:1. 正文 代码: static void Main(string[] args ...
- 从零开始写 Docker(十一)---实现 mydocker exec 进入容器内部
本文为从零开始写 Docker 系列第十一篇,实现类似 docker exec 的功能,使得我们能够进入到指定容器内部. 完整代码见:https://github.com/lixd/mydocker ...
- Django框架——ORM执行SQL语句、神奇的双下划线、外键字段的创建、跨表查询、进阶操作
ORM执行SQL语句 有时候ORM的操作效率可能偏低 我们是可以自己编写SQL的 方式一: models.User.objects.raw('select * from app01_user') 方式 ...
- 浏览器端实现类似input限制输入两位小数,输入时光标从输入位置移动到最后
1.问题描述展示 示例代码所做限制为不允许输入字母d,其他限制规则可以根据需求自己调整,使用React编写,其他框架或原生均可根据该代码理解原理进行转变,特意使用了中文键盘可以看到输入框下面白色框闪出 ...