Podobieństwo String'ów

0

Mam takie pytanie:
Czy ktoś się spotkał z zagadnieniem oceny podobieństwa dwóch łańcuchów znaków? Znacie może jakieś linki, gdzie bym mógł o tym poczytać?
Konkretniej: chodzi mi o to, żeby na podstawie podanego String'a z jakiegoś innego zbioru już zdefiniowanych Stringów wybrać ten najbardziej podobny.

Przykładowo, mamy listę:
OPCJA_A1
OPCJA_A2
OPCJA_B1
OPCJA_B2
OPCJA_B3

I teraz:
Dla wartości "OPCJA_A", chciałbym, żeby algorytm wybrał mi OPCJA_A1
Dla "OPCJA" -> "OPCJA_A1"
Dla "A1" - "OPCJA_A1"
Dla "OPCJA_B" -> "OPCJA_B1"
Dla np. "WSDSCKASLA" - dowolny
itp.

Ktoś może się spotkał z takim problemem? Moje umiejętności googlarskie nie są wystarczające.

1

ale po co googlowac? wystarczy sie zastanowic. To co robisz to

Szukasz frazy we wszystkich dostepnych slowach --> Masz liste/tablice ze wszystkimi przefiltrowanymi danymi (jak filter np na allegro czy po prostu filtr)
nastepnie sortujesz wyniki
bierzesz pierwszy z gory.

Tak wyglada Twoj algorytm. (z tego co opisales)

4

Jeśli to są pojedyńcze "słowa" to odległość Levenshteina będzie ok. Jeśli to są całe zdania to wtedy Consine Similarity.

0

Klasa Matcher umożliwia weryfikację znaków:

http://docs.oracle.com/javase/tutorial/essential/regex/matcher.html

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package array_value;

import java.util.List;
import java.util.ArrayList;
import java.util.Collections; 
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Array_value {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("OPCJA_A1");
        arrayList.add("OPCJA_A2");
        arrayList.add("OPCJA_B1");
        arrayList.add("OPCJA_B2");
        arrayList.add("OPCJA_B3");

        System.out.println(arrayList);

        Scanner s = new Scanner(System.in);
        String temp = s.nextLine().toString();

        String regexp = "";
        regexp = "[" + temp.substring(0, 4) + "_%" + temp.substring(6, 7) + "]";
    
        String result = "Pattern: \"" + regexp + "\"\n" + "Text: \"" + arrayList + "\"";
 
        for (int i = 0; i < arrayList.size(); i++) {
            Pattern pattern = null;
            pattern = Pattern.compile(regexp);
            Matcher matcher = pattern.matcher(arrayList.get(i));
        
            matcher.reset();  
            boolean found = matcher.find();

            if (!found) {
                result += "\nfind(): not find substring  "
                        + "matching the pattern";
            } else {
                do {
                    result += "\nfind(): matched substring  \"" + matcher.group()
                            + "\" from position " + matcher.start()
                            + " to position " + matcher.end() + ".";

                } while (matcher.find());
            }

            if (arrayList.get(i).contains(temp)) {
                System.out.println("ok "+arrayList.get(i));
                break;
            }

        }
        System.out.println("result " + result);
    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1