当前位置: 代码网 > it编程>编程语言>Java > 使用React和Java实现文本摘要小工具

使用React和Java实现文本摘要小工具

2024年11月19日 Java 我要评论
在当今互联网时代,gpt、文心一言、通义千问等等模型的不断兴起,互联网可能正进入一个ai时代。本文讲通过一个小案列来讲述我们怎么通过ai给我们的项目、产品等赋能。本文将详细介绍如何使用 react 和

在当今互联网时代,gpt、文心一言、通义千问等等模型的不断兴起,互联网可能正进入一个ai时代。本文讲通过一个小案列来讲述我们怎么通过ai给我们的项目、产品等赋能。本文将详细介绍如何使用 react 和 java 搭建一个小型文本摘要工具,并基于 hugging face 提供的 api 来实现智能摘要功能。从功能分析到代码实现,我们将为你展现一个完整的技术实现过程。

项目目标

我们的目标是构建一个 web 应用,用户可以通过简单的界面输入文本并快速获取摘要内容。具体功能包括:

  • 文本输入框: 用户输入需要摘要的长文本。
  • 摘要展示框: 显示智能生成的文本摘要。
  • 后端 api: 使用 java 集成 hugging face 提供的模型服务。
  • 前后端交互: 基于 restful api,实现前端请求和后端处理的无缝衔接。

技术栈

前端

  • react:用于构建用户界面。
  • axios:用于发起 api 请求。
  • css:简单样式美化。

后端

  • spring boot:用于构建 restful 服务。
  • jakarta validation:用于校验用户输入。
  • hugging face api:调用预训练的文本摘要模型。

项目实现

1. 创建后端服务

1.1 项目结构

我们将采用分层架构,将代码分为以下模块:

  • controller 层: 处理请求和响应。
  • service 层: 核心业务逻辑。
  • client 层: 与 ai 模型或外部服务的交互。
  • dto: 用于数据传输。
  • 配置类: 用于定义全局配置,如 api 密钥等。

目录结构如下:

backend/
├── src/main/java/com/lucifer/summarizer/
│   ├── config/            # 配置类
│   ├── controller/        # 控制器
│   ├── service/           # 服务层
│   ├── client/            # ai服务交互
│   ├── dto/               # 数据传输对象
│   ├── exception/         # 异常处理
│   └── summarizerapplication.java
└── src/main/resources/
    ├── application.yml    # 配置文件
 

1.2 核心代码实现

1. 配置文件

application.yml

server:
  port: 8080
​
huggingface:
  api-key: your-huggingface-api-key
  model-url: https://api-inference.huggingface.co/models/facebook/bart-large-cnn

2. 配置类

huggingfaceconfig.java

package com.lucifer.summarizer.config;
​
import lombok.getter;
import org.springframework.beans.factory.annotation.value;
import org.springframework.context.annotation.configuration;
​
@configuration
@getter
public class huggingfaceconfig {
​
    @value("${huggingface.api-key}")
    private string apikey;
​
    @value("${huggingface.model-url}")
    private string modelurl;
}
​

3. 数据传输对象 (dto)

textinputdto.java

package com.lucifer.summarizer.dto;
​
import jakarta.validation.constraints.notblank;
import lombok.data;
​
import java.io.serializable;
​
@data
public class textinputdto implements serializable {
​
    @notblank(message = "文本不能为空")
    private string text;
}

textoutputdto.java

package com.lucifer.summarizer.dto;
​
import lombok.allargsconstructor;
import lombok.data;
​
@data
@allargsconstructor
public class textoutputdto implements serializable {
​
    private string summary;
}

4. 客户端

huggingfaceclient.java

package com.lucifer.summarizer.client;
​
import com.lucifer.summarizer.config.huggingfaceconfig;
import lombok.allargsconstructor;
import okhttp3.*;
import org.springframework.stereotype.component;
​
import java.io.ioexception;
​
@component
@allargsconstructor
public class huggingfaceclient {
​
    private final huggingfaceconfig config;
​
    public string getsummary(string text) throws ioexception {
        okhttpclient client = new okhttpclient();
​
        requestbody body = requestbody.create(
                "{"inputs":"" + text + ""}",
                mediatype.get("application/json")
        );
        request request = new request.builder()
                .url(config.getmodelurl())
                .addheader("authorization", "bearer " + config.getapikey())
                .post(body)
                .build();
​
        try (response response = client.newcall(request).execute()) {
            if (response.issuccessful()) {
                assert response.body() != null;
                return response.body().string();
            } else {
                throw new ioexception("failed to get summary: " + response.message());
            }
        }
    }
}
​

5. 服务层

summarizerservice.java

package com.lucifer.summarizer.service;
​
public interface summarizerservice {
​
    string summarizetext(string text);
}

