前景提示

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

思考

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

序号 名称 地址
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实现的更多相关文章

  1. Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...

  2. Java 调用python说明文档

    Java 调用python说明文档 通过java调用python脚本主要如下三种方式: 1.直接执行python脚本: 2.执行python.py文件: 3.使用Runtime.getRuntime( ...

  3. java调用python程序以及向python程序传递参数

    在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python ...

  4. java调用python脚本并向python脚本传递参数

    1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

  5. java调用python的惨痛史(无法获取环境变量)

    环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle        事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用pyt ...

  6. (转)java调用python脚本

    这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...

  7. [Java/Python] java调用python脚本问题记录

    Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...

  8. Runtime.getRuntime().exec()实现Java调用python程序

    使用Runtime.getRuntime().exec()来实现Java调用python,调用代码如下所示: import java.io.BufferedReader; import java.io ...

  9. java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  10. Java调用Python相关问题:指定python环境、传入参数、返回结果

    本篇文章涉及到的操作均在Windows系统下进行,Java调用python在原理上不难,但是可能在实际应用中会有各种各样的需求,网上其他的资料很不全,所以又总结了这篇文章,以供参考. 一.指定pyth ...

随机推荐

  1. #莫比乌斯反演,整除分块#洛谷 6222 「P6156 简单题」加强版

    题目 多组询问,给出\(n,k\) 求 \[\sum_{i=1}^n\sum_{j=1}^n(i+j)^kgcd(i,j)\mu^2(gcd(i,j)) \] 对\(\text{unsigned}\) ...

  2. 小师妹学JavaIO之:try with和它的底层原理

    目录 简介 IO关闭的问题 使用try with resource try with resource的原理 自定义resource 总结 简介 小师妹是个java初学者,最近正在学习使用java I ...

  3. [一本通1681]统计方案 题解(Meet in mid与逆元的结合)

    题目描述 小\(B\)写了一个程序,随机生成了\(n\)个正整数,分别是\(a[1]-a[n]\),他取出了其中一些数,并把它们乘起来之后模\(p\),得到了余数\(c\).但是没过多久,小\(B\) ...

  4. Qt 5.12.10 国际化

    网上有资料但是不全,所以这里记录一份比较全的 1.创建项目 2.编辑 demo.cpp 这里写button用来做国际化示例,运行软件后是这个样子 #include "demo.h" ...

  5. Android 开发入门(3)

    0x05 活动 Activity (1)启停活动页面 a. 启动和结束 从当前页面跳转至新页面 startActivity(new Intent(this, [targetPage].class)) ...

  6. CentOS 6.5 LAMP分主机平台的搭建及测试

    CentOS 6.5 LAMP分主机平台的搭建及测试 看似非常之完备,转来抽空测试学习 原文地址:http://www.it165.net/os/html/201403/7595.html 前言   ...

  7. 报表工具能用来做 DashBoard 和大屏吗?

    我们首先来理一下 DashBoard.大屏和报表的关系. DashBoard 是指企业仪表盘,也叫管理者驾驶舱,通常被简称为 DBD.从表现形式上来看,DBD 由多个决策者关注的各类指标数据拼接而成, ...

  8. ip 记录路由选项

    前言 准备整理网络这块,先把概念整理. ip记录路由选项,这个是做什么的呢? 比如说我们发的一条信息,从一端到另外一端经过了那些路由呢?这是一个问题啊. 这个ip记录路由选项就是来看这个问题的,当然这 ...

  9. GaussDB(DWS)基于Flink的实时数仓构建

    本文分享自华为云社区<GaussDB(DWS)基于Flink的实时数仓构建>,作者:胡辣汤. 大数据时代,厂商对实时数据分析的诉求越来越强烈,数据分析时效从T+1时效趋向于T+0时效,为了 ...

  10. vue3.0 中文文档(暂时)地址

    https://v3.cn.vuejs.org/ https://vue-docs-next-zh-cn.netlify.app/guide/installation.html#vue-devtool ...