Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Phonetische Suche
BeitragVerfasst: 04 Sep 2006, 21:58 
Offline
Nuby

Registriert: 30 Aug 2006, 12:26
Beiträge: 9
Hallo,

ich bin auf der Suche, nach einer Bibliothek für phonetische Suche (Im Prinzip, wie die Soundex-Funktion in PHP).

Gibt es da Bibliotheken direkt in Ruby dafür, oder kennt jemand Drittquellen?

Grüße,

Sebastian


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Sep 2006, 22:18 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 6069
Wohnort: Karlsruhe
Oh oh, da habe ich selber mal gesucht und nichts gefunden - ist allerdings schon etwas her. Schau doch mal in RubyForge Welcome oder auch (meist aber veraltet) in RAA - Ruby Application Archive nach.

Falls Du irgendwo etwas findest, wäre ich auch erfreut darüber zu hören.

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Sep 2006, 22:24 
Offline
Nuby

Registriert: 30 Aug 2006, 12:26
Beiträge: 9
Sowas in die Richtung habe ich schon befürchtet... Werd mich dann wohl nochmal auf die Suche begeben und Bericht erstatten ;-)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Sep 2006, 22:41 
Offline
Nuby

Registriert: 30 Aug 2006, 12:26
Beiträge: 9
Also, ich habe tatsächlich etwas in die Richtung auf RubyForge gefunden. Allerdings in der Version 0.0.1 ;-)

http://rubyforge.org/projects/doublemetaphone/

Habs mir mal kurz angeschaut, aber werds erst Morgen - in ausgeschlafenem Zustand - installieren und antesten.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Sep 2006, 23:06 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 6069
Wohnort: Karlsruhe
Ich hab vorhin mal nach PHP und Soundex gesucht, diverses gefunden, war dann etwas erstaunt und schlug meinen Knuth, Band 3, Seite 391/392 auf.

Das ist allerdings nicht das, was ich erwarten würde. Ich suchte (vor einiger Zeit) eher Module um direkt anhand des internationalen Phonetischen Alphabets auf Texten zu suchen, wobei für die Texte die Sprache und ein Wörterbuch vorgegeben sein muss.

Die Knuth-sche Methode ist sehr kurz und müsste schnell implementierbar sein - ich schau mir mal an, was das bringt.

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Sep 2006, 23:40 
Offline
Nuby

Registriert: 30 Aug 2006, 12:26
Beiträge: 9
Im Prinzip gehts mir um eine Art "unscharfe Suche". Um es nochmal zu verdeutlichen: Angenommen ein Benutzer sucht nach "John", so soll ihm zumindest auch "Jon" und ähnliche Variationen angeboten werden. Und eben um diese Ähnlichkeit zu berechnen, suche ich ein passendes Modul. Aus PHP-Zeiten kannte ich eben noch "Soundex", was im Prinzip ganz akzeptable Ergebnisse geliefert hat.

Werde aber wie gesagt Morgen das "DoubleMetaphone"-Modul testen. Die Methode soll angeblich besser sein, als "Soundex"


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 00:22 
Offline
Geselle
Benutzeravatar

Registriert: 10 Okt 2004, 10:58
Beiträge: 143
Wohnort: Eckental
phoent. Es verwendet einen Algorithmus der in der c't mal Vorgestellt wurde.

>>>EDIT
levenshtein oder
amatch gibts auch noch.
<<<EDIT

_________________
hakuna matata


_="_=%c%s%c;printf _,34,_,34";printf _,34,_,34


Zuletzt geändert von raistlin77 am 05 Sep 2006, 00:53, insgesamt 1-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 00:51 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 6069
Wohnort: Karlsruhe
Ich hab mal schnell den Algorithmus aus TAOCP, Band 3 (1973), Seite 392 oben links, auf den auf der PHP-Seite verwiesen wird, implementiert - ohne Optimierung etc.

Er bring die Ergebnisse wie auf der oben genanten PHP-Seite und dem Knuth-Buch (Auf der PHP-Seite ist allerdings ein Fehler für die Namen Knuth und Kant, die als H416 ermittelt werden - das kann wegen des H schon mal nicht sein - meine Werte stimmen mit denen des TAOCP überein).