summarizerserviceimpl.java

package com.lucifer.summarizer.service.impl;
​
import com.lucifer.summarizer.client.huggingfaceclient;
import com.lucifer.summarizer.service.summarizerservice;
import lombok.allargsconstructor;
import org.springframework.stereotype.service;
​
import java.io.ioexception;
​
@service
@allargsconstructor
public class summarizerserviceimpl implements summarizerservice {
​
    private final huggingfaceclient client;
​
    @override
    public string summarizetext(string text) {
        try {
            return client.getsummary(text);
        } catch (ioexception e) {
            throw new runtimeexception("error while summarizing text", e);
        }
    }
}

6. 控制器

summarizercontroller.java

package com.lucifer.summarizer.controller;
​
import com.lucifer.summarizer.dto.textinputdto;
import com.lucifer.summarizer.dto.textoutputdto;
import com.lucifer.summarizer.service.summarizerservice;
import lombok.allargsconstructor;
import org.springframework.http.responseentity;
import org.springframework.web.bind.annotation.postmapping;
import org.springframework.web.bind.annotation.requestbody;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;
import jakarta.validation.valid;
​
@restcontroller
@allargsconstructor
@requestmapping("/api/v1")
public class summarizercontroller {
​
    private final summarizerservice summarizerservice;
​
    @postmapping("/summarizer")
    public responseentity<textoutputdto> summarize(@valid @requestbody textinputdto input) {
        string summary = summarizerservice.summarizetext(input.gettext());
        return responseentity.ok(new textoutputdto(summary));
    }
}

7. 异常处理

package com.lucifer.summarizer.exception;
​
import org.springframework.http.httpstatus;
import org.springframework.http.responseentity;
import org.springframework.web.bind.annotation.controlleradvice;
import org.springframework.web.bind.annotation.exceptionhandler;
​
@controlleradvice
public class globalexceptionhandler {
​
    @exceptionhandler(runtimeexception.class)
    public responseentity<string> handleruntimeexception(runtimeexception ex) {
        return responseentity.status(httpstatus.internal_server_error).body("error: " + ex.getmessage());
    }
​
    @exceptionhandler(exception.class)
    public responseentity<string> handleexception(exception ex) {
        return responseentity.status(httpstatus.bad_request).body("error: " + ex.getmessage());
    }
}

8. 服务启动

9. 接口测试

2. 创建前端界面

2.1 初始化 react 项目

使用 create-react-app 初始化项目:

npx create-react-app text-summary-app
cd text-summary-app

安装 axios:

npm install axios

2.2 创建主界面组件

import react, { usestate } from "react";
import axios from "axios";
​
const textsummary = () => {
  const [text, settext] = usestate("");
  const [summary, setsummary] = usestate("");
  const [loading, setloading] = usestate(false);
​
  const handlesubmit = async () => {
    if (text.trim().length < 10) {
      alert("请输入至少10个字符的文本!");
      return;
    }
​
    setloading(true);
    try {
      const response = await axios.post("/api/v1/summarizer", { text });
      setsummary(response.data);
    } catch (error) {
      alert("请求失败,请稍后重试!");
    } finally {
      setloading(false);
    }
  };
​
  return (
    <div style={{ padding: "20px", fontfamily: "arial, sans-serif" }}>
      <h1>ai 文本摘要工具</h1>
      <textarea
        style={{ width: "100%", height: "150px", marginbottom: "20px" }}
        value={text}
        onchange={(e) => settext(e.target.value)}
        placeholder="输入需要摘要的文本..."
      ></textarea>
      <button onclick={handlesubmit} disabled={loading}>
        {loading ? "处理中..." : "生成摘要"}
      </button>
      {summary && (
        <div style={{ margintop: "20px", padding: "10px", border: "1px solid #ccc" }}>
          <h2>摘要结果:</h2>
          <p>{summary}</p>
        </div>
      )}
    </div>
  );
};
​
export default textsummary;

2.3 配置代理(开发环境)

在 package.json 中添加代理配置:

"proxy": "http://localhost:9527"

深入优化

1.用户体验:

  • 添加字符计数器,限制输入长度。
  • 使用第三方组件库(如 material-ui)改进界面样式。

2.性能优化:

  • 在后端使用缓存(如 redis)存储最近的摘要结果。
  • 在前端增加延迟请求,减少频繁调用。

3.错误处理:

  • 处理 hugging face api 的限流问题。
  • 提供友好的错误提示。

4.扩展功能:

  • 支持多语言摘要。
  • 添加更多 ai 模型(如情感分析、关键词提取)。

以上就是使用react和java实现文本摘要小工具的详细内容,更多关于react java文本摘要的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com