Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JDK8升级JDK17过程中遇到的那些坑

JDK8升级JDK17过程中遇到的那些坑

作者头像
程序猿川子
发布于 2023-05-24 09:11:38
发布于 2023-05-24 09:11:38
2K00
代码可运行
举报
运行总次数:0
代码可运行

1 前言

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

2 升级过程记录

2.1 安装JDK17

下载JDK17的最新版本jdk-17_linux-x64_bin.tar.gz,解压缩后移动到/usr/lib/jvm/目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shell复制代码$ sudo su -
# tar -xzf jdk-17_linux-x64_bin.tar.gz
# mv jdk-17.0.2 /usr/lib/jvm/java-17

修改~/.bashrc,设置java相关环境变量为JDK17

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bash复制代码# vim ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-17
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

环境变量生效后,检查当前的jdk版本为JDK17

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arduino复制代码# source ~/.bashrc

# java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)

2.2 升级spring版本到最新版本,编译

修改项目的pom.xml文件,将spring boot和spring cloud版本由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml复制代码    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
    </properties>

修改为最新正式发布版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml复制代码    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <spring-cloud.version>2022.0.2</spring-cloud.version>
    </properties>

编译项目,报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
复制代码程序包javax.servlet.http不存在
程序包javax.validation不存在

原因是原先javax包的名字改为jakarta了,将项目中所有依赖javax包的地方替换为jakarta

继续编译,报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
csharp复制代码[ERROR] 找不到符号
[ERROR]   符号:   类 EnableEurekaClient
[ERROR]   位置: 程序包 org.springframework.cloud.netflix.eureka

原因是新版本没有@EnableEurekaClient注解了,替换为@EnableDiscoveryClient

继续编译,报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vbnet复制代码[ERROR]  找不到符号
[ERROR]   符号:   方法 apply()
[ERROR]   位置: 接口 io.github.resilience4j.core.functions.CheckedSupplier<java.lang.Object>

原因是resilience4jCheckedSupplier接口新版本没有apply()方法了,改为get()方法

继续编译,报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scss复制代码[ERROR]  对于RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.util.Date), 找不到合适的构造器
[ERROR]     构造器 feign.RetryableException.RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.lang.Throwable,java.util.Date,feign.Request)不适用
[ERROR]       (实际参数列表和形式参数列表长度不同)
[ERROR]     构造器 feign.RetryableException.RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.util.Date,feign.Request)不适用
[ERROR]       (实际参数列表和形式参数列表长度不同)

原因是openfeign新版本的RetryableException异常类的构造函数发生了变化,根据需要将旧代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scss复制代码    @Bean
    public ErrorDecoder feignError() {
        return (key, response) -> {
            if (response.status() >= 500) {
                FeignException exception = FeignException.errorStatus(key, response);
                return new RetryableException(
                        response.status(),
                        exception.getMessage(),
                        response.request().httpMethod(),
                        new Date());
            }

            // 其他异常交给Default去解码处理
            return defaultErrorDecoder.decode(key, response);
        };
    }

改为以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scss复制代码    @Bean
    public ErrorDecoder feignError() {
        return (key, response) -> {
            if (response.status() >= 500) {
                FeignException exception = FeignException.errorStatus(key, response);
                return new RetryableException(
                        response.status(),
                        exception.getMessage(),
                        response.request().httpMethod(),
                        new Date(),
                        response.request());
            }

            // 其他异常交给Default去解码处理
            return defaultErrorDecoder.decode(key, response);
        };
    }

改为后继续编译,报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
复制代码程序包org.junit不存在
程序包org.junit.runner不存在
程序包junit.framework不存在

这是因为旧版本使用的是junit4,改为junit5相应的注解。即将:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java复制代码import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

@Ignore
@RunWith(MockitoJUnitRunner.class)
public class FileSyncerTest {
    
    @Before
    public void setUp() {

    }
    
    @Test
    public void testCase1() throws Exception {
    
    }

}

改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java复制代码import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;


@Disabled
@ExtendWith(MockitoExtension.class)
public class FileSyncerTest {
    
    @BeforeEach
    public void setUp() {

    }
    
    @Test
    public void testCase1() throws Exception {
    
    }

}

改为后继续编译,编译通过。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
less复制代码[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.582 s (Wall Clock)
[INFO] Finished at: 2023-05-04T16:39:42+08:00
[INFO] Final Memory: 59M/214M
[INFO] ------------------------------------------------------------------------

2.3 启动项目

编译通过后启动项目,启动失败,报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
csharp复制代码Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @7634b327
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
	at net.sf.cglib.core.ReflectUtils$2.run(ReflectUtils.java:56)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
	at net.sf.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:46)

