Lucene PorterStemmer вопрос - PullRequest
       12

Lucene PorterStemmer вопрос

1 голос
/ 30 сентября 2010

Учитывая следующий код:

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

Может кто-нибудь объяснить, почему PorterStemmer дает разные результаты, когда в слове есть пробел?Я ожидал, что «таблица матрацев» будет ограничена «матрасом табл».

Кроме того, это еще более сбивает с толку следующий код:

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"

Может кто-нибудь объяснить, почему у меня другиерезультаты от QueryParser () и функции Stem () для одного и того же слова с использованием одного и того же анализатора?

Спасибо, Кайл

Ответы [ 2 ]

2 голосов
/ 30 сентября 2010

Анализатор запросов сначала разбивает его на два токена. Портер рассматривает все это как одно «слово» и поэтому основывает только последнюю часть.

1 голос
/ 30 сентября 2010

PorterStemmerAnalyzer состоит из серии токенизаторов и фильтров.PorterStemmer является одним из фильтров для генерируемого потока токенов.Если вы хотите это проверить, попробуйте изменить регистр запроса.Выход QueryParser будет в нижнем регистре из-за LowerCaseFilter на Tokenstream.

Некоторые примеры кода для пользовательского анализатора можно проверить здесь .Это даст вам возможность заглянуть внутрь анализатора.

...