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

查询解析器首先将其标记为两个标记。Porter 将其全部视为一个“词”,因此只删除了最后一部分。

于 2010-09-30T13:59:27.157 回答
1

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

自定义分析器的一些示例代码可以在这里查看。这将使您了解分析器内部。

于 2010-09-30T06:01:00.487 回答