LUCENE-1758: Update ArabicAnalyzer to light10 stemming, stopwords improvements, lowercase non-arabic text

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@801348 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Robert Muir 2009-08-05 18:22:22 +00:00
parent 7f1319fdf0
commit 820620f3a7
6 changed files with 96 additions and 225 deletions

View File

@ -8,6 +8,12 @@ Changes in runtime behavior
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

View File

@ -27,6 +27,7 @@ import java.util.Hashtable;
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 @@ import org.apache.lucene.analysis.WordlistLoader;
* <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 @@ public final class ArabicAnalyzer extends Analyzer {
/**
* 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 );

View File

@ -47,6 +47,7 @@ public class ArabicStemmer {
("" + BEH + ALEF + LAM).toCharArray(),
("" + KAF + ALEF + LAM).toCharArray(),
("" + FEH + ALEF + LAM).toCharArray(),
("" + LAM + LAM).toCharArray(),
("" + WAW).toCharArray(),
};

View File

@ -5,75 +5,39 @@
ا
أ
،
عشر
عبد
عدد
عدة
عشرة
عدم
عام
عاما
عرفات
عن
عند
عمان
عندما
على
علي
عليه
عليها
عملية
زيارة
سبتمبر
ساراييفو
سنة
سوريا
سنوات
تشرين
تم
تموز
ضد
بعد
بعض
اعادة
اعلن
اعلنت
حزب
حزيران
بسبب
اسرائيل
حسين
حتى
اتفاق
صرب
اذا
احد
اثر
غزة
برس
باسم
اجتماع
غدا
شخصا
صباح
اطار
اربعة
بغداد
اخرى
باريس
رابين
شرق
بان
ابو
اجل
غير
حركة
رئيس
جديدة
اطلاق
بشكل
بطولة
صحيفة
حاليا
بن
به
@ -84,166 +48,40 @@
اي
بها
جهة
صفر
حيث
اكد
الا
اما
العسكرية
العراق
العاصمة
العربية
العراقي
العراقية
العام
العالم
العلاقات
العمل
امس
السعودية
الساعة
السبت
السابق
روسيا
السلطة
السلطات
السلام
التعاون
التحرير
التى
التي
اكتوبر
دورة
اكثر
ايار
ايضا
الجزائر
حماس
الاسرائيلي
الاسرائيلية
الاسبوع
الاسلحة
الاسلامية
ذكرت
الاتحاد
الاتفاق
ثلاثة
الحرب
الاحد
الذاتي
الشرطة
الاربعاء
الغربية
الخارجية
الاردن
الشرق
ايران
الحدود
الرئيس
الاخيرة
الثاني
الثانية
الاثنين
شمال
بيان
دمشق
الذى
الذي
الان
امام
ايام
خلال
الشيخ
الجيش
الدور
الضفة
الجمعة
بيريز
الاوسط
الروسي
البوسنة
الروسية
بيروت
الانتخابات
البلاد
الدفاع
الثلثاء
الانباء
الثلاثاء
الاوروبي
حوالى
الذين
الدول
الحكم
الامم
الامن
الاول
الدولة
الخليج
الخميس
الاميركي
الاميركية
الدولي
الاولى
الدولية
الحكومة
بين
ذلك
دول
دون
حول
حين
الف
الى
انه
اول
ضمن
جنوب
دولة
انها
جميع
الوزراء
المتحدث
المتحدة
دولار
النار
الوضع
القدس
المحتلة
المصدر
المباراة
المصري
الماضي
المصرية
المرحلة
القدم
اللجنة
المجلس
الفرنسي
الفرنسية
القاهرة
المدينة
المانيا
الوطنية
المجموعة
الله
الفلسطيني
الفلسطينية
الفلسطينيين
الوقت
المقرر
القوات
النهائي
المقبل
المنطقة
الولايات
المفاوضات
الملك
اليمن
اليوم
ايلول
الكويت
ـ
ف
و
و6
@ -251,48 +89,19 @@
لا
ما
مع
وزارة
وزير
مساء
قتل
كرة
مصر
هذا
فاز
كأس
ياسر
قرار
مصدر
واحد
قطاع
مصادر
مباراة
مبارك
واضاف
واضافت
فرانس
واشنطن
فان
قبل
قال
كان
لدى
نحو
هذه
وان
محمد
واكد
يذكر
مجلس
فرنسا
كريستوفر
كانت
واوضح
لبنان
مايو
مدينة
مجموعة
كانون
فى
في
كل
@ -302,49 +111,51 @@
من
هو
هي
قوة
كما
لها
منذ
وقد
ولا
نفسه
موسكو
مقتل
لقاء
لكرة
نقطة
قوات
مقابل
لندن
هناك
وقال
وكان
منطقة
منظمة
نهاية
وكالة
وقالت
وكانت
للامم
فيه
كلم
لكن
وفي
وقف
ولم
ومن
وهو
وهي
يوم
فيها
منها
مليار
لوكالة
يكون
يمكن
كلينتون
مليون
يوليو
يونيو
نيويورك
أخرى
إذا
أربعة
إطار
إعادة
أعلن
أعلنت
أف
أكثر
أكد
إلا
الأخيرة
الآن
الأول
الأولى
إلى
أما
أن
إن
إنه
أنه
أنها
إنها
أو
اى
أي
أى
أيضا
بأن
فإن

View File

@ -17,6 +17,12 @@ package org.apache.lucene.analysis.ar;
* 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 @@ public class TestArabicAnalyzer extends TestCase {
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();
}
}

View File

@ -50,6 +50,10 @@ public class TestArabicStemFilter extends TestCase {
check("فالحسن", "حسن");
}
public void testLlPrefix() throws IOException {
check("للاخر", "اخر");
}
public void testWaPrefix() throws IOException {
check("وحسن", "حسن");
}