You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by rm...@apache.org on 2009/08/05 20:22:22 UTC

svn commit: r801348 - in /lucene/java/trunk/contrib: ./ analyzers/common/src/java/org/apache/lucene/analysis/ar/ analyzers/common/src/resources/org/apache/lucene/analysis/ar/ analyzers/common/src/test/org/apache/lucene/analysis/ar/

Author: rmuir
Date: Wed Aug  5 18:22:22 2009
New Revision: 801348

URL: http://svn.apache.org/viewvc?rev=801348&view=rev
Log:
LUCENE-1758: Update ArabicAnalyzer to light10 stemming, stopwords improvements, lowercase non-arabic text

Modified:
    lucene/java/trunk/contrib/CHANGES.txt
    lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicAnalyzer.java
    lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicStemmer.java
    lucene/java/trunk/contrib/analyzers/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt
    lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicAnalyzer.java
    lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicStemFilter.java

Modified: lucene/java/trunk/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/CHANGES.txt?rev=801348&r1=801347&r2=801348&view=diff
==============================================================================
--- lucene/java/trunk/contrib/CHANGES.txt (original)
+++ lucene/java/trunk/contrib/CHANGES.txt Wed Aug  5 18:22:22 2009
@@ -8,6 +8,12 @@
     number conversion.  You'll need to fully re-index any previously created indexes.
     This isn't a break in back-compatibility because local Lucene has not yet
     been released.  (Mike McCandless)
+ 
+ 2. LUCENE-1758: ArabicAnalyzer now uses the light10 algorithm, has a refined
+    default stopword list, and lowercases non-Arabic text.  
+    You'll need to fully re-index any previously created indexes. This isn't a 
+    break in back-compatibility because ArabicAnalyzer has not yet been 
+    released.  (Robert Muir)
 
 
 API Changes

Modified: lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicAnalyzer.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicAnalyzer.java?rev=801348&r1=801347&r2=801348&view=diff
==============================================================================
--- lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicAnalyzer.java (original)
+++ lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicAnalyzer.java Wed Aug  5 18:22:22 2009
@@ -27,6 +27,7 @@
 import java.util.Set;
 
 import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.LowerCaseFilter;
 import org.apache.lucene.analysis.StopFilter;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.WordlistLoader;
@@ -36,10 +37,9 @@
  * <p>
  * This analyzer implements light-stemming as specified by:
  * <i>
- * Improving Stemming for Arabic Information Retrieval: 
- *      Light Stemming and Co-occurrence Analysis
+ * Light Stemming for Arabic Information Retrieval
  * </i>    
- * http://ciir.cs.umass.edu/pubfiles/ir-249.pdf
+ * http://www.mtholyoke.edu/~lballest/Pubs/arab_stem05.pdf
  * <p>
  * The analysis package contains three primary components:
  * <ul>
@@ -109,12 +109,13 @@
   /**
    * Creates a TokenStream which tokenizes all the text in the provided Reader.
    *
-   * @return  A TokenStream build from a StandardTokenizer filtered with
-   * 			StandardFilter, StopFilter, ArabicNormalizationFilter and ArabicStemFilter.
+   * @return  A TokenStream build from an ArabicTokenizer filtered with
+   * 			StopFilter, LowerCaseFilter, ArabicNormalizationFilter and ArabicStemFilter.
    */
   public final TokenStream tokenStream(String fieldName, Reader reader) {
     TokenStream result = new ArabicLetterTokenizer( reader );
     result = new StopFilter( result, stoptable );
+    result = new LowerCaseFilter(result);
     result = new ArabicNormalizationFilter( result );
     result = new ArabicStemFilter( result );
 

Modified: lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicStemmer.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicStemmer.java?rev=801348&r1=801347&r2=801348&view=diff
==============================================================================
--- lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicStemmer.java (original)
+++ lucene/java/trunk/contrib/analyzers/common/src/java/org/apache/lucene/analysis/ar/ArabicStemmer.java Wed Aug  5 18:22:22 2009
@@ -47,6 +47,7 @@
       ("" + BEH + ALEF + LAM).toCharArray(),
       ("" + KAF + ALEF + LAM).toCharArray(),
       ("" + FEH + ALEF + LAM).toCharArray(),
+      ("" + LAM + LAM).toCharArray(),
       ("" + WAW).toCharArray(),
   };
   

