Lucene PorterStemmer提问

时间:2010-09-29 21:23:25

标签: .net lucene lucene.net porter-stemmer

给出以下代码:

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 个答案:

答案 0 :(得分:2)

查询解析器首先将其标记为两个标记。波特认为这一切都只是一个“单词”,因此只是最后一部分。

答案 1 :(得分:1)

PorterStemmerAnalyzer由一系列标记器和过滤器组成。 PorterStemmer是生成的令牌流的过滤器之一。如果要验证,请尝试更改查询的大小写。由于令牌流上的LowerCaseFilter,QueryParser输出将为小写。

可以检查自定义分析器的一些示例代码here。这将让你看一眼分析仪。