Java中嘈杂的字符串匹配?

Java中嘈杂的字符串匹配?,java,string,pattern-matching,substring,Java,String,Pattern Matching,Substring,考虑以下字符串: Arg=“北卡罗来纳州州立大学” 文本=Hackney在进入北卡罗来纳大学教堂山分校之前就读北卡罗来纳州立大学,在那里他获得了学士学位和法学博士学位。他从1971年至1974年担任检察官,然后开始私人执业。1974年,他是国会议员艾克·安德鲁斯的竞选经理。在北卡罗来纳大学教堂山分校读本科时,他写了一篇关于北卡罗来纳州惩戒系统历史的荣誉论文。” 我知道文本中可以找到Arg的变体,但不一定相同,Arg可能会有噪音 另一个例子如下: Arg2=“莫里斯•布莱克本” Text2=“Ma

考虑以下字符串:

Arg=“北卡罗来纳州州立大学”

文本=Hackney在进入北卡罗来纳大学教堂山分校之前就读北卡罗来纳州立大学,在那里他获得了学士学位和法学博士学位。他从1971年至1974年担任检察官,然后开始私人执业。1974年,他是国会议员艾克·安德鲁斯的竞选经理。在北卡罗来纳大学教堂山分校读本科时,他写了一篇关于北卡罗来纳州惩戒系统历史的荣誉论文。”

我知道文本中可以找到Arg的变体,但不一定相同,Arg可能会有噪音

另一个例子如下:

Arg2=“莫里斯•布莱克本”

Text2=“Maurice McCrae Blackburn(1880年11月19日至1944年3月31日),澳大利亚政治家和律师,出生于维多利亚州英格尔伍德。1887年父亲去世后,他随母亲搬到了墨尔本。1896年,他在墨尔本文法学校接受入学教育。完成学业后,他参加了墨尔本大学,于1909毕业于文法学院,一年后开始执业律师。 在上面的示例中,Arg2中的中间名称不用于Text2

Arg3=“堪萨斯州城市大都会地区” Text3=“罗奇当选为第六十七届和第六十八届国会的共和党人(1921年3月4日至1925年3月3日)。他曾担任司法部支出委员会主席(第六十八届大会)。他是1924年第六十九届国会连任的失败候选人。1924年12月27日,他搬到密苏里州的圣路易斯,并恢复了法律执业。1934年6月29日,他在密苏里州堪萨斯城去世。他被安葬在密苏里州罗奇附近的罗奇公墓”

在本例中,“堪萨斯城”出现在文本3中,但没有“大都会区”(如Arg3中所示)


是否有任何函数/库可以发现文本中出现的Arg?

这似乎是一个标准的搜索引擎问题。如果查询和搜索字符串较小,则需要对查询和搜索字符串进行标记化。然后在搜索字符串中按递增顺序搜索标记


搜索引擎也会这样做,标记化是一个非常困难的问题。并非所有语言都使用空格作为分隔符。中文/日文将是标记化者的噩梦。

我希望这个答案至少能帮助你获得一些想法。我创建了一个方法来回答这个问题

是否有函数/库用于发现文本中出现的参数

下面是我使用上述示例从方法中获得的以下输出:

Arg=“北卡罗来纳州州立大学”

Text=“哈克尼以前就读于北卡罗来纳州立大学 转到北卡罗来纳大学教堂山分校,在那里 他获得学士和法学博士学位。他是一名教师 检察官1971-74年开始私人执业。1974年,, 他是国会议员艾克·安德鲁斯的竞选经理。当 在北卡罗来纳大学教堂山分校读本科,他在 北卡罗来纳惩戒系统的历史。”

输出

比赛结果

字:4/4

信函:28/28


Arg2=“莫里斯•布莱克本”

Text2=“莫里斯·麦克雷·布莱克本(1880年11月19日至1944年3月31日), 澳大利亚政治家和律师,生于维多利亚州英格伍德。他 父亲去世后,他和母亲搬到了墨尔本 1887年。他在墨尔本文法学校接受教育,于年入学 1896完成学业后,他参加了墨尔本大学,于1909毕业于文法学院,并开始实践。 一年后当律师。”

输出

比赛结果

字:2/2

信函:16/16


Arg3=“堪萨斯州城市大都会地区”

