Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нечеткий поиск / 5 сообщений из 5, страница 1 из 1
23.03.2009, 15:19:24
    #35885914
Zet123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткий поиск
Привет Всем !
Стоит задачка нечеткого сравнения двух строк .

Кто какие алгоритмы нечеткого поиска совпадений использовал,
и насколько быстро это работало ?

А также какие языки(С,C++,Java и тд) использовались ?
Буду рад, если откликнется побольше народу.
Спасибо.
...
Рейтинг: 0 / 0
23.03.2009, 15:53:51
    #35886039
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткий поиск
собственный. парадокс скрипт



Код: 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.
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
23.03.2009, 20:36:05
    #35886744
Zet123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткий поиск
А на С есть что-то ?
...
Рейтинг: 0 / 0
23.03.2009, 21:43:54
    #35886818
Che Go Hotel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткий поиск
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2]Алгоритмы поиска строки
Алгоритм Кнута — Морриса — Пратта
Алгоритм Рабина — Карпа поиска строки
Алгоритм Бойера — Мура поиска строки
Алгоритм Ахо — Корасик
Алгоритм Битапа (англ.) (также известен как shift-or, shift-and или алгоритм Баеса-Ятеса[1] — Гоннета)
Задача поиска наибольшей общей подпоследовательности
Задача поиска наибольшей увеличивающейся подпоследовательности
Задача поиска наикратчайшей общей надпоследовательности (англ.)
Задача поиска наибольшей общей подстроки
Задача поиска количества подпалиндромов

[править] Примерное соответствие
Расстояние Левенштейна
Расстояние Хэмминга
Расстояние Дамерау — Левенштейна
Алгоритм Нидлмана — Вунша (англ.)
Алгоритм Смита — Вотермана (англ.)
Soundex
Metaphone
...
Рейтинг: 0 / 0
26.03.2009, 18:33:49
    #35894773
RomanH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткий поиск
Очень доволен результатом и скоростью - Расстояние Левенштейна
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Нечеткий поиск / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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