ChineseTokenizer.java
上传用户:cctqzzy
上传日期:2022-03-14
资源大小:12198k
文件大小:4k
源码类别:

搜索引擎

开发平台:

Java

  1. //package org.apache.lucene.analysis.cn;
  2. /**
  3.  * Licensed to the Apache Software Foundation (ASF) under one or more
  4.  * contributor license agreements.  See the NOTICE file distributed with
  5.  * this work for additional information regarding copyright ownership.
  6.  * The ASF licenses this file to You under the Apache License, Version 2.0
  7.  * (the "License"); you may not use this file except in compliance with
  8.  * the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package chapter9;
  19. import java.io.Reader;
  20. import org.apache.lucene.analysis.*;
  21. /**
  22.  * Title: ChineseTokenizer
  23.  * Description: Extract tokens from the Stream using Character.getType()
  24.  *              Rule: A Chinese character as a single token
  25.  * Copyright:   Copyright (c) 2001
  26.  * Company:
  27.  *
  28.  * The difference between thr ChineseTokenizer and the
  29.  * CJKTokenizer (id=23545) is that they have different
  30.  * token parsing logic.
  31.  * 
  32.  * Let me use an example. If having a Chinese text
  33.  * "C1C2C3C4" to be indexed, the tokens returned from the
  34.  * ChineseTokenizer are C1, C2, C3, C4. And the tokens
  35.  * returned from the CJKTokenizer are C1C2, C2C3, C3C4.
  36.  *
  37.  * Therefore the index the CJKTokenizer created is much
  38.  * larger.
  39.  *
  40.  * The problem is that when searching for C1, C1C2, C1C3,
  41.  * C4C2, C1C2C3 ... the ChineseTokenizer works, but the
  42.  * CJKTokenizer will not work.
  43.  *
  44.  * @author Yiyi Sun
  45.  * @version 1.0
  46.  *
  47.  */
  48. public final class ChineseTokenizer extends Tokenizer {
  49.     public ChineseTokenizer(Reader in) {
  50.         input = in;
  51.     }
  52.     private int offset = 0, bufferIndex=0, dataLen=0;
  53.     private final static int MAX_WORD_LEN = 255;
  54.     private final static int IO_BUFFER_SIZE = 1024;
  55.     private final char[] buffer = new char[MAX_WORD_LEN];
  56.     private final char[] ioBuffer = new char[IO_BUFFER_SIZE];
  57.     private int length;
  58.     private int start;
  59.     private final void push(char c) {
  60.         if (length == 0) start = offset-1;            // start of token
  61.         buffer[length++] = Character.toLowerCase(c);  // buffer it
  62.     }
  63.     private final Token flush() {
  64.         if (length>0) {
  65.             //System.out.println(new String(buffer, 0, length));
  66.             return new Token(new String(buffer, 0, length), start, start+length);
  67.         }
  68.         else
  69.             return null;
  70.     }
  71.     public final Token next() throws java.io.IOException {
  72.         length = 0;
  73.         start = offset;
  74.         while (true) {
  75.             final char c;
  76.             offset++;
  77.             if (bufferIndex >= dataLen) {
  78.                 dataLen = input.read(ioBuffer);
  79.                 bufferIndex = 0;
  80.             }
  81.             if (dataLen == -1) return flush();
  82.             else
  83.                 c = ioBuffer[bufferIndex++];
  84.             switch(Character.getType(c)) {
  85.             case Character.DECIMAL_DIGIT_NUMBER:
  86.             case Character.LOWERCASE_LETTER:
  87.             case Character.UPPERCASE_LETTER:
  88.                 push(c);
  89.                 if (length == MAX_WORD_LEN) return flush();
  90.                 break;
  91.             case Character.OTHER_LETTER:
  92.                 if (length>0) {
  93.                     bufferIndex--;
  94.                     offset--;
  95.                     return flush();
  96.                 }
  97.                 push(c);
  98.                 return flush();
  99.             default:
  100.                 if (length>0) return flush();
  101.                 break;
  102.             }
  103.         }
  104.     }
  105. }