domanda Lucene PorterStemmer
-
26-09-2019 - |
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
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.