Hier der Code

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
class String
def makepureascii
# Please add replacements if necessary
temp = self.gsub(/ä/,'ae').gsub(/ö/,'oe').gsub(/ü/,'ue').gsub(/Ä/,'Ae')
temp = temp.gsub(/Ö/,'Oe').gsub(/Ü/,'Ue').gsub(/ß/,'ss').gsub(/á/,'a').gsub(/Á/,'A')
temp = temp.gsub(/ó/,'o').gsub(/Ó/,'O').gsub(/ú/,'u').gsub(/Ú/,'U').gsub(/à/,'a')
temp = temp.gsub(/À/,'A').gsub(/ò/,'o').gsub(/Ò/,'O').gsub(/ù/,'u').gsub(/Ù/,'U')
end
def soundex
prepare = self.makepureascii.downcase
prepare = prepare.gsub(/[bfpv]+/){|m|m[0].chr}.gsub(/[cgjkqsxz]+/){|m|m[0].chr}
prepare = prepare.gsub(/[dt]+/){|m|m[0].chr}.gsub(/[l]+/){|m|m[0].chr}
prepare = prepare.gsub(/[mn]+/){|m|m[0].chr}.gsub(/[r]+/){|m|m[0].chr}
res = prepare.slice(0).chr.upcase
shortrest = prepare[1..-1].gsub(/[aehiouwy]/, '')
shortrest = shortrest.gsub(/[bfpv]/, '1').gsub(/[cgjkqsxz]/, '2').gsub(/[dt]/, '3')
res + shortrest.gsub(/[l]/, '4').gsub(/[mn]/, '5').gsub(/[r]/, '6').ljust(3, '0').slice(0..2)
end
end

puts "Euler: #{'Euler'.soundex}"
puts "Ellery: #{'Ellery'.soundex}"
puts "Gauss: #{'Gauss'.soundex}"
puts "Ghosh: #{'Ghosh'.soundex}"
puts "Knuth: #{'Knuth'.soundex}"
puts "Kant: #{'Kant'.soundex}"
puts "Lloyd: #{'Lloyd'.soundex}"
puts "Ladd: #{'Ladd'.soundex}"
puts "Lukasiewicz: #{'Lukasiewicz'.soundex}"
puts "Lissajous: #{'Lissajous'.soundex}"
puts "Hilbert: #{'Hilbert'.soundex}"
puts "Nádasi: #{'Nádasi'.soundex}"
puts "Müller: #{'Müller'.soundex}"
puts "Möller: #{'Möller'.soundex}"
puts "Maier: #{'Maier'.soundex}"
puts "Meier: #{'Meier'.soundex}"
puts "Meyer: #{'Meyer'.soundex}"
puts "Rainer: #{'Rainer'.soundex}"
puts "Reiner: #{'Reiner'.soundex}"
Das ergibt dann

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Euler: E460
Ellery: E460
Gauss: G200
Ghosh: G200
Knuth: K530
Kant: K530
Lloyd: L300
Ladd: L300
Lukasiewicz: L222
Lissajous: L222
Hilbert: H416
Nádasi: N320
Müller: M460
Möller: M460
Maier: M600
Meier: M600
Meyer: M600
Rainer: R560
Reiner: R560

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 00:55 
Offline
Böser Admin
Benutzeravatar

Registriert: 29 Jul 2005, 22:41
Beiträge: 2039
Wohnort: Beijing
Hi zusammen,

sagtmal wird diese Phonetische Analyse auch zum unscharfen Suchen eingesetzt? Jeder kennt ja bei Google den Hinweis 'meinten Sie eventuell "xyz"'. Ich hatte mich schon oft gefragt ob die die Worte so analysieren und dann den Suchbegriff mit den meissten Treffern zurückgeben. Oder gibt es da noch ein anderes Verfahren?


der
Daniel

_________________
mruby.sh | Ruby-Mine | Homepage


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 01:06 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 6069
Wohnort: Karlsruhe
DanielBovensiepen hat geschrieben:
sagtmal wird diese Phonetische Analyse auch zum unscharfen Suchen eingesetzt? Jeder kennt ja bei Google den Hinweis 'meinten Sie eventuell "xyz"'.

Der Knuth-sche Soundex-Algorithmus ist schon alt (<=1973) und wurde bestimmt auch schon erweitert (damals gabs ja nur ASCII-Vorstufen, EBCDIC, ja sogar noch BCD).

Im Buch wird auf airline reservation systems verwiesen. Es geht offensichtlich darum, dass jedem Namen so ein Code zugeordnet wird, so dass bei einer Anfrage, eventuell versteht man ja den Namen nicht richtig, die gefunden werden, die den gleichen Code haben.

