mirror of https://github.com/apache/lucene.git
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:
parent
7f1319fdf0
commit
820620f3a7
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@ public class ArabicStemmer {
|
|||
("" + BEH + ALEF + LAM).toCharArray(),
|
||||
("" + KAF + ALEF + LAM).toCharArray(),
|
||||
("" + FEH + ALEF + LAM).toCharArray(),
|
||||
("" + LAM + LAM).toCharArray(),
|
||||
("" + WAW).toCharArray(),
|
||||
};
|
||||
|
||||
|
|
|
@ -5,75 +5,39 @@
|
|||
ا
|
||||
أ
|
||||
،
|
||||
عشر
|
||||
عبد
|
||||
عدد
|
||||
عدة
|
||||
عشرة
|
||||
عدم
|
||||
عام
|
||||
عاما
|
||||
عرفات
|
||||
عن
|
||||
عند
|
||||
عمان
|
||||
عندما
|
||||
على
|
||||
علي
|
||||
عليه
|
||||
عليها
|
||||
عملية
|
||||
زيارة
|
||||
سبتمبر
|
||||
ساراييفو
|
||||
سنة
|
||||
سوريا
|
||||
سنوات
|
||||
تشرين
|
||||
تم
|
||||
تموز
|
||||
ضد
|
||||
بعد
|
||||
بعض
|
||||
اعادة
|
||||
اعلن
|
||||
اعلنت
|
||||
حزب
|
||||
حزيران
|
||||
بسبب
|
||||
اسرائيل
|
||||
حسين
|
||||
حتى
|
||||
اتفاق
|
||||
صرب
|
||||
اذا
|
||||
احد
|
||||
اثر
|
||||
غزة
|
||||
برس
|
||||
باسم
|
||||
اجتماع
|
||||
غدا
|
||||
شخصا
|
||||
صباح
|
||||
اطار
|
||||
اربعة
|
||||
بغداد
|
||||
اخرى
|
||||
باريس
|
||||
رابين
|
||||
شرق
|
||||
بان
|
||||
ابو
|
||||
اجل
|
||||
غير
|
||||
حركة
|
||||
رئيس
|
||||
جديدة
|
||||
اطلاق
|
||||
بشكل
|
||||
بطولة
|
||||
صحيفة
|
||||
حاليا
|
||||
بن
|
||||
به
|
||||
|
@ -84,166 +48,40 @@
|
|||
اي
|
||||
بها
|
||||
جهة
|
||||
صفر
|
||||
حيث
|
||||
اكد
|
||||
الا
|
||||
اما
|
||||
العسكرية
|
||||
العراق
|
||||
العاصمة
|
||||
العربية
|
||||
العراقي
|
||||
العراقية
|
||||
العام
|
||||
العالم
|
||||
العلاقات
|
||||
العمل
|
||||
امس
|
||||
السعودية
|
||||
الساعة
|
||||
السبت
|
||||
السابق
|
||||
روسيا
|
||||
السلطة
|
||||
السلطات
|
||||
السلام
|
||||
التعاون
|
||||
التحرير
|
||||
التى
|
||||
التي
|
||||
اكتوبر
|
||||
دورة
|
||||
اكثر
|
||||
ايار
|
||||
ايضا
|
||||
الجزائر
|
||||
حماس
|
||||
الاسرائيلي
|
||||
الاسرائيلية
|
||||
الاسبوع
|
||||
الاسلحة
|
||||
الاسلامية
|
||||
ذكرت
|
||||
الاتحاد
|
||||
الاتفاق
|
||||
ثلاثة
|
||||
الحرب
|
||||
الاحد
|
||||
الذاتي
|
||||
الشرطة
|
||||
الاربعاء
|
||||
الغربية
|
||||
الخارجية
|
||||
الاردن
|
||||
الشرق
|
||||
ايران
|
||||
الحدود
|
||||
الرئيس
|
||||
الاخيرة
|
||||
الثاني
|
||||
الثانية
|
||||
الاثنين
|
||||
شمال
|
||||
بيان
|
||||
دمشق
|
||||
الذى
|
||||
الذي
|
||||
الان
|
||||
امام
|
||||
ايام
|
||||
خلال
|
||||
الشيخ
|
||||
الجيش
|
||||
الدور
|
||||
الضفة
|
||||
الجمعة
|
||||
بيريز
|
||||
الاوسط
|
||||
الروسي
|
||||
البوسنة
|
||||
الروسية
|
||||
بيروت
|
||||
الانتخابات
|
||||
البلاد
|
||||
الدفاع
|
||||
الثلثاء
|
||||
الانباء
|
||||
الثلاثاء
|
||||
الاوروبي
|
||||
حوالى
|
||||
الذين
|
||||
الدول
|
||||
الحكم
|
||||
الامم
|
||||
الامن
|
||||
الاول
|
||||
الدولة
|
||||
الخليج
|
||||
الخميس
|
||||
الاميركي
|
||||
الاميركية
|
||||
الدولي
|
||||
الاولى
|
||||
الدولية
|
||||
الحكومة
|
||||
بين
|
||||
ذلك
|
||||
دول
|
||||
دون
|
||||
حول
|
||||
حين
|
||||
الف
|
||||
الى
|
||||
انه
|
||||
اول
|
||||
ضمن
|
||||
جنوب
|
||||
دولة
|
||||
انها
|
||||
جميع
|
||||
الوزراء
|
||||
المتحدث
|
||||
المتحدة
|
||||
دولار
|
||||
النار
|
||||
الوضع
|
||||
القدس
|
||||
المحتلة
|
||||
المصدر
|
||||
المباراة
|
||||
المصري
|
||||
الماضي
|
||||
المصرية
|
||||
المرحلة
|
||||
القدم
|
||||
اللجنة
|
||||
المجلس
|
||||
الفرنسي
|
||||
الفرنسية
|
||||
القاهرة
|
||||
المدينة
|
||||
المانيا
|
||||
الوطنية
|
||||
المجموعة
|
||||
الله
|
||||
الفلسطيني
|
||||
الفلسطينية
|
||||
الفلسطينيين
|
||||
الوقت
|
||||
المقرر
|
||||
القوات
|
||||
النهائي
|
||||
المقبل
|
||||
المنطقة
|
||||
الولايات
|
||||
المفاوضات
|
||||
الملك
|
||||
اليمن
|
||||
اليوم
|
||||
ايلول
|
||||
الكويت
|
||||
ـ
|
||||
ف
|
||||
و
|
||||
و6
|
||||
|
@ -251,48 +89,19 @@
|
|||
لا
|
||||
ما
|
||||
مع
|
||||
وزارة
|
||||
وزير
|
||||
مساء
|
||||
قتل
|
||||
كرة
|
||||
مصر
|
||||
هذا
|
||||
فاز
|
||||
كأس
|
||||
ياسر
|
||||
قرار
|
||||
مصدر
|
||||
واحد
|
||||
قطاع
|
||||
مصادر
|
||||
مباراة
|
||||
مبارك
|
||||
واضاف
|
||||
واضافت
|
||||
فرانس
|
||||
واشنطن
|
||||
فان
|
||||
قبل
|
||||
قال
|
||||
كان
|
||||
لدى
|
||||
نحو
|
||||
هذه
|
||||
وان
|
||||
محمد
|
||||
واكد
|
||||
يذكر
|
||||
مجلس
|
||||
فرنسا
|
||||
كريستوفر
|
||||
كانت
|
||||
واوضح
|
||||
لبنان
|
||||
مايو
|
||||
مدينة
|
||||
مجموعة
|
||||
كانون
|
||||
فى
|
||||
في
|
||||
كل
|
||||
|
@ -302,49 +111,51 @@
|
|||
من
|
||||
هو
|
||||
هي
|
||||
قوة
|
||||
كما
|
||||
لها
|
||||
منذ
|
||||
وقد
|
||||
ولا
|
||||
نفسه
|
||||
موسكو
|
||||
مقتل
|
||||
لقاء
|
||||
لكرة
|
||||
نقطة
|
||||
قوات
|
||||
مقابل
|
||||
لندن
|
||||
هناك
|
||||
وقال
|
||||
وكان
|
||||
منطقة
|
||||
منظمة
|
||||
نهاية
|
||||
وكالة
|
||||
وقالت
|
||||
وكانت
|
||||
للامم
|
||||
فيه
|
||||
كلم
|
||||
لكن
|
||||
وفي
|
||||
وقف
|
||||
ولم
|
||||
ومن
|
||||
وهو
|
||||
وهي
|
||||
يوم
|
||||
فيها
|
||||
منها
|
||||
مليار
|
||||
لوكالة
|
||||
يكون
|
||||
يمكن
|
||||
كلينتون
|
||||
مليون
|
||||
يوليو
|
||||
يونيو
|
||||
نيويورك
|
||||
أخرى
|
||||
إذا
|
||||
أربعة
|
||||
إطار
|
||||
إعادة
|
||||
أعلن
|
||||
أعلنت
|
||||
أف
|
||||
أكثر
|
||||
أكد
|
||||
إلا
|
||||
الأخيرة
|
||||
الآن
|
||||
الأول
|
||||
الأولى
|
||||
إلى
|
||||
أما
|
||||
أن
|
||||
إن
|
||||
إنه
|
||||
أنه
|
||||
أنها
|
||||
إنها
|
||||
أو
|
||||
اى
|
||||
أي
|
||||
أى
|
||||
أيضا
|
||||
بأن
|
||||
فإن
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -50,6 +50,10 @@ public class TestArabicStemFilter extends TestCase {
|
|||
check("فالحسن", "حسن");
|
||||
}
|
||||
|
||||
public void testLlPrefix() throws IOException {
|
||||
check("للاخر", "اخر");
|
||||
}
|
||||
|
||||
public void testWaPrefix() throws IOException {
|
||||
check("وحسن", "حسن");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue