机构名称匹配问题

n 问题描述

在招投标信息管理系统中,准确匹配和标注机构名称对于文档管理和信息检索至关重要。基于一个预设的机构全程列表,为每条文档信息自动打上机构标签。这一任务在实际操作中面临诸多挑战,尤其是同一机构可能使用多种不同的名称表述方式,包括全称、简称、别称等。例如,同一机构可能在不同的文档中以“中华人民共和国国家发展和改革文员会”、“国家发改委”、“发改委”等不同名称出现。

给定待匹配文档中的机构名称S和包含N个机构全称的列表L,根据本题目的假设定义,输出L中的所有与S匹配的机构全称列表LS。

假设判断机构名称S与L中的一个机构全称Li是否匹配的定义如下:

(1) 计算S和Li的最长公共子序列:即找出S和Li中公有的、最长的汉字序列。这个序列中的汉字不需要在每个机构名称中连续出现,但在两个名称中的顺序必须是一致的。

例如:S=“国家发改委部门”,Li=“中华人民共和国国家发展和改革委员会”,S和Li的最长公共子序列为“国家发改委”。

(2) 计算最长公共子序列长度占S和Li中较短长度的比例。

(3) 如果长度占比大于等于80%,则认为Li与S匹配,并将Li加入到匹配列表LS中;否则,不加入。

提示:1≤N≤100,2≤机构名称长度≤20

n 要求:

完成题目对应的程序模板(OrgNameMatch)中的方法:

String[] match(String name, String[] fullnames);

该方法的入口参数name为给定的机构名称,fullnames为给定的机构全称列表。

最后返回结果为所有匹配的机构全称列表LS

n 样例:

样例1:

输入:name=“中国铁路部”,fullnames=[“中国铁路总公司”,“中华铁路集团”,“中国铁路工程集团”]

输出:[“中国铁路总公司”,“中国铁路工程集团”]

解释:给定的别称“中国铁路部”与“中国铁路总公司”和“中国铁路工程集团”的最长公共子序列都是“中国铁路”,相似度都是80%,等于设定的阙值80%。

因此,这两个全称都被视为匹配。而“中华铁建集团”与简称“中国铁路部”的相似度为40%,未达到阙值,不被视为匹配。

样例2:

输入:name = "国家电力", fullnames = ["国家电网公司", "国家电力投资 集团公司“,”国际电力发展公司"]

输出:[“国家电力投资集团公司”]

 

static String[] match(String name, String[] fullnames) {
        List<String> ansL = new ArrayList<String>();
        for (int i = 0; i < fullnames.length; i++) {
            char[] keys = name.toCharArray();
            double num = 0;
            for (int j = 0; j < keys.length; j++) {
                if (fullnames[i].contains(String.valueOf(keys[j]))) {
                    num++;
                }
            }
            if (num / name.length() >= 0.8) {
                ansL.add(fullnames[i]);
            }
        }
        return ansL.toArray(new String[ansL.size()]);
    }

    public static void main(String[] args) {
        String name = "中国铁路部";
        String[] fullnames = {"中国铁路总公司","中华铁路集团","中国铁路工程集团"};
        String[] ans = match(name, fullnames);
        for (int i = 0; i < ans.length; i++) {
            System.out.print(" " + ans[i]);
        }
        System.out.println();
        System.out.println("============================================");
        name = "国家电力";
        String[] fullnames_1 = {"国家电网公司","国家电力投资集团公司", "国际电力发展公司"};
        String[] ans_1 = match(name, fullnames_1);
        for (int i = 0; i < ans_1.length; i++) {
            System.out.print(" " + ans_1[i]);
        }
        System.out.println();
    }

 

posted @ 2024-04-02 11:12  理想与现实之争  阅读(8)  评论(1编辑  收藏  举报