pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / analyzers / common / src / java / org / apache / lucene / analysis / en / KStemFilter.java
1 package org.apache.lucene.analysis.en;
2
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import java.io.IOException;
21
22 import org.apache.lucene.analysis.TokenFilter;
23 import org.apache.lucene.analysis.TokenStream;
24 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
25 import org.apache.lucene.analysis.tokenattributes.KeywordAttribute;
26
27 /** A high-performance kstem filter for english.
28  * <p/>
29  * See <a href="http://ciir.cs.umass.edu/pubfiles/ir-35.pdf">
30  * "Viewing Morphology as an Inference Process"</a>
31  * (Krovetz, R., Proceedings of the Sixteenth Annual International ACM SIGIR
32  * Conference on Research and Development in Information Retrieval, 191-203, 1993).
33  * <p/>
34  * All terms must already be lowercased for this filter to work correctly.
35  */
36
37 public final class KStemFilter extends TokenFilter {
38   private final KStemmer stemmer = new KStemmer();
39   private final CharTermAttribute termAttribute = addAttribute(CharTermAttribute.class);
40   private final KeywordAttribute keywordAtt = addAttribute(KeywordAttribute.class);
41
42   public KStemFilter(TokenStream in) {
43     super(in);
44   }
45
46   /** Returns the next, stemmed, input Token.
47    *  @return The stemed form of a token.
48    *  @throws IOException
49    */
50   @Override
51   public boolean incrementToken() throws IOException {
52     if (!input.incrementToken())
53       return false;
54
55     char[] term = termAttribute.buffer();
56     int len = termAttribute.length();
57     if ((!keywordAtt.isKeyword()) && stemmer.stem(term, len)) {
58       termAttribute.setEmpty().append(stemmer.asCharSequence());
59     }
60
61     return true;
62   }
63 }