Domanda

Dato il seguente codice:

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

Qualcuno potrebbe spiegare perché la PorterStemmer produce risultati diversi quando c'è uno spazio nella parola? Mi aspettavo 'tavolo materasso' da derivava a 'materasso Tabl'.

Inoltre, questo è ulteriormente confondere dal seguente codice:

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"

Qualcuno potrebbe spiegare perché sto ottenendo risultati diversi dalla QueryParser () e la funzione Stem () per la stessa parola (s) utilizzando lo stesso analizzatore?

Grazie, Kyle

È stato utile?

Soluzione

PorterStemmerAnalyzer è composto da una serie di tokenizers e filtri. PorterStemmer è uno dei filtri al tokenstream generato. Se si desidera verificare che, provare a cambiare il caso della query. uscita QueryParser sarà in minuscolo causa LowerCaseFilter su tokenstream.

Alcuni codice di esempio per analizzatore personalizzato può essere controllato qui . Questo vi darà una sbirciatina all'interno di un analizzatore.

Altri suggerimenti

Il parser di query tokenizza in primo luogo in due token. Porter considera tutti come uno "parola" e così steli solo l'ultimo tratto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top