Text3=“罗奇当选为总统 第六十七届和第六十八届大会共和党人(3月4日, 1921年3月3日,1925年)。他曾担任人权委员会主席 司法部支出(第六十八届大会)。他 是1924年竞选连任的失败候选人 第六十九届大会。12月27日,他搬到了密苏里州的圣路易斯, 1924年,恢复了法律实践。他死在堪萨斯城, 密苏里州,1934年6月29日。他被安葬在Roach附近的Roach墓地, 密苏里州”

输出

比赛结果

字:2/4

信函:13/26

此方法只搜索英文字母表,只搜索单词(以空格分隔)它也不会搜索无序的文字。如果你搜索cat,有人键入acat,它将显示为不匹配,也不会显示为任何字母匹配。这是因为狗不是热狗。你真的必须决定你想要的匹配有多模糊。此代码决不是最好的,但我希望它能给你一些想法和建议也许你可以把它改写得更整洁有序。不管怎样,它都能准确回答你提出的问题

public static String search(String search, String target) {
        String result = "";
        search = search.toLowerCase();
        target = target.toLowerCase();
        StringBuilder temp = new StringBuilder();
        ArrayList<String> searchWords = new ArrayList<String>();
        ArrayList<String> targetWords = new ArrayList<String>();
        char lastChar = ' ';
        char currentChar = ' ';
        // search,text
        int swords, twords, sletters, tletters, mwords, mletters;
        swords = twords = sletters = tletters = mwords = mletters = 0;

        for (Character c : search.toCharArray()) {
        currentChar = c > 96 && c < 123 ? c : ' ';
        if (lastChar == ' ' && currentChar == ' ')
            continue;
        if (currentChar != ' ' && ++sletters != 0)
            temp.append(currentChar);
        else {
            searchWords.add(temp.toString());
            temp.setLength(0);
        }
        lastChar = currentChar;
        }
        searchWords.add(temp.toString());
        temp.setLength(0);
        lastChar = ' ';
        for (Character c : target.toCharArray()) {
        currentChar = c > 96 && c < 123 ? c : ' ';
        if (lastChar == ' ' && currentChar == ' ')
            continue;
        if (currentChar != ' ' && ++tletters != 0)
            temp.append(currentChar);
        else {
            targetWords.add(temp.toString());
            temp.setLength(0);
        }
        lastChar = currentChar;
        }
        targetWords.add(temp.toString());
        temp.setLength(0);
        search = searchWords.toString();
        target = targetWords.toString();
        swords = searchWords.size();
        twords = targetWords.size();
        int[] blm = new int[searchWords.size()]; // best letter match
        int lm = 0;// letter match
        for (int i = 0; i < searchWords.size(); i++) {
        for (String t : targetWords) {
            for (int i2 = 0; i2 < (searchWords.get(i).length() < t
                .length() ? searchWords.get(i).length() : t
                .length()); i2++) {
            if (t.charAt(i2) == searchWords.get(i).charAt(i2))
                lm++;
            }
            if (blm[i] < lm)
            blm[i] = lm;
            lm = 0;
        }
        }

        for (int i = 0; i < blm.length; i++) {
        if (blm[i] == searchWords.get(i).length())
            mwords++;
        mletters += blm[i];
        }

        result = MessageFormat
            .format("-----\nSearch text:\"{0}\"\nWords:{1}\nLetters:{2}\n-----\nTarget text:\"{3}\"\nWords:{4}\nLetters:{5}\n-----\nMatch Results\nWords:{6}/{1}\nLetters:{7}/{2}",
                search, swords, sletters, target, twords, tletters,
                mwords, mletters);
        return result;
    }
公共静态字符串搜索(字符串搜索,字符串目标){
字符串结果=”;
search=search.toLowerCase();
target=target.toLowerCase();
StringBuilder temp=新的StringBuilder();
ArrayList searchWords=新建ArrayList();
ArrayList targetWords=新的ArrayList();
char lastChar='';
charcurrentchar='';
//搜索,文本
int剑、双剑、斯莱特、斯莱特、姆沃兹、姆莱特;
剑=twords=sletters=tletters=mwords=mletters=0;
for(字符c:search.toCharArray()){
currentChar=c>96&&c<123?c:“”;
如果(lastChar=''&¤tChar='')
继续;
if(cu