Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, Аноним, Вы писали:
А>>Stroka1 ="А.пугачёва — Балалайка" \ А>>Stroka1 ="Пугачёва-балалайка" / здесь примерно 98-99% (Вот как раз надо и подсчитать!)
W>А что будешь делать с этим: "Pugacheva — Balalayka"? W>Забей, то что ты хочешь для тебя нереально.
Пусть пытается. В этом мире становятся известными только те, кто делает невозможное.
[ Posted via RSDN@Home 1.1.4 beta 4 (303) listening to silent ]
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, IIIypuk, Вы писали:
III>При моей реализации подсчета вектора корреляции вот твкая херня выходит! III>Это для первого варианта где 1 это несовпадение с твоим Sinclair
Я мог ошибиться. Вот код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private{ Private declarations }public{ Public declarations }end;
var
Form1: TForm1;
implementation{$R *.dfm}function ArrayToString(const a: array of integer): string; forward;
function VectorLength(const a: array of integer): extended;
var
R2: extended;
i: integer;
begin
R2:= 0;
for i:= Low(a) to High(a) do
R2:= R2 + a[i];
Result := R2/((High(a)+1));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
N, K: integer;
str1, str2, str3: string;
i, j: integer;
Match: array of Integer;
begin
str1:= Edit1.Text;
str2:= Edit2.Text;
N:= max(Length(str1), Length(str2));
if Length(str2)<N
then begin
str3:= str2;
str2:= str1;
str1:= str3;
end;
SetLength(Match, N);
for i:=0 to N-1 do
begin
K:= 0;
for j:= 0 to Length(str1)-1 do
if str1[j+1] = str2[(j+i) mod N + 1]
then Inc(K);
Match[i]:= K;
end;
Memo1.Lines.Text:= ArrayToString(Match);
Label1.Caption := FloatToStr(VectorLength(Match));
end;
function ArrayToString(const a: array of integer): string;
var
i: integer;
begin
for i:= Low(a) to High(a) do
Result:= Result+IntToStr(a[i])+', ';
if (Length(Result)>0) then SetLength(Result, Length(Result)-2);
end;
end.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали: S>Попробуй посчитать вектор корреляции.
— Единственно правильное тут предложение. Да, посчитать корреляцией можно. Можно и другими методами, например параметрической корреляцией или хешированием строк, главное выбрать корректную метрику.
Вместо того чтобы тратить время на объяснения, просто
а) найти искомое легко можно зная точные слова поиска. Эти ключевые слова "нечеткое сравнение" и "мягкое сравнение". fuzzy string compare, fuzzy comparison algorithms, soft string comparison.
б) выложу у себя рабочие исходники нечеткого сравнения строк вместе в документацией
Здравствуйте, <Аноним>, Вы писали:
А>Привет народ! А>Подскажите пожалуйста
А>А так же подскажите как прочитать Тэги ID3v1 и ID3v2 из MP3-хи!!!(на си) Формат MP3. А дальше — только прямые руки и кривые извилины (главное — не перепутать)
А>Зарание большое спасибо!!!
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, IIIypuk, Вы писали:
III>>При моей реализации подсчета вектора корреляции вот твкая херня выходит! III>>Это для первого варианта где 1 это несовпадение с твоим Sinclair S>Я мог ошибиться. Вот код:
Я тут сам не моного прогнал,сам уже разобрался!
Кому интересно вот как я нахожу %;
x=vect_cor(str1,str1);
y=vect_cor(str2,str2);
z=vect_cor(str1,str2);
Здравствуйте, Kaa, Вы писали:
Н>>Судя по обсуждению (ну в частности то, что будут строки типа "дущие домой" и "идущие дамой") можно глянуть на SoundEx.
Kaa>А есть SoundEx для русского языка?
Здравствуйте, Dimonka, Вы писали:
D>А есть ли простые алгоритмы посчитать похожесть строк без учёта перестановок слов?
D>Допустим, различие двух строк только в пробелах, запятых или сокращениях слов.
Похожесть по whitespace и пунктуации считается элементарно с помошью разбиения строки на лексемы. Последовательность такая:
— берем список разделителей (пунктуация + whitespace);
— находим в строке все слова (слово — последовательность символов между разделителями).
— строим топ слов (по частоте)
— сравниваем 2 получаенных топа.
Собственно, проценты — мера, полученная от оцифровывания "пересечения" двух полученных последовательностей.
Проблема у этого алгоритма — перестановки одних и тех же слов составляют эквивалентные последовательности.
Для определения похожести также и по содержимому (т.е. с учетом взаимного расположения слов) можно использовать шинглы/супершинглы. Механизм это медленный, но верный. Он, правда, не прадназначен для вычисления близости, а может быть использован именно для поиска похожих. Вроде, это то, что требовалось изначально.
Также можно медитировать по поводу функции Левенштейна (особенно, если ее применить не к символам строки, а к выделенным словам).
Здравствуйте, Kaa, Вы писали:
Kaa>- берем список разделителей (пунктуация + whitespace); Kaa>- находим в строке все слова (слово — последовательность символов между разделителями). Kaa>- строим топ слов (по частоте) Kaa>- сравниваем 2 получаенных топа.
Мне кажется здесь можно поступить как-то проще.. Например выделить словарь обоих строк и сделать цепочку из индексов слов по словарю для каждой строки. Единственное, что смущает, это как сравнивать эти цепочки и как выявлять сокращённые слова (или, например, слова с ошибками или с несколько разной транслитерацией букв)
Kaa>Собственно, проценты — мера, полученная от оцифровывания "пересечения" двух полученных последовательностей.
Kaa>Проблема у этого алгоритма — перестановки одних и тех же слов составляют эквивалентные последовательности.