18-01-2024, Saat: 14:36
Soundex % lik Benzeşme ile aranan metnin bulunan metne % x miktarda benzemesiyole filtre içine dahil oluyor.
// -------- Kullanımı Delphi Tarafında -------------
Zamanım olmadığı için Denemedim.
SET TERM ^ ; CREATE PROCEDURE SP_SOUND_EX ( ARA VARCHAR(30), BUL VARCHAR(30), OUT BENZESME_TRK INT, OUT BENZESME_ENG INT ) AS DECLARE VARIABLE ARA_SOUND VARCHAR(30); DECLARE VARIABLE BUL_SOUND VARCHAR(30); DECLARE VARIABLE I INT; DECLARE VARIABLE HARF VARCHAR(1); DECLARE VARIABLE COUNT_ARA INT; DECLARE VARIABLE COUNT_BUL INT; BEGIN ARA_SOUND = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ARA, 'Ğ', 'G'), 'Ü', 'U'), 'İ', 'I'), 'Ş', 'S'), 'Ö', 'O'), 'Ç', 'C'); BUL_SOUND = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(BUL, 'Ğ', 'G'), 'Ü', 'U'), 'İ', 'I'), 'Ş', 'S'), 'Ö', 'O'), 'Ç', 'C'); IF (ARA = BUL) THEN BENZESME_TRK = 100; ELSE IF (ABS(CHAR_LENGTH(BUL) - CHAR_LENGTH(ARA)) > CHAR_LENGTH(ARA) / 2) THEN BENZESME_TRK = 0; ELSE BEGIN I = 1; WHILE (I <= CHAR_LENGTH(ARA)) DO BEGIN HARF = SUBSTRING(ARA FROM I FOR 1); INSERT INTO HARFT (STRING, HARF) VALUES (:ARA, :HARF); I = I + 1; END I = 1; WHILE (I <= CHAR_LENGTH(BUL)) DO BEGIN HARF = SUBSTRING(BUL FROM I FOR 1); INSERT INTO HARFT (STRING, HARF) VALUES (:BUL, :HARF); I = I + 1; END SELECT COALESCE(BUL.ASAY, 0) AS ARASAY, COALESCE(STRING.BULSAY, 0) AS BULSAY FROM (SELECT STRING, HARF, COUNT(*) AS ASAY FROM HARFT WHERE STRING = :ARA GROUP BY STRING, HARF) BUL FULL OUTER JOIN (SELECT STRING, HARF, COUNT(*) AS BULSAY FROM HARFT WHERE STRING = :BUL GROUP BY STRING, HARF) STRING ON STRING.HARF = BUL.HARF INTO :COUNT_ARA, :COUNT_BUL; BENZESME_TRK = CASE WHEN COUNT_ARA = COUNT_BUL THEN 100 WHEN COUNT_ARA > 0 AND COUNT_BUL > 0 THEN 75 ELSE 0 END + IIF(SUBSTRING(ARA FROM 1 FOR 1) = SUBSTRING(BUL FROM 1 FOR 1), 25, 0) + IIF(SUBSTRING(ARA FROM CHAR_LENGTH(ARA) FOR 1) = SUBSTRING(BUL FROM CHAR_LENGTH(BUL) FOR 1), 15, 0); BENZESME_TRK = BENZESME_TRK / CAST(COUNT(*) AS FLOAT) * 100; END BENZESME_ENG = BENZESME_TRK; -- Basit bir benzerlik sağlamak için aynı değeri kullanabilirsiniz SUSPEND; END^ SET TERM ; ^
// -------- Kullanımı Delphi Tarafında -------------
var
Query: TSQLQuery;
DataSource: TDataSource;
DBGrid: TDBGrid;
begin
Query := TSQLQuery.Create(nil);
DataSource := TDataSource.Create(nil);
DBGrid := TDBGrid.Create(nil);
try
Query.SQLConnection := // Set your SQL connection here
Query.SQL.Text := 'EXECUTE PROCEDURE SP_SOUND_EX (:ARA, :BUL, :BENZESME_TRK, :BENZESME_ENG)';
Query.ParamByName('ARA').AsString := 'SADULLAH';
Query.ParamByName('BUL').AsString := 'ABDULLAH';
Query.ParamByName('BENZESME_TRK').ParamType := ptOutput;
Query.ParamByName('BENZESME_ENG').ParamType := ptOutput;
DataSource.DataSet := Query;
DBGrid.DataSource := DataSource;
Query.Open;
try
while not Query.Eof do
begin
// BENZESME_TRK değerini kontrol ederek %70 ve üzeri benzeme oranına sahip kayıtları filtreleyebilirsiniz.
if Query.FieldByName('BENZESME_TRK').AsInteger >= 70 then // <---örnek = %70-- Benzeşme Oranı Buradan ayarlanmış.
begin
// İstediğiniz işlemleri gerçekleştirin veya sadece DBGrid'e ekleyin
DBGrid.DataSource.DataSet.Append;
DBGrid.DataSource.DataSet.FieldByName('ARA').AsString := Query.FieldByName('ARA').AsString;
DBGrid.DataSource.DataSet.FieldByName('BUL').AsString := Query.FieldByName('BUL').AsString;
DBGrid.DataSource.DataSet.Post;
end;
Query.Next;
end;
finally
Query.Close;
end;
finally
Query.Free;
DataSource.Free;
DBGrid.Free;
end;
end;
//--------------------------------------------------------
[ars=delphi]Query.SQL.Text := 'EXECUTE PROCEDURE SP_SOUND_EX (:ARA, :BUL, :BENZESME_TRK, :BENZESME_ENG)';
Query.ParamByName('ARA').AsString := 'SADULLAH';
Query.ParamByName('BUL').AsString := 'ABDULLAH';
Query.ParamByName('BENZESME_TRK').ParamType := ptOutput;
Query.ParamByName('BENZESME_ENG').ParamType := ptOutput;
Query.ExecSQL;
ShowMessage('Türkçe Benzerlik: ' + Query.ParamByName('BENZESME_TRK').AsString);
ShowMessage('İngilizce Benzerlik: ' + Query.ParamByName('BENZESME_ENG').AsString);
Zamanım olmadığı için Denemedim.