Package ghalatawi :: Module ar_ghalat
[hide private]
[frames] | no frames]

Source Code for Module ghalatawi.ar_ghalat

  1  #!/usr/bin/python 
  2  # -*- coding=utf-8 -*- 
  3  #************************************************************************ 
  4  # $Id: ar_ghalat.py,v 0.7 2011/01/05 01:10:00 Taha Zerrouki $ 
  5  # 
  6  # ------------ 
  7  # Description: 
  8  # ------------ 
  9  #  Copyright (c) 2011, Arabtechies, Arabeyes Taha Zerrouki 
 10  # 
 11  #  Elementary function to detect and correct minor spell error for  arabic texte 
 12  # 
 13  # ----------------- 
 14  # Revision Details:    (Updated by Revision Control System) 
 15  # ----------------- 
 16  #  $Date: 2011/01/05 01:10:00 $ 
 17  #  $Author: Taha Zerrouki $ 
 18  #  $Revision: 0.2 $ 
 19  #  $Source: ghalatawi.sourceforge.net 
 20  # 
 21  #  This program is written under the GPL License. 
 22  # 
 23  #***********************************************************************/ 
 24  """ 
 25  Ghalatawi: Arabic AutoCorrection module 
 26  @author: Taha Zerrouki 
 27  @contact: taha dot zerrouki at gmail dot com 
 28  @copyright: Arabtechies, Arabeyes,  Taha Zerrouki 
 29  @license: GPL 
 30  @date:2011/01/05 
 31  @version: 0.2 
 32  """ 
 33  import re 
 34  import pyarabic.araby as araby 
 35  """ 
 36  @var ArabicAutocorrectWordlist: Common error on stop words. 
 37  @var ReplacementTable: Table of regular expression to be treated. 
 38  """ 
 39  ArabicAutocorrectWordlist={ 
 40  #common error on stop words 
 41  u'اذا':u'إذا', 
 42  u'او':u'أو', 
 43  u'فى':u'في', 
 44  u'هى':u'هي', 
 45  u'انت':u'أنت', 
 46  u'انتما':u'أنتما', 
 47  u'الى':u'إلى', 
 48  u'التى':u'التي', 
 49  u'الذى':u'الذي', 
 50  } 
 51   
 52   
 53   
 54  ReplacementTable=[ 
 55  # removing kashida (Tatweel) 
 56  #(re.compile(ur'([\u0621-\u063F\u0641-\u064A])\u0640+([\u0621-\u063F\u0641-\u064A])',re.UNICODE), ur'\1\2'),  
 57  # rules for انفعال 
 58  (re.compile(ur'\b(و|ف|)(ك|ب|)(ال|)إن(\w\w)ا(\w)(ي|)(ين|ات|ة|تين|)\b',re.UNICODE), ur'\1\2\3ان\4ا\5\6\7'), 
 59  (re.compile(ur'\b(و|ف|)(لل|)إن(\w\w)ا(\w)(ي|)(ين|ات|تين|ة|)\b',re.UNICODE), ur'\1\2ان\3ا\4\5\6'), 
 60  (re.compile(ur'\b(و|ف|)(ك|ب|ل|)إن(\w\w)ا(\w)(ي|)(هما|كما|هم|كم|هن|كن|نا|ه|ك|ها|تهما|تكما|تهم|تكم|تهن|تكن|تنا|ته|تها|تك|اتهما|اتكما|اتهم|اتكم|اتهن|اتكن|اتنا|اته|اتها|اتك|)\b',re.UNICODE), ur'\1\2ان\3ا\4\5\6'), 
 61  (re.compile(ur'\b(و|ف|)(ال|)إن(\w\w)ا(\w)(ي|)(ين|ان|تين|تان|ون|)\b',re.UNICODE), ur'\1\2ان\3ا\4\5\6'), 
 62  (re.compile(ur'\b(و|ف|)إن(\w\w)ا(\w)(ي|)(ًا|اً|ا|)\b',re.UNICODE), ur'\1ان\2ا\3\4\5'), 
 63  # rules for افتعال 
 64  (re.compile(ur'\b(و|ف|)(ك|ب|)(ال|)إ(\w)ت(\w)ا(\w)(ي|)(ين|ات|ة|تين|)\b',re.UNICODE), ur'\1\2\3ا\4ت\5ا\6\7\8'), 
 65  (re.compile(ur'\b(و|ف|)(لل|)إ(\w)ت(\w)ا(\w)(ي|)(ين|ات|تين|ة|)\b',re.UNICODE), ur'\1\2ا\3ت\4ا\5\6\7'), 
 66  (re.compile(ur'\b(و|ف|)(ك|ب|ل|)إ(\w)ت(\w)ا(\w)(ي|)(هما|كما|هم|كم|هن|كن|نا|ه|ك|ها|تهما|تكما|تهم|تكم|تهن|تكن|تنا|ته|تها|تك|اتهما|اتكما|اتهم|اتكم|اتهن|اتكن|اتنا|اته|اتها|اتك|)\b',re.UNICODE), ur'\1\2ا\3ت\4ا\5\6\7'), 
 67  (re.compile(ur'\b(و|ف|)(ال|)إ(\w)ت(\w)ا(\w)(ي|)(ين|ان|تين|تان|ون|)\b',re.UNICODE), ur'\1\2ا\3ت\4ا\5\6\7'), 
 68  (re.compile(ur'\b(و|ف|)إ(\w)ت(\w)ا(\w)(ي|)(ًا|اً|ا|)\b',re.UNICODE), ur'\1ا\2ت\3ا\4\5\6'), 
 69  # rules for افتعال التي تحوي ضط أو صط أو زد 
 70  (re.compile(ur'\b(و|ف|)(ك|ب|)(ال|)إ(زد|ضط|صط)(\w)ا(\w)(ي|)(ين|ات|ة|تين|)\b',re.UNICODE), ur'\1\2\3ا\4\5ا\6\7\8'), 
 71  (re.compile(ur'\b(و|ف|)(لل|)إ(ﺯﺩ|ﺾﻃ|ﺺﻃ)(\w)ا(\w)(ي|)(ين|ات|تين|ة|)\b',re.UNICODE), ur'\1\2ا\3\4ا\5\6\7'), 
 72  (re.compile(ur'\b(و|ف|)(ك|ب|ل|)إ(ﺯﺩ|ﺾﻃ|ﺺﻃ)(\w)ا(\w)(ي|)(هما|كما|هم|كم|هن|كن|نا|ه|ك|ها|تهما|تكما|تهم|تكم|تهن|تكن|تنا|ته|تها|تك|اتهما|اتكما|اتهم|اتكم|اتهن|اتكن|اتنا|اته|اتها|اتك|)\b',re.UNICODE), ur'\1\2ا\3\4ا\5\6\7'), 
 73  (re.compile(ur'\b(و|ف|)(ال|)إ(ﺯﺩ|ﺾﻃ|ﺺﻃ)(\w)ا(\w)(ي|)(ين|ان|تين|تان|ون|)\b',re.UNICODE), ur'\1\2ا\3\4ا\5\6\7'), 
 74  (re.compile(ur'\b(و|ف|)إ(ﺯﺩ|ﺾﻃ|ﺺﻃ)(\w)ا(\w)(ي|)(ًا|اً|ا|)\b',re.UNICODE), ur'\1ا\2\3ا\4\5\6'), 
 75  # حالة الألف المقصورة بعدها همزة في آخر الكلمة، وعادة مايكون البديل همزة على النبرة.  
 76  (re.compile(ur'ىء\b',re.UNICODE), ur'ئ'), 
 77  # حالة الألف المقصورة ليست في آخر الكلمة، وعادة مايوضع بعدها فراغ  
 78  (re.compile(ur'ى([^ء]+)\b',re.UNICODE), ur'ى \1'), 
 79  # حالة التاء المربوطة ليست في آخر الكلمة، وعادة مايوضع بعدها فراغ  
 80  (re.compile(ur'ة(\w+)\b',re.UNICODE), ur'ة \1'), 
 81  # حالة الالف المكررة بعدها لام،يكون البديل بين اﻷلفين فراغ 
 82  #(re.compile(ur'\bاال(\w+)\b',re.UNICODE), ur'ال\1'), 
 83  #(re.compile(ur'(\w+)اال(\w+)\b',re.UNICODE), ur'\1ا ال\2'), 
 84  #(re.compile(ur'(\w+)(ا+)(\w+)\b',re.UNICODE), ur'\1ا\3'), 
 85  #(re.compile(ur'ا(ا+)',re.UNICODE), ur'ا'), 
 86  ] 
 87   
