qutuf / SourceCode /Controllers /Morphology /Entities /DerivedCliticless.py
Boulbaba's picture
Upload 210 files
21baa2f verified
'''
Created on ٢٨‏/٠٥‏/٢٠١٠
@Created by: Muhammad Altabba
'''
from ....Controllers.Morphology.Entities.Cliticless import Cliticless;
from ....Controllers.Morphology.Entities.Particle import Particle, ParticleConstants;
from ....Models.Lexicon.RootAndPatterns.UnvoweledPattern import UnvoweledPattern;
from ....Models.Lexicon.RootAndPatterns.VoweledPattern import VoweledPattern;
from ....Models.Lexicon.RootAndPatterns.Root import Root;
from ....Models.Lexicon.LettersConstants import DiacriticsConstants, HamzaConstants;
from ....Models.Tagging.POSTags.CliticlessPOS import CliticlessPOSConstants;
from ....Models.Tagging.POSTags.VerbalPOS import VerbalPOSConstants;
from ....Models.Tagging.POSTags.NominalPOS import NominalPOSConstants, NominalPOS;
from ....Models.Tagging.POSTags.ParticlePOS import ParticlePOSConstants;
from ....Models.Tagging.POSTags.POS import POSConstants;
class DerivedCliticless(Cliticless):
"""
# PyUML: Do not remove this line! # XMI_ID:_qyiSBY35Ed-gg8GOK1TmhA
"""
'''
classdocs
'''
Root = Root(None, None);
#الجذر
UnvoweledPattern = UnvoweledPattern(None, None, None);
#وزن الجذع الغير مشكول
VoweledPattern = VoweledPattern();
#وزن الجذع المشكول
#
# Prefixes = [];
# #بوادئ
#
# Suffixes = [];
# #نهايات
#
__StemString = '';
#الجذع
InternalEnclitic = None;
def __init__(self, string, root, unvoweledPattern, voweledPattern):
'''
Constructor
'''
self.OriginalString = string;
self.Root = root;
self.UnvoweledForm = string;
self.UnvoweledPattern = unvoweledPattern;
self.VoweledPattern = voweledPattern
self.FillDiacritizedForm();
self.POS = self.VoweledPattern.POS.Clone();
self.InternalEnclitic = None;
pass
def UpdateInternalEnclitic(self):
[internalEnclitics, internalEncliticsCutLength] = self.GetInternalEnclitic();
if(internalEnclitics != None):
self.InternalEnclitic = internalEnclitics;
self.__StemString = self.UnvoweledForm[0:len(self.UnvoweledForm) - internalEncliticsCutLength];
pass
def GetStemString(self):
return self.__StemString;
pass
def FillDiacritizedForm(self):
voweledForm = '';
wordIndexCounter = 0;
for i in range(len(self.VoweledPattern.VoweledForm)):
if(self.VoweledPattern.VoweledForm[i] in ['ف','ع','ل']):
voweledForm += self.UnvoweledForm[wordIndexCounter];
else:
voweledForm += self.VoweledPattern.VoweledForm[i];
if(self.VoweledPattern.VoweledForm[i] not in DiacriticsConstants.AllDiacritics\
or (wordIndexCounter != len(self.UnvoweledForm) and self.VoweledPattern.VoweledForm[i] == self.UnvoweledForm[wordIndexCounter])):
wordIndexCounter += 1;
self.VoweledForm = voweledForm;
pass
def IsHamzaCompatibleWithVoweldForm(self):
start = -1;
while(True):
hamzaFound = False;
for hamza in HamzaConstants.AllHamzas:
hamzaIndex = self.VoweledForm.find(hamza, start+1);
if(hamzaIndex == -1):
continue;
else:
hamzaFound = True;
if(self.__IsHamzaCompatibleWithVoweldForm(hamzaIndex)):
start = hamzaIndex;
break;
else:
return False;
if(hamzaFound == False):
break;
return True;
pass
def __IsHamzaCompatibleWithVoweldForm(self, hamzaIndex):
if(hamzaIndex == len(self.VoweledForm)-1):
#############################################
return True;
hamza = self.VoweledForm[hamzaIndex];
DiacriticOfHamza = self.VoweledForm[hamzaIndex + 1];
if(hamzaIndex == 0):
if(DiacriticOfHamza in [DiacriticsConstants.Fatha, DiacriticsConstants.Damma]\
and hamza == HamzaConstants.OnAlif):
return True;
elif(DiacriticOfHamza in [DiacriticsConstants.Kasra]\
and hamza == HamzaConstants.UnderAlif):
return True;
else:
return False;
else:
if(DiacriticOfHamza not in DiacriticsConstants.AllDiacritics):
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# print('Warning: hamza is not well diacritized! VoweledForm = ['+self.VoweledForm+']'\
# + ', The Sukoon will be considered [ْ]' );
DiacriticOfHamza = DiacriticsConstants.Sukoon;
DiacriticBefore = self.VoweledForm[hamzaIndex - 1];
#############################################
#يجب معالجة القواعد الشاذة لكتابة الهمسة هنا!!!!
#############################################
if(DiacriticOfHamza == DiacriticsConstants.Sukoon):
DiacriticOfHamza = DiacriticBefore;
elif(DiacriticBefore == DiacriticsConstants.Kasra):
DiacriticOfHamza = DiacriticBefore;
elif(DiacriticBefore == DiacriticsConstants.Damma and DiacriticOfHamza == DiacriticsConstants.Fatha):
DiacriticOfHamza = DiacriticBefore;
if(DiacriticOfHamza in [DiacriticsConstants.Damma, DiacriticsConstants.DoubleDamma]):
if(hamza == HamzaConstants.OnWaw):
return True;
else:
return False;
elif(DiacriticOfHamza in [DiacriticsConstants.Kasra, DiacriticsConstants.DoubleKasra]):
if(hamza == HamzaConstants.OnYa):
return True;
else:
return False;
elif(DiacriticOfHamza in [DiacriticsConstants.Fatha, DiacriticsConstants.DoubleFatha]):
if(hamza == HamzaConstants.OnAlif):
return True;
else:
return False;
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# print('Warning: This Code is not supposed to be reached!');
return False;
pass
def GetInternalEnclitic(self):
if(type(self) is list):
x = 0;
if(self.POS.MainClass & POSConstants.MainClass.Verb == 0):
return [None, 0];
if(self.POS.Number & CliticlessPOSConstants.Number.Singular != 0 and \
self.POS.Person & VerbalPOSConstants.Person.Third_Person != 0 ):
#قد يكون ضمير مستتر وقد لا يكون
# unvoweled = 'هو';
# voweled = 'هُوَ';
return [None, 0];
unvoweled = '';
voweled = '';
isHidden = False;
#المتحول التالي يستخدم لفصل الضمير المظاهر عن الكلمة
#ولكن العملية تحتاج إلى معالجة أكثر تعقيداً
#لذلك إلى أن تتم المعالجة بالشكل الأمثل
#قمت بإسناد القيمة 0 لهذا المتحول في نهاية هذا التابع
cutLength = 0;
# "مسند إلى المتكلم أنا"
if(self.POS.Number == VerbalPOSConstants.Number.Singular and \
self.POS.Gender == VerbalPOSConstants.Gender.all_Cases and \
self.POS.Person == VerbalPOSConstants.Person.First_Person):
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
unvoweled = 'ت';
voweled = 'تُ';
else:
#ضمير مستتر
isHidden = True;
unvoweled = 'أنا';
voweled = 'أَنَاْ';
# "مسند إلى المتكلمين (نحن)"
if(self.POS.Number == VerbalPOSConstants.Number.Plural and \
self.POS.Gender == VerbalPOSConstants.Gender.all_Cases and \
self.POS.Person == VerbalPOSConstants.Person.First_Person):
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
#ضمير ظاهر
unvoweled = 'نا';
voweled = 'نَاْ';
cutLength = 2;
else:
#ضمير مستتر
isHidden = True;
unvoweled = 'نحن';
voweled = 'نحن';
# "مسند إلى المخاطَب أنت"
if(self.POS.Number == VerbalPOSConstants.Number.Singular and \
self.POS.Gender == VerbalPOSConstants.Gender.Masculine and \
self.POS.Person == VerbalPOSConstants.Person.Second_Person):
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
#ضمير ظاهر
unvoweled = 'ت';
voweled = 'تَ';
cutLength = 1;
else:
#ضمير مستتر
isHidden = True;
unvoweled = 'أنت';
voweled = 'أَنْتَ';
# "مسند إلى المخاطبة (أنتِ)"
if(self.POS.Number == VerbalPOSConstants.Number.Singular and \
self.POS.Gender == VerbalPOSConstants.Gender.Feminine and \
self.POS.Person == VerbalPOSConstants.Person.Second_Person):
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
#ضمير ظاهر
unvoweled = 'ت';
voweled = 'تِ';
cutLength = 1;
else:
unvoweled = 'ي';
voweled = 'ي';
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.CaseAndMood == VerbalPOSConstants.CaseAndMood.NominativeOrIndicative):
cutLength = 2;
else:
cutLength = 1;
# "مسند إلى المخاطَبَين (أنتما)"
if(self.POS.Number == VerbalPOSConstants.Number.Dual and \
self.POS.Gender == VerbalPOSConstants.Gender.Masculine and \
self.POS.Person == VerbalPOSConstants.Person.Second_Person):
#ضمير ظاهر
unvoweled = 'ا';
voweled = 'اْ';
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
cutLength = 3;
elif((self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.CaseAndMood == VerbalPOSConstants.CaseAndMood.NominativeOrIndicative) \
or (self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.Asserted == VerbalPOSConstants.Asserted.Asserted)):
cutLength = 2;
else:
cutLength = 1;
# "مسند إلى المخاطبين (أنتم)"
if(self.POS.Number == VerbalPOSConstants.Number.Plural and \
self.POS.Gender == VerbalPOSConstants.Gender.Masculine and \
self.POS.Person == VerbalPOSConstants.Person.Second_Person):
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
#ضمير مستتر
isHidden = True;
unvoweled = 'أنتم';
voweled = 'أَنْتُمْ';
cutLength = 2;
else:
#ضمير ظاهر
unvoweled = 'و';
voweled = 'وْ';
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.Asserted == VerbalPOSConstants.Asserted.Asserted):
cutLength = 1;
else:
cutLength = 2;
# "مسند إلى المخاطَبات (أنتن)"
if(self.POS.Number == VerbalPOSConstants.Number.Plural and \
self.POS.Gender == VerbalPOSConstants.Gender.Feminine and \
self.POS.Person == VerbalPOSConstants.Person.Second_Person):
#ضمير ظاهر
unvoweled = 'ن';
voweled = 'نَ';
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
cutLength = 2;
elif(self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.Asserted == VerbalPOSConstants.Asserted.Asserted):
cutLength = 3;
else:
cutLength = 1;
#
## "مسند إلى الغائب (هو)"
# if(self.POS.Number == VerbalPOSConstants.Number.Singular and \
# self.POS.Gender == VerbalPOSConstants.Gender.Masculine and \
# self.POS.Person == VerbalPOSConstants.Person.Third_Person):
# unvoweled = '';
# voweled = '';
#
## "مسند إلى الغائبة (هي)"
# if(self.POS.Number == VerbalPOSConstants.Number.Singular and \
# self.POS.Gender == VerbalPOSConstants.Gender.Feminine and \
# self.POS.Person == VerbalPOSConstants.Person.Third_Person):
# unvoweled = '';
# voweled = '';
# "مسند إلى الغائبَين (هما)"
if(self.POS.Number == VerbalPOSConstants.Number.Dual and \
self.POS.Gender == VerbalPOSConstants.Gender.Masculine and \
self.POS.Person == VerbalPOSConstants.Person.Third_Person):
#ضمير ظاهر
unvoweled = 'ا';
voweled = 'اْ';
if((self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.CaseAndMood == VerbalPOSConstants.CaseAndMood.NominativeOrIndicative) \
or (self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.Asserted == VerbalPOSConstants.Asserted.Asserted)):
cutLength = 2;
else:
cutLength = 1;
# "مسند إلى الغائبتين (هما)"
if(self.POS.Number == VerbalPOSConstants.Number.Dual and \
self.POS.Gender == VerbalPOSConstants.Gender.Feminine and \
self.POS.Person == VerbalPOSConstants.Person.Third_Person):
#ضمير ظاهر
unvoweled = 'ا';
voweled = 'اْ';
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Perfective):
cutLength = 2;
elif((self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.CaseAndMood == VerbalPOSConstants.CaseAndMood.NominativeOrIndicative) \
or (self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.Asserted == VerbalPOSConstants.Asserted.Asserted)):
cutLength = 2;
else:
cutLength = 1;
# "مسند إلى الغائبين (هم)"
if(self.POS.Number == VerbalPOSConstants.Number.Plural and \
self.POS.Gender == VerbalPOSConstants.Gender.Masculine and \
self.POS.Person == VerbalPOSConstants.Person.Third_Person):
unvoweled = 'و';
voweled = 'وْ';
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.Asserted == VerbalPOSConstants.Asserted.Asserted):
cutLength = 1;
else:
cutLength = 2;
# "مسند إلى الغائبات (هن)"
if(self.POS.Number == VerbalPOSConstants.Number.Singular and \
self.POS.Gender == VerbalPOSConstants.Gender.Feminine and \
self.POS.Person == VerbalPOSConstants.Person.Third_Person):
unvoweled = 'ن';
voweled = 'نَ';
if(self.POS.Aspect == VerbalPOSConstants.Aspect.Imperfective and \
self.POS.Asserted == VerbalPOSConstants.Asserted.Asserted):
cutLength = 1;
else:
cutLength = 2;
pos = NominalPOS();
if(isHidden == False):
pos.Substantivness = NominalPOSConstants.Substantivness.Substantive;
else:
pos.Substantivness = NominalPOSConstants.Substantivness.Hidden;
pos.Number = self.POS.Number;
pos.Gender = self.POS.Gender;
pos.CaseAndMood = CliticlessPOSConstants.CaseAndMood.NominativeOrIndicative;
pos.SubClass = NominalPOSConstants.SubClass.Nominative_Pronoun;
pos.Definiteness = NominalPOSConstants.Definiteness.Definite_by_Itself;
particle = Particle(unvoweled, voweled, ParticleConstants.State.Enclitic, pos);
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#المتحول التالي يستخدم لفصل الضمير المظاهر عن الكلمة
#ولكن العملية تحتاج إلى معالجة أكثر تعقيداً
#لذلك إلى أن تتم المعالجة بالشكل الأمثل
#قمت بإسناد القيمة 0 لهذا المتحول في نهاية هذا التابع
cutLength = 0;
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return [particle, cutLength];
pass