1

次のコードがあるとします。

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() 関数から異なる結果が得られる理由を誰かが説明できますか?

ありがとう、カイル

4

2 に答える 2

2

クエリ パーサーは、最初にそれを 2 つのトークンにトークン化します。Porter はそれをすべて 1 つの「単語」と見なし、最後の部分のみをステミングします。

于 2010-09-30T13:59:27.157 に答える
1

PorterStemmerAnalyzer は、一連のトークナイザーとフィルターで構成されています。PorterStemmer は、生成されたトークンストリームに対するフィルターの 1 つです。それを確認したい場合は、クエリの大文字と小文字を変更してみてください。tokenstream の LowerCaseFilter により、QueryParser の出力は小文字になります。

カスタム アナライザーのサンプル コードは、こちらで確認できます。これにより、Analyzer の内部を垣間見ることができます。

于 2010-09-30T06:01:00.487 に答える