[Java][Algorytm] Podobieństwo stringów

0

Witam, zainteresowałem się niedawno tematyką klasyfikacji ciągów znaków. Do rzeczy:

Powiedzmy, że mamy takie ciągi:

String s1 = "SEAGATE BARRACUDA 1 TB ST31000528AS SATA II 32MB";
String s2 = "SUPER TANIO BARRACUDA 1 TB ST31000528AS";
String s3 = "DYSK TWARDY BARRACUDA 1 TB SATA II 32MB";
String s4 = "SEAGATE BARRACUDA 1,5 TB ST31500541AS SATA II 32MB"

Łańcuchy s1-s3 dotyczą tego samego produktu. s4 zupełnie innego.
Teksty są jednak dość podobne. I człowiek jest w stanie domyślić się z pewnym prawdopodobieństwem, że s1-s3 to to samo.
A jak podejść do tego zagadnienia programowo?

0

Moje rozwiązanie nie jest co prawda najlepsze, jednak wykorzystałem je do generowania raportu z jakiejś gry browserowej aby konwertowało tekst dla postów na forum.

Pobierałem jedną linię tekstu i za pomocą StringTokenizer rozdzielałem każdy wyraz osobno.
potem

if(list.get(x).equalsIgnoreCase(innyWyraz))
//&& inny warunek np inny wyraz z tej linii
{
//rob cos :)
}
0

łatwiej jest użyć:

String s = "ala ma kota";
String[] tablicaSlow = s.split(" ");
`</code>`
0

Mam wrażenie, że porywasz się na bardzo trudne zagadnienie.
Przy swoim wniosku, że s1-s3 są podobne, a s4 są inne opierasz sie na informacji, której nie ma
w treści Stringach:
a) s1,s2,s4 są neutralne, s2 jest reklamowy, Ty wiesz że chodzi o produkt, a nie chodzi o jego ocenę więc to ignorujesz. Na jakiej podstawie program ma wiedzieć, że ocena jest nieważna?
b) W s3 nie ma ciągu STnnnnnnnn, w pozostałych jest. Skąd program ma wiedzieć, że ważniejsze są cyferki po ST, niż to czy ciąg STnnnnnn w ogóle wystąpił?
Przetestuj na tzw. przeciętnych ludziach, czy ich ocena podobieństwa tych Stringów jest taka jak Twoja.
P.S. Gdyby nie zdanie

dotyczą tego samego produktu

nie domyśliłbym się dlaczego s1=s3 są podobne, a s3 jest inne.

0

Na pewno nie jest to problem trywialny.
Jeśli chcesz badać podobieństwa dowolnych ciągów i to podobieństwo semantyczne, to jest to wrecz bardzo trudny problem.
Jesli natomiast ograniczasz sie do listy wyrazen na temat sprzetu komputerowego, to na pewno da sie to lepiej lub gorzej rozwiazac.
Na pewno trzeba by stworzyc pewna baze wiedzy, ktorej program by uzywal (no chyba ze chcesz recznie oznaczyc jakas reprezentatywna [i raczej spora] probke ciagow i uzyc jakiejs metody mechanicznego uczenia, ale to musialbys troche teorii zlapac ).
Najpierw trzeba oczywiscie umiec podzielic zdanie na ciag tokenow. W tym momencie trzeba umiec np sparsowac "Sata II" jako jeden token a nie dwa osobne. Na tym etapie mozna tez dokonac jakiejs filtracji slow niemajacych znaczenia ( np polskie slowa w tych zdaniach co podales nie maja zadnego znaczenia ). Kolejnym etapem jest pewna normalizacja otrzymanych tokenow - np wiadomo ze "32 MB" "32MB" "32mb" pewnie znaczy to samo, choc roznie zapisane ( i w jednym przypadku blednie ).
Nastepnym ( i tym najtrudniejszym ) etapem jest kwalifikacja. Kazdemu tokenowi nalezy przypisac grupe, do ktorej nalezy i tutaj potrzebna bedzie jakas baza wiedzy + pewien zbior reguł. Dodatkowo rozne kategorie moga miec przypisane rozne wagi - np wiadomo ze cos co wyglada jak St389239ASd jest pewnie jakims oznaczeniem konkretnego modelu i jest duzo wazniejsze niz "32MB"

Majac juz dane w takiej formie nalezy nastepnie stworzyc funkcja, ktora okresla miare podobienstwa dwoch zbiorow zkwalifikowanych tokenow. Tu tez jest troche zabawy, bo trzeba zastanowic sie nad sytuacjami, gdzie w jednym zbiorze wystepuje np informacja z kategorii "numer modelu" a w innym nie. Na tym etapie tez bardzo wazna jest informacja o wagach przypisanych do poszczegolnych grup.

Ogolnie troche zabawy, ale mysle, ze zadanie jest jak najbardziej wykonywalne.

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