88 -def isArabicword(word):
89 """ Checks for a valid Arabic word. 90 An Arabic word not contains spaces, digits and pounctuation 91 avoid some spelling error, TEH_MARBUTA must be at the end. 92 @param word: input word 93 @type word: unicode 94 @return: True if all charaters are in Arabic block 95 @rtype: Boolean 96 """ 97 return araby.isArabicword(word);
98
99 -def autocorrectByRegex(word):
100 """ 101 Autocorrect by using regular expression from remplacement table. 102 103 Example: 104 >>> word=u"الإجتماعية" 105 >>> autocorrectByRegex(word) 106 الاجتماعية 107 108 @param word: the input word. 109 @type word: unicode. 110 @return: corrected word, if the word is common error, or False. 111 @rtype: unicode or False. 112 """ 113 # autocorrect words without diacritics 114 word=araby.stripTatweel(word); 115 word_nm=araby.stripTashkeel(word) 116 for rule in ReplacementTable: 117 # rule[0]: pattern 118 # rule[1]: replacement 119 result=rule[0].sub(rule[1],word_nm); 120 # if the result changes, return True; 121 if result!=word_nm: 122 return result; 123 #if all rules don't match, return False; 124 return False;
125 -def autocorrectByWordlist(word,wordlist=ArabicAutocorrectWordlist):
126 """ 127 Autocorrect by using word list. 128 the default list is ArabicAutocorrectWordlist. 129 130 Example: 131 >>> autocorrectlist={ 132 u'اذا':u'إذا', 133 u'او':u'أو', 134 u'فى':u'في', 135 u'هى':u'هي', 136 u'انت':u'أنت', 137 u'انتما':u'أنتما', 138 u'الى':u'إلى', 139 u'التى':u'التي', 140 u'الذى':u'الذي', 141 } 142 >>> word=u"اذا" 143 >>> autocorrectByWordlist(word, autocorrectlist) 144 إذا 145 146 @param word: the input word. 147 @type word: unicode. 148 @return: corrected word, if the word is common error, or False. 149 @rtype: unicode or False. 150 """ 151 # autocorrect words from a list 152 # autocorrect words without diacritics 153 word=araby.stripTatweel(word); 154 word_nm=araby.stripTashkeel(word) 155 if ArabicAutocorrectWordlist.has_key(word): 156 return ArabicAutocorrectWordlist[word]; 157 else: 158 return False;
159 -def loadAutocorrectWordlistFromFile(myfile):
160 """ 161 Load Autocorrect list from a file, to the global list autocorrect_arabic_list. 162 163 Example: 164 >>> autocorrectlist=loadAutocorrectWordlistFromFile("data/arabic.acl") 165 >>> word=u"اذا" 166 >>> autocorrectByWordlist(word, autocorrectlist) 167 إذا 168 169 @param myfile: the input word. 170 @type myfile: unicode. 171 @return: wordlist, if loaded, else False. 172 @rtype: Boolean. 173 """ 174 # load autolist from file 175 try: 176 fl=open(myfile); 177 except: 178 # file not found 179 return False; 180 line=fl.readline().decode("utf8"); 181 nb_field=2; 182 dWordlist={} 183 while line : 184 line=line.strip("\n"); 185 if not line.startswith("#"): 186 liste=line.split("\t"); 187 if len(liste)>=nb_field: 188 #error=liste[0]; 189 #correct=liste[1]; 190 dWordlist[liste[0]]=liste[1]; 191 line=fl.readline().decode("utf8"); 192 fl.close(); 193 return dWordlist;
194