10/24

实验一:百度机器翻译SDK实验

一、实验要求

 任务一:下载配置百度翻译Java相关库及环境(占10%)。

    任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。

    任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。

    任务四:完成百度翻译GUI相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。

    实验总结:(占10%

二、实验步骤

任务一:

  • 访问百度翻译开放平台官网 百度翻译开放平台,注册账号并创建应用,以获得APP ID和密钥(Secret Key)。
  • 从百度翻译开放平台提供的页面下载Java SDK,通常包括几个Java类文件,如HttpGet.java等。

任务二:

文本翻译-通用版

  1. 1.   多语言支持:支持200多种语言的互译,能够满足跨语言交流的需求。
  2. 2.   自动语种检测:用户传入待翻译内容时,可以指定源语言,同时支持语种自动检测。
  3. 3.   术语干预:允许用户对翻译中的特定术语进行干预,以确保翻译的准确性。
  4. 4.   技术实力:依托互联网数据资源和自然语言处理技术,提供业界领先的机器翻译服务。
  5. 5.   翻译质量:在2019年国际机器翻译评测(WMT19)中,百度翻译获得中英翻译第一名。

文本翻译-词典版

  1. 1.   词典资源:在通用版的基础上,翻译结果附带百万量级的中英词典资源和语音合成资源,特别适合教育类应用开发者。
  2. 2.   专业词典版:提供全国科学技术名词审定委员会规范名词术语库,涵盖中英科学技术名词近百万条,具有专业权威性。
  3. 3.   教育应用:在外语教学及学习场景中,通过实时句子翻译、单词释义、语音合成等功能,帮助师生沟通、外教课后点评,辅助阅读和写作,全面提升学习效率与质量。

任务三:

package com.example.ruanjian;

import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.Scanner;

import static com.example.ruanjian.Sample.HTTP_CLIENT;
import static com.example.ruanjian.Sample.getAccessToken;

/**
 *
功能:
 *
作者:
 *
日期: 2024/11/1 15:29
 */
public class testTrans {
    public static void drawMenu() throws JSONException, IOException {
        System.out.println("选择翻译类型:");
        System.out.println("1.英译汉. ");
        System.out.println("2.汉译英. ");
        System.out.println("3.退出程序. ");
        System.out.print("请输入选项:");
        transEnToCh();
    }

    public static void transEnToCh() throws JSONException, IOException {
        Scanner scanner = new Scanner(System.in);
       switch (scanner.nextInt()){
            case 1:
                fromEnToCh();
                break;
            case 2:
                fromChToEn();
                break;
            case 3:
                System.out.println("退出程序");
                System.exit(0);
                break;
            default:
                System.out.println("输入错误,请重新输入!");
                break;
        }
    }

    public static void fromEnToCh() throws IOException, JSONException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入英文句子:");
        String sentence = scanner.nextLine();
        apiTrans(sentence,1);
    }

    public static void fromChToEn() throws IOException, JSONException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入中文句子:");
        String sentence = scanner.nextLine();
        apiTrans(sentence,2);
    }


    public static void apiTrans(String sentence,Integer choice) throws IOException, JSONException {
        String accessToken = getAccessToken();
        String query = new String();
        switch (choice){
            case 1:
                query = String.format("{\"q\":\"%s\", \"from\":\"en\", \"to\":\"zh\"}", sentence);
                break;
            case 2:
                query = String.format("{\"q\":\"%s\", \"from\":\"zh\", \"to\":\"en\"}", sentence);
                break;
            default:
                break;
        }
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, query); //封装请求
        Request request = new Request.Builder() //发送请求
                .url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=" + accessToken)
                .post(body)
                .addHeader("Content-Type", "application/json")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        dealJson(response.body().string());
    }

    public static void dealJson(String json) throws JSONException {
        JSONObject jsonObject = new JSONObject(json);
        try {
            // 获取result对象
            JSONObject result = jsonObject.getJSONObject("result");

            // 获取trans_result数组
            JSONArray transResultArray = result.getJSONArray("trans_result");

            // 由于我们只需要第一个翻译结果,所以取数组的第一个元素
            JSONObject transResult = transResultArray.getJSONObject(0);

            // 提取dst和src
            String dst = transResult.getString("dst");
            // 打印结果
            System.out.println("翻译结果: " + dst); // 输出: 你好,世界
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    public static void main(String[] args) throws JSONException, IOException {
        while (true){
            drawMenu();
        }
    }
}

 

任务四:

package com.example.ruanjian;

import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import static com.example.ruanjian.Sample.HTTP_CLIENT;
import static com.example.ruanjian.Sample.getAccessToken;

public class BaiduTranslateGUI {

    public static void main(String[] args) {
        // 创建 JFrame 实例
        JFrame frame = new JFrame("Baidu Translate");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);
        frame.setLayout(new BorderLayout(10, 10)); // 设置布局管理器和组件间的间隙

        // 创建面板,用于放置组件
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(10, 10, 10, 10); // 设置组件的外边距

        // 创建输入文本框
        JTextField inputTextField = new JTextField();
        inputTextField.setPreferredSize(new Dimension(380, 50));
        gbc.gridx = 1;
        gbc.gridy = 0;
        panel.add(new JLabel("Text to Translate:"), gbc);
        gbc.gridx = 2;
        gbc.gridy = 0;
        panel.add(inputTextField, gbc);

        // 创建下拉菜单选择源语言
        JComboBox<String> fromLanguageComboBox = new JComboBox<>(new String[]{"English", "Spanish", "French","Chinese"});
        gbc.gridx = 1;
        gbc.gridy = 1;
        panel.add(new JLabel("From:"), gbc);
        gbc.gridx = 2;
        gbc.gridy = 1;
        panel.add(fromLanguageComboBox, gbc);

        // 创建下拉菜单选择目标语言
        JComboBox<String> toLanguageComboBox = new JComboBox<>(new String[]{"Chinese", "Japanese", "German","English"});
        gbc.gridx = 1;
        gbc.gridy = 2;
        panel.add(new JLabel("To:"), gbc);
        gbc.gridx = 2;
        gbc.gridy = 2;
        panel.add(toLanguageComboBox, gbc);

        // 创建翻译按钮
        JButton translateButton = new JButton("Translate");
        translateButton.setPreferredSize(new Dimension(100, 30));
        gbc.gridx = 2;
        gbc.gridy = 3;
        gbc.gridwidth = 2; // 让按钮跨越两列
        gbc.fill = GridBagConstraints.CENTER;
        panel.add(translateButton, gbc);

        // 为按钮添加事件监听器
        translateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 这里可以添加调用百度翻译API的代码
                String sentence = inputTextField.getText();
                String from = fromLanguageComboBox.getSelectedItem().toString();
                String to = toLanguageComboBox.getSelectedItem().toString();
                String result = null;
                try {
                     result = translate(sentence, from, to);
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                } catch (JSONException ex) {
                    throw new RuntimeException(ex);
                }
                // 假设翻译结果是固定的,实际应用中应替换为API调用结果
                JOptionPane.showMessageDialog(frame, result);
            }
        });

        // 设置窗口的标题栏颜色
        frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);

        // 将面板添加到框架中
        frame.add(panel, BorderLayout.CENTER);

        // 显示窗口
        frame.setVisible(true);
    }

    public static String translate(String sentence, String from, String to) throws IOException, JSONException {
        switch (from) {
            case "Chinese":
                from = "zh";
                break;
            case "English":
                from = "en";
                break;
            case "Spanish":
                from = "spa";
                break;
            case "French":
                from = "fra";
                break;
            default:
                break;
        }
        switch (to) {
            case "Chinese":
                to = "zh";
                break;
            case "Japanese":
                to = "jp";
                break;
            case "German":
                to = "de";
                break;
            case "English":
                to = "en";
                break;
            default:
                break;
        }
        String query = String.format("{\"q\":\"%s\", \"from\":\"%s\", \"to\":\"%s\"}", sentence, from, to);
        String result = apiTrans(query);
        return result;
    }

    public static String apiTrans(String query) throws IOException, JSONException {
        String accessToken = getAccessToken();
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, query); //封装请求
        Request request = new Request.Builder() //发送请求
                .url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=" + accessToken)
                .post(body)
                .addHeader("Content-Type", "application/json")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        String result = dealJson(response.body().string());
        return result;
    }

    public static String dealJson(String json) throws JSONException {
        JSONObject jsonObject = new JSONObject(json);
        try {
            // 获取result对象
            JSONObject result = jsonObject.getJSONObject("result");

            // 获取trans_result数组
            JSONArray transResultArray = result.getJSONArray("trans_result");

            // 由于我们只需要第一个翻译结果,所以取数组的第一个元素
            JSONObject transResult = transResultArray.getJSONObject(0);

            // 提取dst和src
            String dst = transResult.getString("dst");
            return dst;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

 

 

 

 

三、实验总结

在本次实验中,我们完成了对百度机器翻译SDK的全面学习和实践。以下是实验的总结:

成功下载并配置了百度翻译Java相关库及环境,为后续的开发工作打下了坚实的基础。通过这一过程,我们熟悉了如何集成第三方服务到本地开发环境中,这对于未来的软件开发工作具有重要意义。

完成了百度翻译API的调用代码,并成功实现了中文到英文以及英文到中文的翻译功能。在编码和测试过程中,我们不仅提升了编程技能,还学会了如何调试和优化API调用,确保翻译结果的准确性和效率。

posted @ 2024-10-24 17:34  Hbro  阅读(22)  评论(0)    收藏  举报