Für eine Suchmaschine ginge das auch, aber da käme wohl zuviel raus. Es gibt da noch die Levenshtein-Distanz.

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 08:47 
Offline
Rubyist

Registriert: 26 Apr 2006, 21:35
Beiträge: 366
Hi,

@danielbovensiepen

Es gibt diverse wortähnlichkeitsalgorithmen. Die bereits beschriebene
soundex methode muss allerdings internationalisiert werden. Dann gibt
es noch die levensthein-distance und diverse derivate dieser methode.
Auch ein algorithmus der als "oliver-methode" bekannt ist wird benutzt.
Ich denke der goolgle-algo hat noch einiges mehr zu bieten und benutzt
sicher andere algorithmen für die vorschläge der ähnlichen wörter.


Ich habe mal im rahmen eines projektes etwas mit fuzzy stringmatching
machen müssen. Dort bin ich zu dem schluss gekommen dass ein algo
nicht ausreicht um ausreichende sicherheit zu haben.
Ich habe damals soundex, levensthein und oliver in abgewandelter form
benutzt sodass die ergebnisse in form eines certainty-factors ausgedrückt wurden. Diese certainty-faktoren habe ich dann verknüpft (entsprechende
algorithmen zur und/oder-verknüpfung von certainty-faktoren sind bekannt). Den erhaltenen wert hab ich dann gegen einen empirischen
threshold getestet um zu sehen ob der string den test passiert hat oder nicht. Ich hatte nach dieser methode schon relativ wenige false-positives.
Diese konnte ich durch nebenbedingungen eliminieren sodass ich bei ca. 95 % sicherheit war, wenn ein match vorlag.


greets

_________________



 callcc{|xx| callcc{|yy| lambda{|zz| zz}[yy]}[xx]}["Love Ruby but adore Scheme"]

Solve it once, adapt it to your needs => Schnipsel


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 12:15 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 6069
Wohnort: Karlsruhe
closure hat geschrieben:
Auch ein algorithmus der als "oliver-methode" bekannt ist wird benutzt.

Hast Du dazu einen Link?

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 13:07 
Offline
Rubyist

Registriert: 26 Apr 2006, 21:35
Beiträge: 366
Hi,

eine genaue spezifikation kann ich leider nicht bieten. Ich bin mir
nicht mal sicher ob das der offizielle name für den algorithmus ist.
Beim suchen nach fuzzy-string-matching bin ich auf php-quellen
gestoßen in denen die "oliver-methode" genannt wurde.
Diese methode wird in der php-function similar_text verwendet.

Hier in den php-quellen (php_similar_char,php_similar_string) wird der
algorithmus implementiert.

Das projekt wurde damals in php implementiert und ich brauchte mir um
den genauen algorithmus also keinen kopf machen.

Die vermutung liegt nahe dass es einen anderen namen für den algorithmus gibt.

Hier ist auch noch eine c-implementierung

greets

_________________



 callcc{|xx| callcc{|yy| lambda{|zz| zz}[yy]}[xx]}["Love Ruby but adore Scheme"]

Solve it once, adapt it to your needs => Schnipsel


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 14:02 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 6069
Wohnort: Karlsruhe
Danke für die Info.

closure hat geschrieben:
Ich bin mir nicht mal sicher ob das der offizielle name für den algorithmus ist.

Ich bin beim Suchen vorhin unter diesem Namen nur auf Methoden aus der Meteorologie gestossen. Vielleicht kommt das ja daher - dort ist der Einsatz von Fuzzy-Methoden ja echt angebracht.

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 05 Sep 2006, 16:26 
Offline
ri
Benutzeravatar

Registriert: 02 Jun 2006, 23:18
Beiträge: 702
Hallo,

der in der PHP-Funktion similar_text implementierte Algorithmus geht wohl auf den Artikel Decision Graphs – An Extension of Decision Trees von Jonathan J. Oliver zurück.

Zum Thema Levenshtein:


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
def levenshtein(s, t)
n = s.length
m = t.length
d = Array.new(n+1) {|i| Array.new(m+1, 0)}
for i in 0..n
d[i][0] = i
end
for j in 0..m
d[0][j] = j
end
for i in 1..n
for j in 1..m
if s[i-1] == t[j-1]
cost = 1
else
cost = 0
end
d[i][j] = [d[i-1][ j ] + 1, # insert
d[ i ][j-1] + 1, # delete
d[i-1][j-1] + cost # substitute
].min
end
end

d[n][m]
end

puts levenshtein('levenshtein', 'meilenstein')


Grüße,
Matthias


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron