给出以下代码:
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()函数得到不同的结果吗?
谢谢, 凯尔
答案 0 :(得分:2)
查询解析器首先将其标记为两个标记。波特认为这一切都只是一个“单词”,因此只是最后一部分。
答案 1 :(得分:1)
PorterStemmerAnalyzer由一系列标记器和过滤器组成。 PorterStemmer是生成的令牌流的过滤器之一。如果要验证,请尝试更改查询的大小写。由于令牌流上的LowerCaseFilter,QueryParser输出将为小写。
可以检查自定义分析器的一些示例代码here。这将让你看一眼分析仪。