XunLongTokenizer.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:4k
源码类别:

搜索引擎

开发平台:

C#

  1. using System;
  2. using System.IO;
  3. using System.Text;
  4. using Lucene.Net.Analysis;
  5. namespace Lucene.Net.Analysis.XunLongX
  6. {
  7.     /*
  8.           '       迅龙中文分类搜索引擎  v0.6
  9.           '
  10.           '        LGPL  许可发行
  11.           '
  12.           '       宁夏大学  张冬 康彩  zd4004@163.com
  13.           '
  14.           '
  15.      */
  16. public sealed class XunLongTokenizer : Tokenizer 
  17. {
  18.   
  19.         /// <summary>
  20.         /// 缓存分词结果
  21.         /// </summary>
  22.         private XunLongCNST[] Wordx0 = new XunLongCNST[18000];
  23.         private int WordxLen = 0;
  24.         private int pWordx = 0;
  25. /** Max word length */
  26. private static int MAX_WORD_LEN = 255;
  27. /** buffer size: */
  28. private static int IO_BUFFER_SIZE = 256;
  29. //~ Instance fields --------------------------------------------------------
  30. /** word offset, used to imply which character(in ) is parsed */
  31. private int offset = 0;
  32. /** the index used only for ioBuffer */
  33. private int bufferIndex = 0;
  34. /** data length */
  35. private int dataLen = 0;
  36. /**
  37.  * character buffer, store the characters which are used to compose <br>
  38.  * the returned Token
  39.  */
  40. private char[] buffer = new char[MAX_WORD_LEN];
  41. /**
  42.  * I/O buffer, used to store the content of the input(one of the <br>
  43.  * members of Tokenizer)
  44.  */
  45. private char[] ioBuffer = new char[IO_BUFFER_SIZE];
  46. /** word type: single=>ASCII  double=>non-ASCII word=>default */
  47. private String tokenType = "word";
  48. /**
  49.  * tag: previous character is a cached double-byte character  "C1C2C3C4"
  50.  * ----(set the C1 isTokened) C1C2 "C2C3C4" ----(set the C2 isTokened)
  51.  * C1C2 C2C3 "C3C4" ----(set the C3 isTokened) "C1C2 C2C3 C3C4"
  52.  */
  53. private bool preIsTokened = false;
  54. //~ Constructors -----------------------------------------------------------
  55. /// <summary>
  56. /// Construct a token stream processing the given input.
  57. /// </summary>
  58. /// <param name="_in">I/O reader</param>
  59. public XunLongTokenizer(TextReader _in) 
  60. {
  61. input = _in;
  62.             //中文分词               
  63.             XunLongCNST[] cnx = ClassXunLongChinese.ChineseIntface(_in);
  64.             if (cnx == null)
  65.             {
  66.             }
  67.             else
  68.             {
  69.                 WordxLen = cnx.Length;
  70.                 if (WordxLen > 18000)
  71.                 {
  72.                     WordxLen = 18000;
  73.                 }
  74.                 for (int i = 0; i < WordxLen; i++)
  75.                 {
  76.                     Wordx0[i].cWord = cnx[i].cWord;
  77.                     Wordx0[i].cType = cnx[i].cType;
  78.                     Wordx0[i].cStart = cnx[i].cStart;
  79.                     Wordx0[i].cLength = cnx[i].cLength;
  80.                 }
  81.             }
  82. }
  83. //~ Methods ----------------------------------------------------------------
  84. /// <summary>
  85. ///  Returns the next token in the stream, or null at EOS.
  86. /// </summary>
  87. /// <returns>Token</returns>
  88. public override Token Next()
  89. {
  90. /** how many character(s) has been stored in buffer */
  91. int length = 0;
  92. /** the position used to create Token */
  93. int start = offset;
  94.         RETX:
  95.             if (pWordx < WordxLen)
  96.             {
  97.                 //System.out.println(new String(buffer, 0, length));
  98.                 // string iu = new String(buffer, 0, length);
  99.                 XunLongCNST iu = Wordx0[pWordx];
  100.                 pWordx++;
  101.                 //过滤掉 无效的消息  保留分词
  102.                 if ((iu.cWord!=null)&(ClassXunLongChinese.ChineseFilterIt(iu) == false))
  103.                 {
  104.                     return new Token(iu.cWord, iu.cStart, iu.cLength, tokenType);
  105.                 }
  106.                 goto RETX;
  107.             }
  108.             else
  109.             {
  110.                 return null;
  111.             }
  112. // return new Token(new String(buffer, 0, length), start, start + length,tokenType);
  113. }
  114. }
  115. }