Modified: lucene/java/trunk/contrib/analyzers/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/analyzers/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt?rev=801348&r1=801347&r2=801348&view=diff
==============================================================================
--- lucene/java/trunk/contrib/analyzers/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt (original)
+++ lucene/java/trunk/contrib/analyzers/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt Wed Aug  5 18:22:22 2009
@@ -5,75 +5,39 @@
 ا
 أ
 ،
-عشر
 عبد
-عدد
-عدة
-عشرة
 عدم
 عام
 عاما
-عرفات
 عن
 عند
-عمان
 عندما
 على
-علي
 عليه
 عليها
-عملية
-زيارة
-سبتمبر
-ساراييفو
-سنة
-سوريا
-سنوات
-تشرين
 تم
-تموز
 ضد
 بعد
 بعض
 اعادة
 اعلن
 اعلنت
-حزب
-حزيران
 بسبب
-اسرائيل
-حسين
 حتى
 اتفاق
-صرب
 اذا
 احد
 اثر
-غزة
-برس
-باسم
 اجتماع
-غدا
-شخصا
-صباح
 اطار
 اربعة
-بغداد
 اخرى
-باريس
-رابين
-شرق
 بان
 ابو
 اجل
 غير
-حركة
-رئيس
-جديدة
 اطلاق
 بشكل
-بطولة
-صحيفة
 حاليا
 بن
 به
@@ -84,166 +48,40 @@
 اي
 بها
 جهة
-صفر
 حيث
 اكد
 الا
 اما
-العسكرية
-العراق
-العاصمة
-العربية
-العراقي
-العراقية
 العام
-العالم
-العلاقات
-العمل
-امس
-السعودية
-الساعة
-السبت
 السابق
-روسيا
-السلطة
-السلطات
 السلام
 التعاون
-التحرير
 التى
 التي
-اكتوبر
-دورة
 اكثر
-ايار
 ايضا
-الجزائر
-حماس
-الاسرائيلي
-الاسرائيلية
-الاسبوع
-الاسلحة
-الاسلامية
-ذكرت
-الاتحاد
-الاتفاق
-ثلاثة
-الحرب
-الاحد
 الذاتي
-الشرطة
-الاربعاء
-الغربية
-الخارجية
-الاردن
-الشرق
-ايران
-الحدود
-الرئيس
 الاخيرة
 الثاني
 الثانية
-الاثنين
-شمال
-بيان
-دمشق
 الذى
 الذي
 الان
-امام
-ايام
 خلال
-الشيخ
-الجيش
-الدور
-الضفة
-الجمعة
-بيريز
-الاوسط
-الروسي
-البوسنة
-الروسية
-بيروت
-الانتخابات
-البلاد
-الدفاع
-الثلثاء
-الانباء
-الثلاثاء
-الاوروبي
 حوالى
 الذين
-الدول
 الحكم
-الامم
-الامن
 الاول
-الدولة
-الخليج
-الخميس
-الاميركي
-الاميركية
-الدولي
 الاولى
-الدولية
-الحكومة
 بين
 ذلك
-دول
-دون
-حول
-حين
-الف
 الى
 انه
-اول
 ضمن
-جنوب
-دولة
 انها
 جميع
-الوزراء
-المتحدث
-المتحدة
-دولار
-النار
-الوضع
-القدس
-المحتلة
-المصدر
-المباراة
-المصري
 الماضي
-المصرية
-المرحلة
-القدم
-اللجنة
-المجلس
-الفرنسي
-الفرنسية
-القاهرة
-المدينة
-المانيا
-الوطنية
-المجموعة
-الله
-الفلسطيني
-الفلسطينية
-الفلسطينيين
-الوقت
-المقرر
-القوات
-النهائي
 المقبل
-المنطقة
-الولايات
-المفاوضات
-الملك
-اليمن
-اليوم
-ايلول
-الكويت
-ـ
 ف
 و
 و6
@@ -251,48 +89,19 @@
 لا
 ما
 مع
-وزارة
-وزير
-مساء
-قتل
-كرة
-مصر
 هذا
-فاز
-كأس
-ياسر
-قرار
-مصدر
-واحد
-قطاع
-مصادر
-مباراة
-مبارك
 واضاف
 واضافت
-فرانس
-واشنطن
 فان
 قبل
-قال
 كان
 لدى
 نحو
 هذه
 وان
-محمد
-واكد
 يذكر
-مجلس
-فرنسا
-كريستوفر
 كانت
 واوضح
-لبنان
-مايو
-مدينة
-مجموعة
-كانون
 فى
 في
 كل
