2010-09-29 14 views
1

Vu le code suivant:Lucene PorterStemmer question

Dim stemmer As New Lucene.Net.Analysis.PorterStemmer() 
Response.Write(stemmer.Stem("mattress table") & "<br />") // Outputs: mattress t 
Response.Write(stemmer.Stem("mattress") & "<br />") // Outputs: mattress 
Response.Write(stemmer.Stem("table") & "<br />") // Outputs: tabl 

Quelqu'un pourrait-il expliquer pourquoi le PorterStemmer produit des résultats différents quand il y a un espace dans le mot? Je m'attendais à ce que 'table de matelas' soit dérivé de 'matelas tabl'.

En outre, cela est encore confus par le code suivant:

Dim parser As Lucene.Net.QueryParsers.QueryParser = New Lucene.Net.QueryParsers.QueryParser("MyField", New PorterStemmerAnalyzer) 
Dim q As Lucene.Net.Search.Query = parser.Parse("mattress table") 
Response.Write(q.ToString & "<br />") // Outputs: MyField:mattress MyField: tabl 

q = parser.Parse("""mattress table""") 
Response.Write(q.ToString & "<br />") // Outputs My Field:"mattress tabl" 

Quelqu'un pourrait-il expliquer pourquoi je reçois des résultats différents de la QueryParser() et la fonction Stem() pour le même mot (s) à l'aide le même analyseur?

Merci, Kyle

Répondre

1

PorterStemmerAnalyzer est composé d'une série de filtres et tokenizers. PorterStemmer est l'un des filtres du tokenstream généré. Si vous voulez vérifier cela, essayez de changer le cas de la requête. La sortie de QueryParser sera en minuscules en raison de LowerCaseFilter sur tokenstream.

Un exemple de code pour l'analyseur personnalisé peut être vérifié here. Cela vous donnera un aperçu à l'intérieur d'un analyseur.

2

L'analyseur de requête le met en premier lieu en deux jetons. Porter considère tout cela comme un "mot" et ne fait donc que la dernière partie.