|
|
| ''' |
| Created on ٠٢/٠٧/٢٠١٠ |
| |
| @Created by: Muhammad Altabba |
| ''' |
|
|
| from ...General.ArabicStringUtility import ArabicStringUtility; |
| from ...Morphology.Entities.Particle import *; |
| from ....Models.Tagging.POSTags.ParticlePOS import *; |
| from ....Models.Tagging.POSTags.POS import *; |
| from ....Models.Tagging.POSTags.CliticlessPOS import CliticlessPOSConstants, CliticlessPOS; |
|
|
| from ...Morphology.Cliticlization.EncliticGrammer import EncliticGrammer; |
|
|
|
|
| class CliticsGrammers(object): |
| """ |
| # PyUML: Do not remove this line! # XMI_ID:_hULWbY34Ed-gg8GOK1TmhA |
| """ |
| ''' |
| classdocs |
| ''' |
|
|
| GrammersDict = {}; |
|
|
| def __init__(self): |
| ''' |
| Constructor |
| ''' |
| pass |
|
|
| |
|
|
| def GetConsistentClitics(self, word, allCliticlesses, cliticsStrings, cliticState): |
|
|
| if(len(cliticsStrings)== 0 or (len(cliticsStrings) ==1 and cliticsStrings[0][0] == '')): |
| consistentClitics = []; |
| |
| |
| consistentClitics.append([]); |
| consistentClitics[0].append([]); |
| consistentClitics[0].append(allCliticlesses); |
| |
| |
| |
| |
| |
| return consistentClitics; |
| |
| |
| allCliticsPossibilities = []; |
| for j in range(len(cliticsStrings)): |
| clticString = cliticsStrings[j][0]; |
| if(clticString == ''): |
| continue; |
| if(clticString not in self.GrammersDict.keys()): |
| raise Exception('cltic ['+str(clticString)+'] is not found in the CliticsGrammers Dictionary! at ['+str(type(self))+']'); |
| |
| oneCliticPossibilities = {}; |
| |
| |
| if(cliticState == ParticleConstants.State.Enclitic): |
| clticDiacratic = word.GetDiacratic(clticString, True); |
| else: |
| clticDiacratic = word.GetDiacratic(clticString, False); |
| |
| for diacratic, procliticGrammers in self.GrammersDict[clticString].items(): |
| if(clticDiacratic != None and clticDiacratic != diacratic): |
| continue; |
| for cliticGrammer in procliticGrammers: |
| clticWithDiacritics = ArabicStringUtility.AddDiacratics(ArabicStringUtility, clticString, diacratic) |
| particle = cliticGrammer.CreateClitic(clticString, clticWithDiacritics, cliticState); |
| particle.Grammar = cliticGrammer; |
| |
| for k in range(len(allCliticlesses)): |
| cliticless = allCliticlesses[k]; |
| |
| |
| if(not cliticGrammer.IsCompatible(cliticless)): |
| continue; |
|
|
| |
| |
| if(not (type(cliticless) is Particle) and clticString == 'و' and cliticState == ParticleConstants.State.Enclitic and |
| j == 0): |
| if(cliticless.POS.Gender != CliticlessPOSConstants.Gender.Masculine or\ |
| cliticless.POS.Number != CliticlessPOSConstants.Number.Plural or\ |
| cliticless.POS.Person != CliticlessPOSConstants.Person.Third_Person): |
| continue; |
|
|
| if(particle not in oneCliticPossibilities.keys()): |
| oneCliticPossibilities[particle] = []; |
| oneCliticPossibilities[particle].append(cliticless); |
| |
| |
| |
| |
| allCliticsPossibilities.append(oneCliticPossibilities); |
| |
| |
| seq = []; |
| for k in range(len(allCliticsPossibilities)): |
| seq.append([]); |
| counter = 0; |
| for key, value in allCliticsPossibilities[k].items(): |
| if(k ==0): |
| seq[k].append( [[key],value] ); |
| else: |
| for s in range(len(seq[k-1])): |
| if(not key.Grammar.IsConsistentWith(seq[k-1][s][0])): |
| continue; |
| intersection = self.__Intersect(value, seq[k-1][s][1]); |
| if(intersection == []): |
| continue; |
| li = [x for x in seq[k-1][s][0]]; |
| li.append(key); |
| seq[k].append([li, intersection]); |
|
|
| counter += 1; |
|
|
|
|
| |
| |
| result = self.GetHiddenClitics(word); |
| |
| if(len(seq) > 1): |
| result.extend(seq[len(seq)-1]); |
| elif(seq != []): |
| result.extend(seq[0]); |
| else: |
| result.extend(seq); |
| |
| |
| return result; |
| pass |
|
|
| def GetHiddenClitics(self, cliticlessWord): |
|
|
| return []; |
| pass |
|
|
|
|
| def __Intersect(self, list1, list2): |
| intersection = []; |
| for i in range(len(list1)): |
| for j in range(len(list2)): |
| if(list1[i] == list2[j]): |
| intersection.append(list1[i]); |
| return intersection; |
| pass |
|
|