2011-04-19 12 views
5

कोड को देखते हुए Lucene 3.0.1 के तहतStandardTokenizer व्यवहार

import java.io.*; 
import org.apache.lucene.analysis.*; 
import org.apache.lucene.util.Version; 

public class MyAnalyzer extends Analyzer { 

    public TokenStream tokenStream(String fieldName, Reader reader) { 
     return 
       new StopFilter(
         true, 
         new StandardTokenizer(Version.LUCENE_30, reader), 
         StopAnalyzer.ENGLISH_STOP_WORDS_SET 
       ); 
    } 

    private static void printTokens(String string) throws IOException { 
     TokenStream ts = new MyAnalyzer().tokenStream("default", new 
StringReader(string)); 
     TermAttribute termAtt = ts.getAttribute(TermAttribute.class); 
     while(ts.incrementToken()) { 
      System.out.print(termAtt.term()); 
      System.out.print(" "); 
     } 
     System.out.println(); 
    } 

    public static void main(String[] args) throws IOException { 
     printTokens("one_two_three");   // prints "one two three" 
     printTokens("four4_five5_six6");  // prints "four4_five5_six6" 
     printTokens("seven7_eight_nine");  // prints "seven7_eight nine" 
     printTokens("ten_eleven11_twelve");  // prints "ten_eleven11_twelve" 
    } 
} 

चल रहा है मैं समझ सकता क्यों one_two_three और four4_five5_six6 tokenized कर रहे हैं के रूप में वे कर रहे हैं, के रूप में इस StandardTokenizer class header Javadoc से समझाया गया है। लेकिन अन्य दो मामले अधिक सूक्ष्म हैं और मैं बिल्कुल यकीन नहीं हूं कि मुझे विचार मिलता है।

Q1: seven के बाद 7 की उपस्थिति eight लेकिन nine को अलग से यह संयुक्त टोकन बनाता, क्यों teneleven11 से चिपका रहा है?

Q2: वहाँ अंडरस्कोर पर StandardTokenizer हमेशा विभाजन बनाने के लिए किसी भी मानक और/या आसान तरीका है?

उत्तर

3

यह एक दिलचस्प खोज है। मुझे बिल्कुल यकीन नहीं है कि यह कैसे समझाया जाए कि यह क्यू 1 के लिए क्यों कर रहा है। मैं फिर भी Q2 के लिए शेष अंडरस्कोर पर विभाजित करने के लिए कोड प्रदान कर सकते हैं:

public class MyAnalyzer extends Analyzer { 
    public TokenStream tokenStream(String fieldName, Reader reader) { 
     StandardTokenizer tokenizer = new StandardTokenizer(
       Version.LUCENE_30, reader); 
     TokenStream tokenStream = new StandardFilter(tokenizer); 
     tokenStream = new MyTokenFilter(tokenStream); 
     tokenStream = new StopFilter(true, tokenStream, 
       StopAnalyzer.ENGLISH_STOP_WORDS_SET); 
     return tokenStream; 
    } 
} 

public class MyTokenFilter extends TokenFilter { 
    private final TermAttribute termAttr; 
    private String[] terms; 
    private int pos; 

    public MyTokenFilter(TokenStream tokenStream) { 
     super(tokenStream); 
     this.termAttr = input.addAttribute(TermAttribute.class); 
    } 

    public boolean incrementToken() throws IOException { 
     if (terms == null) { 
      if (!input.incrementToken()) { 
       return false; 
      } 
      terms = termAttr.term().split("_"); 
     } 

     termAttr.setTermBuffer(terms[pos++]); 
     if (pos == terms.length) { 
      terms = null; 
      pos = 0; 
     } 
     return true; 
    } 
} 
+0

लेकिन ऐसा करने से मुझे लगता है कि है कि नियम गलत शुरुआत ऑफसेट और अंत गुण ऑफसेट होगा, है ना? – w4nderlust

संबंधित मुद्दे