Близост на стрингове

6 отговора 346 прегледа
#1

Близост на стрингове

Трябва ми функция за определяне на близост на 2 стринга.

Знам, че не е свързано с Delphi, а с програмирането попринцип, но тук има много интелигенти хора с опит и може да сте се сблъсквали с подобно нещо.

Някой може ли да ме насочи към литература или някакъв линк, или да ми каже нещо за тези функции.

Идеята е като се стравняват два стринга да функцията да върне някакъв коефициент на близост.

Например:
Стринга abababa е да речем 95% близък до стринга abababc

И стринга ababab е да речем 10% близък до стринга abahgbd

Може би ще ми е полезно ако ме насочите към някаква теория по въпроса.

Отговор
в отговор на Dark_Dirk #2

Re: Близост на стрингове

Unit

StrUtils

Category

string handling routines

function SoundExSimilar(const AText, AOther: string; ALength: TSoundExLength = 4): Boolean;

Description

SoundExSimilar returns True if the string specified by AText is “similar” to the string specified by AOther, or False if the two strings are not sufficiently similar.

SoundExSimilar uses a SoundEx algorithm to convert both strings into a phonetic representation where each character of the resulting string represents one of six families of similar phonemes. It then compares up to ALength digits in the resulting representation, returning True if they are all the same and False if they are not.


_ _ _

Time is like a drug. Too much of it kills you.
Отговор
в отговор на Dark_Dirk #3

Re: Близост на стрингове

Какво ще кажеш за следното:

1. Намираш най-дългия общ подстринг;

2. Измисляш формула, която да ти дава оценка на "близостта" на двата стринга на базата на намерения най-дълъг общ подстринг... нещо, което ми идва на прима виста за подобна формула:

- Стринг А с дължина L(A)
- Стринг B с дължина L(B)
- Най-дълрг общ подстринг X с дължина L(X)

Формула за изчисляване на "близост" на А и B - ( (L(X) / L(A) + (L(X) / L(B) ) / 2

т.е. Средно аритметично от L(X)/L(A) и L(X)/L(B).

HTH

Отговор
в отговор на Dark_Dirk #4

Re: Близост на стрингове

Не смятам, че може да се даде прост отговор на този въпрос. Може би първо трябва да ни кажеш за какво би ти послужило разстоянието между стринговете и тогава може да се помисли нещо по въпроса...

Nihil tam munitum quod non expugnari pecuna possit
Отговор
в отговор на Dark_Dirk #5

Дефинирай си понятията и сам ще се справиш

Виж трите поста преди моя - всеки от тях в някаква степен те насочва за задачата, поставена от теб. Обаче за да ти се помогне - най добре да се замислиш сам и да дефинираш "близост на два стринга"
Или да зададеш въпроса не за функция, която ти връща близостта, а за дефиниране на понятието "близост на стрингове".

Поста на киллалл се отнася за фонетиката на стринговете (за мен е много ценно преложение) - но едва ли търсиш това, а и ще трябва да дефинираш език, на който да става сравняването :)
Поста на афтерглоу решава задачата в някои случаи, но дори и при един различаващ се символ, получавания резултат зависи от позицията му.
Можеш да послушаш и съвета на драко и да ни светнеш по-подробно и конкретно какво искаш да правиш

Отговор
в отговор на Dark_Dirk #6

Re: Близост на стрингове

Потърси из нет-а за "разстояние на Ливенщайн" (Levenshtein Distance). Ако съм разбрал правилно, е точно това, което търсиш. Ако закъсаш, пиши пак - е ти пратя готов unit.

Отговор
в отговор на Mandor #7

Re: Близост на стрингове

Много благодаря Mandor !
Ти си разбрал въпроса ми най-правилно.
Мисля, че Levenshtein Distance е точно това, което ми трябва.

Благодаря и на всички останали. Вие също ми бяхте полезни.

Ако някой се сега за още такива алгоритми като на Levenshtein, нека пише.

Отговор