Stemming mit ActsAsFerret
Januar 17, 2008
Stemming ist ein Verfahren, um – mit Hilfe von Algorithmen – den Wortstamm von Wörtern zu ermitteln. Dies wird z.B. bei Suchmaschinen angewendet, damit die Suche nicht an einem eingebenen Wort scheitert, dass zwar nicht in der Datenbank als solches zu finden ist, wohl aber dessen Wortstamm, z.B. Gitarren => Gitarre.
Ferret und ActsAsFerret bietet eine einfach zu konfigurierende Unterstützung für dieses Stemming:
Eine Datei
stemming_analyzer.rb
im lib/-Verzeichnis anlegen:
require 'rubygems'
require 'ferret'
class StemmingAnalyzer < Ferret::Analysis::Analyzer
include Ferret::Analysis
def initialize(stop_words = FULL_GERMAN_STOP_WORDS)
@stop_words = stop_words
end
def token_stream(field, str)
StemFilter.new(StopFilter.new(LowerCaseFilter.new(StandardTokenizer.new(str)),@stop_words), 'de')
end
end
Im zu durchsuchenden Model dann folgendes:
acts_as_ferret :fields => {
:bandname => {}, :firstName_if_public => {},
:tag_list => {}, :comment_list => {}
}, :ferret => {
:analyzer => StemmingAnalyzer.new, :remote => true}
Dabei ist darauf zu achten, dass, wenn ihr den DrB-Server verwenden wollt, :remote => true innerhalb des :ferret-Attributs sein muss. Bei uns war dieses ausserhalb, woraufhin bei einem Aufruf von XYZ.rebuild_index nur nil zurückgeliefert wurde und Stemming nicht funktionierte.
Über script/console kann dann schön getestet werden. Wenn man nebenbei noch die log/ferret_server.log anschaut, kann man sehen, dass jetzt automatisch Suchwörter wie “und” in XYZ.find_by_contents(”Gitarren und Geigen”) entfernt werden. Ausserdem kann man sehen, dass z.B. “Geigen” auf “Geig” reduziert wird, womit sich dann auch Wörter wir Geige finden lassen.
Entry Filed under: Ferret, Rails, Ruby, Ruby/Rails. Schlagworte: Ruby, Rails, Ferret, ActsAsFerret, Suche, Stemming, acts_as_ferret, STOP_WORDS, Drb, Server.
1 Comment Add your own
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed
1.
sam | Januar 18, 2008 at 2:25
Ich hatte einige Probleme, den Analyzer zu aktivieren. Hier gibt es einige Hinweise zur Problemlösung:http://www.ruby-forum.com/topic/131429
Folgende Konfiguration hat bei mir funktioniert:
acts_as_ferret(
{ :fields => {
:fieldname1 =>{},
:fieldname2 =>{}
}
},
:analyzer => GermanStemmingAnalyzer.new
)