powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Библиотека основанная на metaphone и объединяющая сразу несколько языков.
4 сообщений из 4, страница 1 из 1
Библиотека основанная на metaphone и объединяющая сразу несколько языков.
    #39855276
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток,

кто то натыкался на на либу объединяющей возможности metaphone для английского, русского, немецкого языков ну и другие языки приветствуются? (soundex не интересен).
Скажем где язык присутствует как параметр (понятно что алгоритм для каждого языка будет свой).

Спасибо

п.с. можно конечно допиливать самому что то по аналогии с этим . Но не хочется изобретать велосипед.

Хороший программист знает как задавать вопросы, не раздражая окружающих, а выдающийся программист знает как отвечать на них без заносчивости © Стивен Хирлстон
...
Рейтинг: 0 / 0
Библиотека основанная на metaphone и объединяющая сразу несколько языков.
    #39855358
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
могу для русского на Delphi кинуть. остальное был бы рад сам найти. правда, особо и не искал пока.
...
Рейтинг: 0 / 0
Библиотека основанная на metaphone и объединяющая сразу несколько языков.
    #39855472
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

буду признателен. rusmikleСОБАКАgmail.com
...
Рейтинг: 0 / 0
Библиотека основанная на metaphone и объединяющая сразу несколько языков.
    #39855673
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
function MetaPhoneRu(w: string): string;
 //Второй вариант — пожалуй, лучший.
 //Заменяет ЙО, ЙЕ и др.; неплохо оптимизирован.
const
 alf = 'ОЕАИУЭЮЯПСТРКЛМНБВГДЖЗЙФХЦЧШЩЁЫ';
 cns1 = 'БЗДВГ';
 cns2 = 'ПСТФК';
 cns3 = 'ПСТКБВГДЖЗФХЦЧШЩ';
 ch = 'ОЮЕЭЯЁЫ';
 ct = 'АУИИАИА';
var
 i, b: integer;
 S, V, c, old_c, SelStr, Temp: string;
begin
 //Переводим в верхний регистр, оставляем только
 //символы из alf и копируем в S:
 W := AnsiUpperCase(W);
 Temp := CopyFromSymb(w, ' ');
 w := Copy2Space({Transliterator.Eng2Rus(w)}w);
 for i := 1 to Length(W) do
 begin
  c := Copy(W, i, 1);
  if Pos(c, alf) > 0 then
   S := S + c;
 end;
 if Length(S) = 0 then
  Exit;
 //Сжимаем окончания:
 SelStr := StrRight(S, 6);
 if SelStr = 'ОВСКИЙ' then
  S := StrLeft(S, Length(S) - 6) + '@'
 else if SelStr = 'ЕВСКИЙ' then
  S := StrLeft(S, Length(S) - 6) + '#'
 else if SelStr = 'ОВСКАЯ' then
  S := StrLeft(S, Length(S) - 6) + '$'
 else if SelStr = 'ЕВСКАЯ' then
  S := StrLeft(S, Length(S) - 6) + '%'
 else if (StrRight(S, 4) = 'ИЕВА') or (StrRight(S, 4) = 'ЕЕВА') then
  S := StrLeft(S, Length(S) - 4) + '9'
 else
 begin
  SelStr := StrRight(S, 3);
  if (SelStr = 'ОВА') or (SelStr = 'ЕВА') then
   S := StrLeft(S, Length(S) - 3) + '9'
  else if SelStr = 'ИНА' then
   S := StrLeft(S, Length(S) - 3) + '1'
  else if (SelStr = 'ИЕВ') or (SelStr = 'ЕЕВ') then
   S := StrLeft(S, Length(S) - 3) + '4'
  else if SelStr = 'НКО' then
   S := StrLeft(S, Length(S) - 3) + '3'
  else
  begin
   SelStr := StrRight(S, 2);
   if (SelStr = 'ОВ') or (SelStr = 'ЕВ') then
    S := StrLeft(S, Length(S) - 2) + '4'
   else if (SelStr = 'АЯ') then
    S := StrLeft(S, Length(S) - 2) + '6'
   else if (SelStr = 'ИЙ') or (SelStr = 'ЫЙ') then
    S := StrLeft(S, Length(S) - 2) + '7'
   else if (SelStr = 'ЫХ') or (SelStr = 'ИХ') then
    S := StrLeft(S, Length(S) - 2) + '5'
   else if SelStr = 'ИН' then
    S := StrLeft(S, Length(S) - 2) + '8'
   else if (SelStr = 'ИК') or (SelStr = 'ЕК') then
    s := StrLeft(S, Length(S) - 2) + '2'
   else if (SelStr = 'УК') or (SelStr = 'ЮК') then
    s := StrLeft(S, Length(S) - 2) + '0';
  end;
 end;

 //Оглушаем последний символ, если он - звонкий согласный:

 B := Pos(StrRight(S, 1), cns1);
 if B > 0 then
  S[Length(S)] := Copy(cns2, B, 1)[1];
 old_c := ' ';

 //Основной цикл:

 for i := 1 to Length(S) do
 begin
  c := Copy(S, i, 1);
  B := Pos(c, ch);
  if B > 0 then //Если гласная
   if (old_c = 'Й') or (old_c = 'И') then
    if (c = 'О') or (c = 'Е') then //Буквосочетания с гласной
    begin
     old_c := 'И';
     V[Length(V)] := old_c[1];
    end
    else if c <> old_c then //Если не буквосочетания с гласной, а просто гласная
     V := V + Copy(ct, B, 1)
    else
   else if c <> old_c then //Если не буквосочетания с гласной, а просто гласная
    V := V + Copy(ct, B, 1)
   else
  else //Если согласная
  begin
   if c <> old_c then //для «Аввакумов»
    if Pos(c, cns3) > 0 then //Оглушение согласных
    begin
     B := Pos(old_c, cns1);
     if B > 0 then
     begin
      old_c := Copy(cns2, B, 1);
      V[Length(V)] := old_c[1];
     end;
    end;
   if c <> old_c then
    V := V + c; //для «Шмидт»
  end;
  old_c := c;
 end;
 Result := Transliterator.Rus2Eng(V) + IfThen(V <> '', ' ' + Transliterator.Rus2Eng(Temp));
end;

...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Библиотека основанная на metaphone и объединяющая сразу несколько языков.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]