powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Требуется алгоритм сравнения вводимого текста
4 сообщений из 4, страница 1 из 1
Требуется алгоритм сравнения вводимого текста
    #33905189
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нибудь обладает алгоритмом сравнения вводимого текста (с учетом ошибок и пропуска букв) и вариантами текста, хранящегося в поле таблицы. Наподобие проверки орфографии в Word
...
Рейтинг: 0 / 0
Требуется алгоритм сравнения вводимого текста
    #33905278
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно подумать.
В строке таблицы,что держит слово завести поле скелет-тоже слово,но без гласных букв и мягких-твёрдых знаков и сдвоенные согласные заменить на одно-ошибаются чаще на них.Тригерром делается,если знаешь,что это-триггер,то не проблем.Слово не нашлось,хлоп на экран все слова с таким-же скелетом.Это так-первый уровень.Второй уровень-это в скелете менять з на с в начале слова,г на в в конце(функция reverse,конец становится началом и снова реверс)-ещё 2 поля и так до бесконечности-хорошему нет предела.
...
Рейтинг: 0 / 0
Требуется алгоритм сравнения вводимого текста
    #33906732
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
писано на скипте парадокса в 94 году.
вычисляет "расстояние" между цепочками чем больше замен, добавлений и пропусков тем больше расстояние.
доказательство функции на удовлетворение аксимам расстояния
не проводилось.


Код: plaintext
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.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
proc isSpace1(char)
private x
x = substr(char, 1 , 1 )
if(x = " " or x = "\t"  ) then
       return true
endif
return false
endproc

proc countErrs(s1, s2)
private   a1, a2, a1L, a2L, a1P, a2P,  ; array, array length, array pointer
          errs, mmatch,
          MODUL,x
MODUL =  100                    ;      1283   -  83  mmatch
                              ;      12       errors
                              ;
 deSpace( s1, s2)      a1P =  1      a2P =  1 
;? "-------------------"
calls= 0 
x = countMatch( 0 , 0 )

errs  = int(x / MODUL)
mmatch = x - int(x / MODUL) * MODUL
;? "mmatch = ", mmatch," calls = ", calls
return errs
endproc

proc countMatch(mmatch, errs)
calls= calls+ 1 
while(a1P <= a1L and a2P <= a2L )
   if( a1[a1P]  <>  a2[a2P] ) then
           return searchMatch (mmatch,errs)
   endif
   a1P = a1P +  1 
   a2P = a2P +  1 
   mmatch = mmatch +  1 
endwhile

errs = errs + max( 0 , max ( a1L+ 1  - a1P, a2L+ 1  - a2P))
return errs * MODUL + mmatch
endproc



proc searchMatch(mmatch, errs)
private err,      x,y,m,e, structP
structP =  0 
err =  1 
   WHILE a1P + err <= a1L or a2P + err <= a2L
                            ; поиск возможных продолжений
                            ; по каждому продолжению
                            ; записывается структура <a1P, a2P, mmatch, errs>
                            ; для оценки выбора продолжения
       array x[ 2 *err]
       array y[ 2 *err]
       array m[ 2 *err]
       array e[ 2 *err]
       structP = searchSequel(err)
       if(structP >  0 ) then
            quitloop
       endif
       err = err +  1 
   endWHILE
   errs = errs + err
   if(structP >  0 ) then
         return weightSequel(mmatch, errs, structP)
   endif
return (errs * MODUL) + mmatch
endproc

proc saveStruct(p, i1, i2)
p = p +  1 
if(p <=  2 *err) then
      x[p]  = i1
      y[p]  = i2
      m[p]  =  0 
      e[p]  =  0 
      return  1 
endif
return  0 
endproc

proc   searchSequel(err)   ;  доступ к структуре в вызвавшей программе
private rc, i1, i2
rc =  0 
i1 = a1P
i2 = a2P
while( (i1 < a1P + err) OR (i2 < a2P + err))
      if((i2 <= a2L) and (a1P + err <= a1L)) then
           if( a2[i2] = a1[a1P + err] ) then
               rc = rc + saveStruct(rc, a1P + err, i2)
           endif
      endif
      if((i1 <= a1L) and (a2P + err <= a2L)) then
           if( a1[i1] = a2[a2P + err] ) then
               rc = rc + saveStruct(rc, i1, a2P + err)
           endif
      endif
      i1 = i1 +  1 
      i2 = i2 +  1 
endwhile
if(i1 <= a1L and i2 <= a2L) then
     if( a1[i1] = a2[i2] ) then
         rc = rc + saveStruct(rc, i1, i2)
     endif
endif
return rc
endproc


proc   weightSequel(mmatch, errs, sP)
private p, errsMatch , minEr, maxMa , er, ma, i1, i2, ppp
errsMatch =  0 
minEr =   32000 
maxMa = - 32000 
  for p from  1  to sP
      er = errs
      a1P = x[p]
      a2P = y[p]
      errsMatch = countMatch (mmatch, errs)
      m[p] =  errsMatch - int(errsMatch / MODUL) * MODUL
      e[p] =  int(errsMatch / MODUL)
      if (m[p] > maxMa) then
            ppp   = p
            minEr = e[p]
            maxMa = m[p]
      else if (m[p] = maxMa and e[p] < minEr) then
            ppp   = p
            minEr = e[p]
            maxMa = m[p]
      endif
      endif
  endfor
errsMatch = minEr * MODUL + maxMa
return errsMatch
endproc

proc deSpace( string1, string2)
private i,j, prevChar, char
prevChar =  0 ;
i =  0 ;
j =  0 

;string1 = ltrim(rtrim(string1))
a1L = len(string1)
array a1[a1L]


for i from  1  to a1L
     char = substr(string1, i,  1 )
     if((not isSpace1(char)) or (not isSpace1(prevChar))) then
          j = j +  1 
          a1[j] = char
          prevChar = char
     endif
endfor
a1L = j
prevChar =  0 ;
i =  0 ;
j =  0 

;string2 = ltrim(rtrim(string2))
a2L = len(string2)
array a2[a2L]

for i from  1  to a2L
     char = substr(string2, i,  1 )
     if((not isSpace1(char)) or (not isSpace1(prevChar))) then
          j = j +  1 
          a2[j] = char
          prevChar = char
     endif
endfor
a2L = j
endproc

proc printArray(arr, arrL)
private i
@  2 , 2 
?? "--> "
for i from  1  to arrL
        execute "?? "+arr+"["+strval(i)+"]"
endfor
?? " <--"
endproc


...
Рейтинг: 0 / 0
Требуется алгоритм сравнения вводимого текста
    #33906769
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вызов
countErrs(s1, s2)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Требуется алгоритм сравнения вводимого текста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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