这是因为从JDK9开始支持模块化了,项目中使用的部分组件可能还没有支持模块化,所以需要在jar包启动时添加add-opens jvm启动参数参数,我是通过在pom文件中添加build参数实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml复制代码    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 添加 add-opens jvm参数 -->
                    <jvmArguments>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArguments>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

修改完后重新编译启动,启动仍然失败,报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
csharp复制代码org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
Caused by: java.lang.NullPointerException: null

这是因为项目中使用了knife4j,由于版本比较低,底层依赖的是spring-fox,支持的是openapi 2.x版本,而spring boot 3.0只支持openapi 3.x版本,所以knife4j版本依赖由:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml复制代码    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-spring-boot-starter</artifactId>
        <version>2.0.5</version>
    </dependency>

改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml复制代码    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
        <version>4.1.0</version>
    </dependency>

同时将swagger的相关注解@Api@ApiOperation@ApiParam@ApiModel@ApiModelProperty替换为openapi3对应的注解:@Tag@Operation@Parameter@Schema@SchemaProperty

最后将swagger的配置类内容由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
less复制代码    @Bean(value = "oasConfig")
    public Docket oasConfig() {
        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                        .title("spring-project-framework")
                        .description("spring项目骨架")
                        .version("v1")
                        .build())
                .groupName("backup-v1")
                .select()
                .apis(RequestHandlerSelectors.basePackage("movee.api.v1"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
less复制代码    @Bean(value = "oasConfig")
    public GroupedOpenApi oasConfig(){
        return GroupedOpenApi.builder()
                .group("spring-project-framework-v1")
                .addOpenApiCustomizer(api -> api.info(new Info()
                        .title("spring-project-framework")
                        .description("spring项目骨架")
                        .version("v1")))
                .packagesToScan("movee.api.v1")
                .build();
    }

修改完后,重新编译启动,这次能正常启动了

但是web访问项目接口时报以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
less复制代码Caused by: java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.
	at org.springframework.web.cors.CorsConfiguration.validateAllowCredentials(CorsConfiguration.java:516)
	at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:538)
	at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1275)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
	... 36 common frames omitted

这个是跨域的问题,新版本spring MVC的CorsRegistry已经没有allowedOrigin() 方法了,替换为新接口allowedOriginPatterns()即可,代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typescript复制代码@Configuration
public class WebCorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

这时因为之前项目的spring cloudactuator的相关配置写在bootstrap.yml文件中,升级到spring boot 3之后actuator的端点(如/actuator/info等)无法访问,要想启动时系统读取bootstrap.yml中的配置,使bootstrap.yml文件中的配置生效,需要在项目的pom.xml文件中添加下面的依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml复制代码    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>

到此升级完成!

更进一步

之前项目中使用的GC收集器是CMS收集器,CMS收集器的调参非常繁琐,非常考验工程师的功底。ZGC声称能保证8MB~16TB的堆内存范围内都能保证GC的停顿时间在毫秒(官方声称小于10ms,也有些文章表示实际只有1、2ms)级别,尤其是一般情况下只要设置几个基本的GC参数就能让GC收集器很好的工作了,简直是工程师的福音。随着ZGC在JDK 15中正式GA,趁着升级JDK 17的机会立即把ZGC用起来。 设置几个基本的ZGC参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini复制代码# log
JVM_OPTS="$JVM_OPTS -XX:+PrintCommandLineFlags"
JVM_OPTS="$JVM_OPTS -Xlog:gc*:file=${LOG_DIR}/${PROJ_NAME}-gc-%p.log:time,uptime:filecount=10,filesize=50M"
JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError"
JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=${LOG_DIR}/${PROJ_NAME}-`date +%s`-pid$$.hprof"
JVM_OPTS="$JVM_OPTS -XX:ErrorFile=${LOG_DIR}/${PROJ_NAME}-`date +%s`-pid%p.log"
# memory
JVM_OPTS="$JVM_OPTS -Xms4g"
JVM_OPTS="$JVM_OPTS -Xmx4g"
JVM_OPTS="$JVM_OPTS --add-opens=java.base/java.lang=ALL-UNNAMED"
JVM_OPTS="$JVM_OPTS --add-opens=java.base/java.util=ALL-UNNAMED"
JVM_OPTS="$JVM_OPTS --add-exports=java.base/sun.security.ssl=ALL-UNNAMED"
JVM_OPTS="$JVM_OPTS --add-opens=java.base/sun.security.ssl.internal.ssl=ALL-UNNAMED"
# gc collector
JVM_OPTS="$JVM_OPTS -XX:+UseZGC"
# JVM_OPTS="$JVM_OPTS -XX:ConcGCThreads=4"
JVM_OPTS="$JVM_OPTS -XX:+UnlockDiagnosticVMOptions"
JVM_OPTS="$JVM_OPTS -XX:ZStatisticsInterval=10"

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
转型AI产品经理需要掌握的硬知识二:AI常见概念和算法梳理
上一篇文章介绍AI产品经理能力模型,人工智能的发展历史,人工智能常见概念的结构梳理,也简要做了BAT人工智能的优势分析,感兴趣的朋友可以点击链接查看上文。转型AI产品经理需要掌握的硬知识一:AI产品能力框架和看待AI的几个视角 本文将继续介绍Ai产品经理需要理解的一些概念,常见AI算法,机器学习的工作方式和三大流派,使用Tensorflow实现手写数字识别,帮助大家理解技术实现流程和一些AI技术名词,更有助于同AI科学家或AI工程师的沟通。
用户2559057
2018/08/27
8580
转型AI产品经理需要掌握的硬知识二:AI常见概念和算法梳理
人工智能相关的术语介绍
随着人工智能不再是一个模棱两可的营销术语,而是一个更精确的意识形态,很多人被人工智能相关的各种术语所困扰。因此,我们为您介绍了人工智能世界中一些最重要的术语。
程序你好
2019/11/06
1.5K0
言简意赅了解十大常见AI算法
二分类的线性分类模型,也是判别模型。 目的是求出把训练数据进行线性划分的分离超平面。 感知机是神经网络和支持向量机的基础。 学习策略:极小化损失函数。损失函数对应于误分类点到分离超平面的总距离。 基于随机梯度下降法对损失函数的最优化算法,有原始形式和对偶形式。
zenRRan
2019/11/20
1K0
人工智能-深度学习框架下的神经网络
枯木逢春:深度信念网络 ---- 深度信念网络的基本概念和基本原理,其要点如下: 深度信念网络是一种生成模型,能够建立输入和输出的联合概率分布; 受限玻尔兹曼机是构成深度信念网络的基本单元,是由可见层
iOSDevLog
2018/06/08
7650
AI探索(一)基础知识储备
凡是通过机器学习,实现机器替代人力的技术,就是AI。机器学习是什么呢?机器学习是由AI科学家研发的算法模型,通过数据灌输,学习数据中的规律并总结,即模型内自动生成能表达(输入、输出)数据之间映射关系的特定算法。这整个过程就是机器学习。
周希
2019/10/15
5180
学习笔记CB006:依存句法、LTP、N-最短路径、由字构词分词法、图论、概率论
依存句法分析,法国语言学家L.Tesniere1959年提出。句法,句子规则,句子成分组织规则。依存句法,成分间依赖关系。依赖,没有A,B存在错误。语义,句子含义。
利炳根
2018/03/09
1.8K0
【关于 NLP】百问百答
作者:杨夕、芙蕖、李玲、陈海顺、twilight、LeoLRH、JimmyDU、艾春辉、张永泰、金金金
杨夕
2021/03/11
1.1K0
【关于 NLP】百问百答
必看!一文了解信息抽取(IE)【命名实体识别NER】
信息抽取(information extraction),简称IE,即从自然语言文本中,抽取出特定的事件或事实信息,帮助我们将海量内容自动分类、提取和重构。这些信息通常包括实体(entity)、关系(relation)、事件(event)。信息抽取主要包括三个子任务:关系抽取、命名实体识别、事件抽取。
ShuYini
2020/08/17
3K0
必看!一文了解信息抽取(IE)【命名实体识别NER】
谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络、CV、NLP 难点解析
【新智元导读】 11月22日,谷歌在蒙特利尔的现有办公室开设了一个全新的深度学习和人工智能研究小组。新团队将作为位于山景城的 Google Brain 团队的远程部门,由从 Twitter 深度学习部门出来的 Hugo Larochelle 领导。Hugo Larochelle 是 Yoshua Bengio的博士生,Geoffrey Hinton之前的博士后。本文是他主讲的神经网络教程,内容包括神经网络原理介绍、深度学习及应用层面的计算机视觉和自然语言处理等等,课程深入浅出,且全面系统,是不可多得的了解深
新智元
2018/03/26
9930
谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络、CV、NLP 难点解析
人工智能和机器学习面试题
1.简述机器学习常用的分类算法,Logistic回归,SVM,Decision Tree,随机森林等相关分类算法的原理,公式推导,模型评价,模型调参。模型使用场景。
张哥编程
2025/01/19
1320
《统计学习方法》 ( 李航 ) 读书笔记
因为要准备面试,本文以李航的《统计学习方法》为主,结合西瓜书等其他资料对机器学习知识做一个整理。
石晓文
2019/06/04
1.7K0
《统计学习方法》 ( 李航 ) 读书笔记
机器学习及深度学习基础—7.20课堂笔记
三者关系可以用上面这张图来完整概括。深度学习的范围最小,其次是机器学习,人工智能的范围最大。
全栈程序员站长
2022/07/04
2480
机器学习及深度学习基础—7.20课堂笔记
几经沉浮,人工智能(AI)前路何方?
如同蒸汽时代的蒸汽机、电气时代的发电机、信息时代的计算机和互联网,人工智能(AI)正赋能各个产业,推动着人类进入智能时代。
算法进阶
2022/06/01
1.1K0
几经沉浮,人工智能(AI)前路何方?
《统计学习方法》读书笔记
【第1章】 统计学习方法概论 【第2章】 感知机 【第3章】 k 近邻法 【第4章】 朴素贝叶斯法 【第5章】 决策树 【第6章】 逻辑斯谛回归与最大熵模型 【第7章】 支持向量机 【第8章】 提升方法 【第9章】 EM算法及其推广 【第10章】 隐马尔科夫模型 【第11章】 条件随机场 【第12章】 统计学习方法总结
echobingo
2018/09/26
1.6K0
人工智能凭借什么过关斩将?| 机器学习算法大解析
本篇是人工智能专辑文章的第二篇,为大家归类总结人工智能的三类工作方式、九大算法及五大应用系统。
AI 电堂
2020/09/18
5790
2022春山东大学人工智能导论期末题库附答案
隐马尔可夫模型可以由五个元素来描述:隐含状态,可观测状态,初始状态概率矩阵,(),()
timerring
2022/07/20
2K0
2022春山东大学人工智能导论期末题库附答案
自然语言处理(NLP)学习路线总结
NLP是自然语言处理(Natural Language Processing)的缩写,它是计算机科学领域中专注于研究如何使计算机理解、生成和处理人类语言的学科。NLP涉及的技术包括但不限于分词、词性标注、句法分析、语义分析、机器翻译、情感分析、信息抽取、文本生成等。通过NLP,计算机可以处理和分析大量的文本数据,帮助人们更好地理解和应用语言信息。
机器学习AI算法工程
2024/07/04
1.3K0
自然语言处理(NLP)学习路线总结
一张图聊聊监督学习流程 | 股神的故事 | 山人聊算法 | 1st
山人今天开始将围绕机器智能的算法方面讲讲故事,主要涉及了建模的三要素:模型、策略、算法。这个坑很大,我尽自己最大的努力来填一填,争取用浅显易懂、生动有趣的方式对相关的理论、方法及应用聊一聊,文笔简陋、疏漏错误之处请各位看官不吝指点,这里先感谢了
用户7623498
2020/08/04
4660
一张图聊聊监督学习流程 | 股神的故事 | 山人聊算法 | 1st
业界 | 思必驰推出启发式对话系统,关注知识传播的会话精灵
对于对话系统来说,一般都可以分为特征处理、理解意图和生成答案等过程。思必驰北京研发院 NLP 负责人葛付江解释,在接收问句后,系统会进行进行分词、词性标注以及命名实体识别等过程以完成问句的特征处理过程。
机器之心
2018/07/26
4500
业界 | 思必驰推出启发式对话系统,关注知识传播的会话精灵
浅析深度学习在实体识别和关系抽取中的应用
实体识别 作者:蒙 康 编辑:黄俊嘉 命名实体识别 1 命名实体识别(Named Entity Recognition,NER)就是从一段自然语言文本中找出相关实体,并标注出其位置以及类型,如下图。命名实体识别是NLP领域中的一些复杂任务的基础问题,诸如自动问答,关系抽取,信息检索等 ,其效果直接影响后续处理的效果,因此是NLP研究的一个基础问题。 NER一直是NLP领域中的研究热点,现在越来越多的被应用于专业的领域,如医疗、生物等。这类行业往往具有大量的专业名词,名词与名词之间相互之间存在着不同种类
企鹅号小编
2018/01/10
2K0
浅析深度学习在实体识别和关系抽取中的应用
推荐阅读
相关推荐
转型AI产品经理需要掌握的硬知识二:AI常见概念和算法梳理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验