@@ -302,49 +111,51 @@
 من
 هو
 هي
-قوة
 كما
 لها
 منذ
-وقد
 ولا
-نفسه
-موسكو
-مقتل
-لقاء
-لكرة
-نقطة
-قوات
 مقابل
-لندن
 هناك
-وقال
 وكان
-منطقة
-منظمة
-نهاية
-وكالة
-وقالت
 وكانت
-للامم
 فيه
-كلم
 لكن
 وفي
-وقف
 ولم
 ومن
 وهو
 وهي
-يوم
 فيها
 منها
-مليار
-لوكالة
 يكون
-يمكن
-كلينتون
-مليون
-يوليو
-يونيو
-نيويورك
+أخرى
+إذا
+أربعة
+إطار
+إعادة
+أعلن
+أعلنت
+أف
+أكثر
+أكد
+إلا
+الأخيرة
+الآن
+الأول
+الأولى
+إلى
+أما
+أن
+إن
+إنه
+أنه
+أنها
+إنها
+أو
+اى
+أي
+أى
+أيضا
+بأن
+فإن

Modified: lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicAnalyzer.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicAnalyzer.java?rev=801348&r1=801347&r2=801348&view=diff
==============================================================================
--- lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicAnalyzer.java (original)
+++ lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicAnalyzer.java Wed Aug  5 18:22:22 2009
@@ -17,6 +17,12 @@
  * limitations under the License.
  */
 
+import java.io.StringReader;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.tokenattributes.TermAttribute;
+
 import junit.framework.TestCase;
 
 /**
@@ -31,6 +37,48 @@
     new ArabicAnalyzer();
   }
   
-  /* TODO: more tests */
+  /**
+   * Some simple tests showing some features of the analyzer, how some regular forms will conflate
+   */
+  public void testBasicFeatures() throws Exception {
+    ArabicAnalyzer a = new ArabicAnalyzer();
+    assertAnalyzesTo(a, "كبير", new String[] { "كبير" });
+    assertAnalyzesTo(a, "كبيرة", new String[] { "كبير" }); // feminine marker
+    
+    assertAnalyzesTo(a, "مشروب", new String[] { "مشروب" });
+    assertAnalyzesTo(a, "مشروبات", new String[] { "مشروب" }); // plural -at
+    
+    assertAnalyzesTo(a, "أمريكيين", new String[] { "امريك" }); // plural -in
+    assertAnalyzesTo(a, "امريكي", new String[] { "امريك" }); // singular with bare alif
+    
+    assertAnalyzesTo(a, "كتاب", new String[] { "كتاب" }); 
+    assertAnalyzesTo(a, "الكتاب", new String[] { "كتاب" }); // definite article
+    
+    assertAnalyzesTo(a, "ما ملكت أيمانكم", new String[] { "ملكت", "ايمانكم"});
+    assertAnalyzesTo(a, "الذين ملكت أيمانكم", new String[] { "ملكت", "ايمانكم" }); // stopwords
+  }
+
+  /**
+   * Non-arabic text gets treated in a similar way as SimpleAnalyzer.
+   */
+  public void testEnglishInput() throws Exception {
+    assertAnalyzesTo(new ArabicAnalyzer(), "English text.", new String[] {
+        "english", "text" });
+  }
+  
+  private void assertAnalyzesTo(Analyzer a, String input, String[] output)
+      throws Exception {
+    TokenStream ts = a.tokenStream("dummy", new StringReader(input));
+    TermAttribute termAtt = (TermAttribute) ts
+        .getAttribute(TermAttribute.class);
+
+    for (int i = 0; i < output.length; i++) {
+      assertTrue(ts.incrementToken());
+      assertEquals(output[i], termAtt.term());
+    }
+
+    assertFalse(ts.incrementToken());
+    ts.close();
+  }
 
 }

Modified: lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicStemFilter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicStemFilter.java?rev=801348&r1=801347&r2=801348&view=diff
==============================================================================
--- lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicStemFilter.java (original)
+++ lucene/java/trunk/contrib/analyzers/common/src/test/org/apache/lucene/analysis/ar/TestArabicStemFilter.java Wed Aug  5 18:22:22 2009
@@ -50,6 +50,10 @@
     check("فالحسن", "حسن");
   }    
 
+  public void testLlPrefix() throws IOException {
+    check("للاخر", "اخر"); 
+  }
+  
   public void testWaPrefix() throws IOException {
     check("وحسن", "حسن");
   }