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

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. namespace Lucene.Net.Analysis
  18. {
  19. /// <summary> Removes stop words from a token stream.</summary>
  20. public sealed class StopFilter : TokenFilter
  21. {
  22. private System.Collections.Hashtable stopWords;
  23. private bool ignoreCase;
  24. /// <summary> Construct a token stream filtering the given input.</summary>
  25. public StopFilter(TokenStream input, System.String[] stopWords) : this(input, stopWords, false)
  26. {
  27. }
  28. /// <summary> Constructs a filter which removes words from the input
  29. /// TokenStream that are named in the array of words.
  30. /// </summary>
  31. public StopFilter(TokenStream in_Renamed, System.String[] stopWords, bool ignoreCase) : base(in_Renamed)
  32. {
  33. this.ignoreCase = ignoreCase;
  34. this.stopWords = MakeStopSet(stopWords, ignoreCase);
  35. }
  36. /// <summary> Constructs a filter which removes words from the input
  37. /// TokenStream that are named in the Hashtable.
  38. /// 
  39. /// </summary>
  40. /// <deprecated> Use {@link #StopFilter(TokenStream, Set)} instead
  41. /// </deprecated>
  42. public StopFilter(TokenStream in_Renamed, System.Collections.Hashtable stopTable) : this(in_Renamed, stopTable, false)
  43. {
  44. }
  45. /// <summary> Constructs a filter which removes words from the input
  46. /// TokenStream that are named in the Hashtable.
  47. /// If ignoreCase is true, all keys in the stopTable should already
  48. /// be lowercased.
  49. /// </summary>
  50. /// <deprecated> Use {@link #StopFilter(TokenStream, Set)} instead
  51. /// </deprecated>
  52. public StopFilter(TokenStream in_Renamed, System.Collections.Hashtable stopTable, bool ignoreCase) 
  53.             : this(in_Renamed, new System.Collections.Hashtable(stopTable), ignoreCase, 0)
  54. {
  55. }
  56. /// <summary> Construct a token stream filtering the given input.</summary>
  57. /// <param name="input">
  58. /// </param>
  59. /// <param name="stopWords">The set of Stop Words, as Strings.  If ignoreCase is true, all strings should be lower cased
  60. /// </param>
  61. /// <param name="ignoreCase">-Ignore case when stopping.  The stopWords set must be setup to contain only lower case words 
  62. /// </param>
  63. public StopFilter(TokenStream input, System.Collections.Hashtable stopWords, bool ignoreCase, int as_set_in_java) : base(input)
  64. {
  65. this.ignoreCase = ignoreCase;
  66. this.stopWords = stopWords;
  67. }
  68. /// <summary> Constructs a filter which removes words from the input
  69. /// TokenStream that are named in the Set.
  70. /// It is crucial that an efficient Set implementation is used
  71. /// for maximum performance.
  72. /// 
  73. /// </summary>
  74. /// <seealso cref="MakeStopSet(java.lang.String[])">
  75. /// </seealso>
  76. public StopFilter(TokenStream in_Renamed, System.Collections.Hashtable stopWords, int as_set_in_java) : this(in_Renamed, stopWords, false)
  77. {
  78. }
  79. /// <summary> Builds a Hashtable from an array of stop words,
  80. /// appropriate for passing into the StopFilter constructor.
  81. /// This permits this table construction to be cached once when
  82. /// an Analyzer is constructed.
  83. /// 
  84. /// </summary>
  85. /// <deprecated> Use {@link #MakeStopSet(String[])} instead.
  86. /// </deprecated>
  87. public static System.Collections.Hashtable MakeStopTable(System.String[] stopWords)
  88. {
  89. return makeStopTable(stopWords, false);
  90. }
  91. /// <summary> Builds a Hashtable from an array of stop words,
  92. /// appropriate for passing into the StopFilter constructor.
  93. /// This permits this table construction to be cached once when
  94. /// an Analyzer is constructed.
  95. /// </summary>
  96. /// <deprecated> Use {@link #MakeStopSet(java.lang.String[], boolean)}  instead.
  97. /// </deprecated>
  98. public static System.Collections.Hashtable makeStopTable(System.String[] stopWords, bool ignoreCase)
  99. {
  100. System.Collections.Hashtable stopTable = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable(stopWords.Length));
  101. for (int i = 0; i < stopWords.Length; i++)
  102. {
  103. System.String stopWord = ignoreCase ? stopWords[i].ToLower() : stopWords[i];
  104. stopTable[stopWord] = stopWord;
  105. }
  106. return stopTable;
  107. }
  108. /// <summary> Builds a Set from an array of stop words,
  109. /// appropriate for passing into the StopFilter constructor.
  110. /// This permits this stopWords construction to be cached once when
  111. /// an Analyzer is constructed.
  112. /// 
  113. /// </summary>
  114. /// <seealso cref="MakeStopSet(java.lang.String[], boolean) passing false to ignoreCase">
  115. /// </seealso>
  116. public static System.Collections.Hashtable MakeStopSet(System.String[] stopWords)
  117. {
  118. return MakeStopSet(stopWords, false);
  119. }
  120. /// <summary> </summary>
  121. /// <param name="stopWords">
  122. /// </param>
  123. /// <param name="ignoreCase">If true, all words are lower cased first.  
  124. /// </param>
  125. /// <returns> a Set containing the words
  126. /// </returns>
  127. public static System.Collections.Hashtable MakeStopSet(System.String[] stopWords, bool ignoreCase)
  128. {
  129. System.Collections.Hashtable stopTable = new System.Collections.Hashtable(stopWords.Length);
  130.             for (int i = 0; i < stopWords.Length; i++)
  131.             {
  132.                 System.String tmp = ignoreCase ? stopWords[i].ToLower() : stopWords[i];
  133.                 stopTable.Add(tmp, tmp);
  134.             }
  135. return stopTable;
  136. }
  137. /// <summary> Returns the next input Token whose termText() is not a stop word.</summary>
  138. public override Token Next()
  139. {
  140. // return the first non-stop word found
  141. for (Token token = input.Next(); token != null; token = input.Next())
  142. {
  143. System.String termText = ignoreCase ? token.termText.ToLower() : token.termText;
  144. if (!stopWords.Contains(termText))
  145. return token;
  146. }
  147. // reached EOS -- return null
  148. return null;
  149. }
  150. }
  151. }