`

java 实现百度语言翻译机

阅读更多
百度语言翻译机
题目来源于http://www.programfan.com/acm/,题目如下:

时限 1s
百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套
独特的缩略语。他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。

为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决
定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。

输入要求:

输入数据包含三部分:
1. 第一行包含一个整数N(N<=10000),表示总共有多少个缩略语的词条;
2. 紧接着有N行的输入,每行包含两个字符串,以空格隔开。第一个字符串为缩略语(
仅包含大写英文字符,长度不超过10字节),第二个字符串为日常语言(不包含空格,
长度不超过255字节);
3. 从第N+2开始到输入结束为包含缩略语的相关文档(总长度不超过1000000个字节)。
例:
6
PS 门户搜索部
NLP 自然语言处理
PM 产品市场部
HR 人力资源部
PMD 产品推广部
MD 市场发展部
百度的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。
输出要求:
输出将缩略语转换成日常语言后的文档。(将缩略语转换成日常语言,其他字符保留原 
样)。例:
百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等 ,其中门户搜索部还包括自然语言处理小组。
注意: 
  1. 输入数据中是中英文混合的,中文采用 GBK 编码。 
         2. 为保证答案的唯一性,缩率语的转换采用正向最大匹配(从左到右为正方向)的原则。请注意输入例子中 PMD 的翻译。

 

实现思路:
1. 从输入的文本串读取大写字母字符串
2. 使用 正向最大匹配算法 对步骤1截取的大写字母字符串 进行翻译,翻译过程大致如下:
 

  由题意知,缩略语长度不超过10,所以在此定义最长的匹配长度为10.
   每次从左到右读取字符串的前10个字节(如果字符串长度<10,则读取整个字符串),判断该子串是否在语料库中存在,若存在,则返回对应的翻译结 果;否则,去掉子串的最后一个字节,再与语料库进行匹配。如此反复执行,直至找到对应翻译结果为止(如果读到最后一个大写字母,仍未找到翻译结果,则表明 该字母并非需要需要翻译,直接输出即可)。

  正向最大匹配算法 举例来说:
正向最大匹配算法 举例 写道
以 “我是一个好人” 为例

正向的顺序为
我是一
我是
我 ===> 得到一个词

是一个
是一
是 ===>得到一个词

一个好
一个===> 得到一个词
好人===>得到一个词

结果 我、是、一个、好人
 

3.将翻译的结果拼接在 最终的翻译字符串尾部。
4.将剩余的非大写字母字符串拼接在 最终的翻译字符串尾部。

具体代码如下:

package com.sabrina.baiduTranslation;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MaximumMatchingMethod {

    // 最大匹配长度
    private static final int MAX_MATCHING_LENGTH = 10;
    // 语料库
    private Map corpus = null;
    
    MaximumMatchingMethod(Map corpus) {
        this.corpus = corpus;    
    }
    
    public static void main(String[] args) {
        // 手动设置语料库,也可以从文件中读取
        final Map corpus = new HashMap();
        
        corpus.put("PS", "门户搜索部");
        corpus.put("NLP", "自然语言处理");
        corpus.put("PM", "产品市场部");
        corpus.put("HR", "人力资源部");
        corpus.put("PMD", "产品推广部");
        corpus.put("MD", "市场发展部");

        // 创建 正向最大匹配算法 对象
        MaximumMatchingMethod maxMatching = new MaximumMatchingMethod(corpus);
        
        // 测试文本段
        String content = "百度的部门包括 PS , PM , HR , PMD , MD 等等,其中 PS 还包括 NLP 小组。";
        // 大写字母字符串正则匹配
        Pattern pattern = Pattern.compile("[A-Z]+");
        Matcher matcher = pattern.matcher(content);
        StringBuffer sbr = new StringBuffer();
        String subString = "";
        
        // 循环判断是否匹配到文本段中的大写字符字符串
        while(matcher.find()) {
            // 取出匹配到的大写字符串
            subString = content.substring(matcher.start(), matcher.end());
            // 使用 正向最大匹配算法 获得翻译后的结果串
            matcher.appendReplacement(sbr,    maxMatching.getMaximumMathcingString(subString));
        }
        // 将剩余字符串拼接到缓存StringBuffer对象尾部
        matcher.appendTail(sbr);
        System.out.println(sbr.toString());
        
        // 测试getMaximumMathcingString()方法
        System.out.println();
        System.out.println(maxMatching.getMaximumMathcingString("PSNNLPPMHRPMDDMD"));
    }
    
    public String getMaximumMathcingString(String toMatchedString) {
        // 打印待分析的字符串
        System.out.println("----------------- " + toMatchedString + " -----------------");
        byte[] toMatchedBytes = toMatchedString.getBytes();
        String result = "";
        int startIndex = 0;
        int offset = MAX_MATCHING_LENGTH;
        while(startIndex < toMatchedBytes.length) {
            // 如果起始索引到字符串末尾的距离 小于 最大匹配长度,则偏移量为
            // 字符串末尾 - 起始索引;
            // 否则,偏移量为 最大匹配长度
            offset = ((startIndex + MAX_MATCHING_LENGTH) > toMatchedBytes.length) ?
                (toMatchedBytes.length - startIndex) : MAX_MATCHING_LENGTH;

            String subString = "";
            // 如果偏移量>0 并且当前子串在语料库中不存在
            while(offset > 0 &&
                    !corpus.containsKey((subString = toMatchedString.substring(startIndex, startIndex + offset)))) {
                -- offset;
            }
            if(offset > 0) { // 子串在语料库中存在
                result += corpus.get(subString);
                startIndex = startIndex + offset;
            }
            else {
                result += subString;
                startIndex = startIndex + 1;
            }
        }
        return result;
    }
}

 PS: 若思路或代码中有误,敬请指正~

 

分享到:
评论

相关推荐

    30个基于JAVA语言设计的工程项目软件源码源代码+WORD论文说明文档资料.zip

    JAVA语言考试系统的设计与实现(论文+源代码+文献综述+外文翻译+开题报告).rar java银行帐目管理系统(源代码+论文).rar JAVA音像店租赁管理系统的设计与实现(源代码+论文).rar 基于J2EE的B2C电子商务系统开发(论文+...

    android文字识别并翻译

    为了实现文字的翻译,可以使用百度AI开放平台提供的翻译API。该API支持多种语言之间的互译,开发者可以通过调用API将OCR识别出的文字作为输入,获取对应的翻译结果。同样,这需要先注册账号获取API密钥,并在代码中...

    【Java语言学习(一)】

    Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心机制之一,负责将Java字节码翻译成机器码并执行。垃圾收集机制(Garbage Collection,GC)是Java虚拟机的另一个核心机制,负责回收java程序中的垃圾对象,...

    诺基亚塞班智能手机sisx,java软件.rar

    金山词霸是一款知名的电子词典软件,其JAVA版本可以为用户提供离线的单词查询、翻译功能,对于学习者来说非常实用。虚拟键盘则可能是一个软件键盘应用,能够在没有物理键盘的设备上提供输入功能,提升用户的文字输入...

    java百度音乐播放器源码-HappyPlayer-PC:乐乐音乐播放器,支持ape,wav,flac,mp3等多种格式,支持动态ksc、hr

    java百度音乐播放器源码 简介 乐乐音乐是基于musique 开源播放器开发的java swing音乐播放器,实现了mp3、flac、ape、wav等多种音频格式的播放和ksc歌词的解析、制作和显示 乐乐音乐6.0 乐乐6.0是网络版,添加了在线...

    使用百度的技巧 使用百度的技巧

    百度翻译能在线翻译文字、段落,甚至整个网页,支持多种语言,方便跨语言交流。 了解并熟练运用这些百度搜索技巧,可以极大地提高我们的信息获取效率,帮助我们更快更准确地找到所需答案。在日常学习、工作和生活...

    基于android的在线翻译app

    在本项目"基于Android的在线翻译App"中,开发者利用了Android平台的开发技术,结合百度翻译API,创建了一个能够实现实时翻译功能的应用程序。这个应用不仅提供了基础的翻译服务,还允许用户将重要的单词或短语收藏,...

    fanyi_java_tree9zf_fanyi.Baidu.com_mightg2h_

    它利用了百度翻译接口,百度翻译是百度公司提供的一个强大的机器翻译服务,能够支持多种语言之间的互译。 标签进一步确认了关键元素:"java"再次强调了编程语言,"tree9zf"和"fanyi.Baidu.com"与项目标识符相对应,...

    百度2015 产品岗.pdf

    针对当前产品未能很好满足的需求,比如行中实时翻译,可以开发一款结合AI技术的实时语音翻译应用,用户只需对着手机说话,就能得到准确的多语言翻译,极大地便利了国际旅行者的沟通。 综上所述,为百度搜索添加社交...

    基于android的导航系统的设计与实现(完整版)资料.doc

    【基于Android的导航系统设计与实现】的资料涵盖了Android技术在构建导航系统中的应用,结合了百度API和科大讯飞语音API,旨在为用户提供高效、便捷的地图服务。以下是相关知识点的详细说明: 1. **Android技术基础...

    巴斯著计算机算法-设计与分析导论(网友翻译版)

    - **平台兼容性**:Java语言在多种平台上都有良好的支持,便于算法的实际实现与测试。 - **工具支持**:Java提供了丰富的开发工具,有助于算法的设计、实现与调试。 #### 六、算法描述与分析的基本概念 - **算法...

    AIUIChatSDK:语音方案:百度语音库 baidulib、讯飞语音AIUI库 chatsdk、讯飞语音msc库 iflylib;支持全双工语音识别,边听边识别,适合快速集成,体验效果

    :是对AIUI的语音SDK封装,套餐费用最低在6万/年 ...场景:(语音点读笔、AI机器人、智能音箱、车载语音、家电语音、人机交互、在线教育机器人、语音鼠标、实时翻译、大屏广告互动、...) 落地产品公司:

    二十三种设计模式【PDF版】

    GoF 的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF 的设计模式是一座"桥" 就 Java 语言体系来说,GOF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一...

    PowerWord.exe

    8.引进百度专业翻译引擎,长文本翻译一键搞定:如同PC上的翻译引擎一样,在手机上,您一样可以体验到同等质量的翻译效果。如果您经常阅读英文文件或是需要翻译短信、邮件等,翻译功能将是您最好的帮手。 IOS版 软件...

    免费接口调用大全

    5. 翻译接口:例如Google Translate或百度翻译API,这些接口能实现多语言之间的文本翻译,对全球化应用或者多语种网站来说至关重要。 6. 视频处理接口:这些接口可能涉及视频上传、转码、剪辑、水印添加等功能,...

    基于Android系统电子词典的设计与开发

    - 用户可以输入英文句子,软件通过调用百度API实现翻译,并显示翻译结果。 3. **单词本管理**: - 用户可以将查询过的不熟悉单词添加到单词本中,便于日后复习。 - 单词本中的单词支持分类管理,用户可以根据不同...

    网络搜索知识技巧

    百度翻译功能支持多语言互译,对于外语学习者来说非常实用。 **只知道发音也知道要搜什么** 即使只知道单词的发音,也可以通过输入拼音等方式进行搜索。 **复杂的算术都能一秒钟搞定** 百度具备强大的计算能力,...

    编程新手真言绝对实用

    而汇编器则将汇编语言翻译成机器语言。 14. **平台之GUI**:图形用户界面(GUI)为用户提供了一个直观的操作环境,使他们可以通过鼠标和键盘来与计算机交互。 15. **界面的本质应该是命令行功能支持下的配置描述...

    mooc编译原理_课件合集 哈工业陈鄞

    高级语言如C、Java等,它们接近人类的表达习惯,不依赖于特定机器,且编写效率较高。与之相对的汇编语言和机器语言,则对非计算机专业人员来说使用受到限制,编写效率低,而且难以记忆和理解。 编译器是连接高级...

    appium手机自动化测试-黄延胜

    - **跨语言编程:** 支持Java、Python、Ruby、Node.js以及PHP等多种编程语言进行自动化脚本编写。 - **跨应用程序交互:** 可以在不同的应用程序之间进行交互测试。 - **无需源代码:** 进行自动化测试不需要访问...

Global site tag (gtag.js) - Google Analytics