Grammalecte  Hex Artifact Content

Artifact df9f884192c7a93a0a9cb446de5409ed2ed0938157f35874dd11011e5db35f65:


0000: 22 22 22 0a 47 72 61 6d 6d 61 6c 65 63 74 65 20  """.Grammalecte 
0010: 2d 20 53 75 67 67 65 73 74 69 6f 6e 20 70 68 6f  - Suggestion pho
0020: 6e c3 a9 74 69 71 75 65 0a 22 22 22 0a 0a 23 20  n..tique."""..# 
0030: 4c 69 63 65 6e 73 65 3a 20 47 50 4c 20 33 0a 0a  License: GPL 3..
0040: 69 6d 70 6f 72 74 20 72 65 0a 0a 66 72 6f 6d 20  import re..from 
0050: 2e 70 68 6f 6e 65 74 5f 64 61 74 61 20 69 6d 70  .phonet_data imp
0060: 6f 72 74 20 64 57 6f 72 64 20 61 73 20 5f 64 57  ort dWord as _dW
0070: 6f 72 64 0a 66 72 6f 6d 20 2e 70 68 6f 6e 65 74  ord.from .phonet
0080: 5f 64 61 74 61 20 69 6d 70 6f 72 74 20 6c 53 65  _data import lSe
0090: 74 20 61 73 20 5f 6c 53 65 74 0a 66 72 6f 6d 20  t as _lSet.from 
00a0: 2e 70 68 6f 6e 65 74 5f 64 61 74 61 20 69 6d 70  .phonet_data imp
00b0: 6f 72 74 20 64 4d 6f 72 70 68 20 61 73 20 5f 64  ort dMorph as _d
00c0: 4d 6f 72 70 68 0a 0a 0a 64 65 66 20 68 61 73 53  Morph...def hasS
00d0: 69 6d 69 6c 20 28 73 57 6f 72 64 2c 20 73 50 61  imil (sWord, sPa
00e0: 74 74 65 72 6e 3d 4e 6f 6e 65 29 3a 0a 20 20 20  ttern=None):.   
00f0: 20 22 72 65 74 75 72 6e 20 54 72 75 65 20 69 66   "return True if
0100: 20 74 68 65 72 65 20 69 73 20 6c 69 73 74 20 6f   there is list o
0110: 66 20 77 6f 72 64 73 20 70 68 6f 6e 65 74 69 63  f words phonetic
0120: 61 6c 6c 79 20 73 69 6d 69 6c 61 72 20 74 6f 20  ally similar to 
0130: 73 57 6f 72 64 22 0a 20 20 20 20 69 66 20 6e 6f  sWord".    if no
0140: 74 20 73 57 6f 72 64 3a 0a 20 20 20 20 20 20 20  t sWord:.       
0150: 20 72 65 74 75 72 6e 20 46 61 6c 73 65 0a 20 20   return False.  
0160: 20 20 69 66 20 73 57 6f 72 64 20 69 6e 20 5f 64    if sWord in _d
0170: 57 6f 72 64 3a 0a 20 20 20 20 20 20 20 20 69 66  Word:.        if
0180: 20 73 50 61 74 74 65 72 6e 3a 0a 20 20 20 20 20   sPattern:.     
0190: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e         return an
01a0: 79 28 72 65 2e 73 65 61 72 63 68 28 73 50 61 74  y(re.search(sPat
01b0: 74 65 72 6e 2c 20 73 4d 6f 72 70 68 29 20 20 66  tern, sMorph)  f
01c0: 6f 72 20 73 53 69 6d 69 6c 20 69 6e 20 67 65 74  or sSimil in get
01d0: 53 69 6d 69 6c 28 73 57 6f 72 64 29 20 20 66 6f  Simil(sWord)  fo
01e0: 72 20 73 4d 6f 72 70 68 20 69 6e 20 5f 64 4d 6f  r sMorph in _dMo
01f0: 72 70 68 2e 67 65 74 28 73 53 69 6d 69 6c 2c 20  rph.get(sSimil, 
0200: 5b 5d 29 29 0a 20 20 20 20 20 20 20 20 72 65 74  [])).        ret
0210: 75 72 6e 20 54 72 75 65 0a 20 20 20 20 69 66 20  urn True.    if 
0220: 73 57 6f 72 64 5b 30 3a 31 5d 2e 69 73 75 70 70  sWord[0:1].isupp
0230: 65 72 28 29 3a 0a 20 20 20 20 20 20 20 20 73 57  er():.        sW
0240: 6f 72 64 20 3d 20 73 57 6f 72 64 2e 6c 6f 77 65  ord = sWord.lowe
0250: 72 28 29 0a 20 20 20 20 20 20 20 20 69 66 20 73  r().        if s
0260: 57 6f 72 64 20 69 6e 20 5f 64 57 6f 72 64 3a 0a  Word in _dWord:.
0270: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
0280: 50 61 74 74 65 72 6e 3a 0a 20 20 20 20 20 20 20  Pattern:.       
0290: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
02a0: 61 6e 79 28 72 65 2e 73 65 61 72 63 68 28 73 50  any(re.search(sP
02b0: 61 74 74 65 72 6e 2c 20 73 4d 6f 72 70 68 29 20  attern, sMorph) 
02c0: 20 66 6f 72 20 73 53 69 6d 69 6c 20 69 6e 20 67   for sSimil in g
02d0: 65 74 53 69 6d 69 6c 28 73 57 6f 72 64 29 20 20  etSimil(sWord)  
02e0: 66 6f 72 20 73 4d 6f 72 70 68 20 69 6e 20 5f 64  for sMorph in _d
02f0: 4d 6f 72 70 68 2e 67 65 74 28 73 53 69 6d 69 6c  Morph.get(sSimil
0300: 2c 20 5b 5d 29 29 0a 20 20 20 20 20 20 20 20 20  , [])).         
0310: 20 20 20 72 65 74 75 72 6e 20 54 72 75 65 0a 20     return True. 
0320: 20 20 20 72 65 74 75 72 6e 20 46 61 6c 73 65 0a     return False.
0330: 0a 0a 64 65 66 20 67 65 74 53 69 6d 69 6c 20 28  ..def getSimil (
0340: 73 57 6f 72 64 29 3a 0a 20 20 20 20 22 72 65 74  sWord):.    "ret
0350: 75 72 6e 20 6c 69 73 74 20 6f 66 20 77 6f 72 64  urn list of word
0360: 73 20 70 68 6f 6e 65 74 69 63 61 6c 6c 79 20 73  s phonetically s
0370: 69 6d 69 6c 61 72 20 74 6f 20 73 57 6f 72 64 22  imilar to sWord"
0380: 0a 20 20 20 20 69 66 20 6e 6f 74 20 73 57 6f 72  .    if not sWor
0390: 64 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  d:.        retur
03a0: 6e 20 5b 5d 0a 20 20 20 20 69 66 20 73 57 6f 72  n [].    if sWor
03b0: 64 20 69 6e 20 5f 64 57 6f 72 64 3a 0a 20 20 20  d in _dWord:.   
03c0: 20 20 20 20 20 72 65 74 75 72 6e 20 5f 6c 53 65       return _lSe
03d0: 74 5b 5f 64 57 6f 72 64 5b 73 57 6f 72 64 5d 5d  t[_dWord[sWord]]
03e0: 0a 20 20 20 20 69 66 20 73 57 6f 72 64 5b 30 3a  .    if sWord[0:
03f0: 31 5d 2e 69 73 75 70 70 65 72 28 29 3a 0a 20 20  1].isupper():.  
0400: 20 20 20 20 20 20 73 57 6f 72 64 20 3d 20 73 57        sWord = sW
0410: 6f 72 64 2e 6c 6f 77 65 72 28 29 0a 20 20 20 20  ord.lower().    
0420: 20 20 20 20 69 66 20 73 57 6f 72 64 20 69 6e 20      if sWord in 
0430: 5f 64 57 6f 72 64 3a 0a 20 20 20 20 20 20 20 20  _dWord:.        
0440: 20 20 20 20 72 65 74 75 72 6e 20 5f 6c 53 65 74      return _lSet
0450: 5b 5f 64 57 6f 72 64 5b 73 57 6f 72 64 5d 5d 0a  [_dWord[sWord]].
0460: 20 20 20 20 72 65 74 75 72 6e 20 5b 5d 0a 0a 0a      return []...
0470: 64 65 66 20 73 65 6c 65 63 74 53 69 6d 69 6c 20  def selectSimil 
0480: 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e  (sWord, sPattern
0490: 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 20 61  ):.    "return a
04a0: 20 73 65 74 20 6f 66 20 77 6f 72 64 73 20 70 68   set of words ph
04b0: 6f 6e 65 74 69 63 61 6c 6c 79 20 73 69 6d 69 6c  onetically simil
04c0: 61 72 20 74 6f 20 73 57 6f 72 64 20 61 6e 64 20  ar to sWord and 
04d0: 77 68 6f 6d 20 50 4f 53 20 69 73 20 6d 61 74 63  whom POS is matc
04e0: 68 69 6e 67 20 73 50 61 74 74 65 72 6e 22 0a 20  hing sPattern". 
04f0: 20 20 20 69 66 20 6e 6f 74 20 73 50 61 74 74 65     if not sPatte
0500: 72 6e 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  rn:.        retu
0510: 72 6e 20 73 65 74 28 67 65 74 53 69 6d 69 6c 28  rn set(getSimil(
0520: 73 57 6f 72 64 29 29 0a 20 20 20 20 61 53 65 6c  sWord)).    aSel
0530: 65 63 74 20 3d 20 73 65 74 28 29 0a 20 20 20 20  ect = set().    
0540: 66 6f 72 20 73 53 69 6d 69 6c 20 69 6e 20 67 65  for sSimil in ge
0550: 74 53 69 6d 69 6c 28 73 57 6f 72 64 29 3a 0a 20  tSimil(sWord):. 
0560: 20 20 20 20 20 20 20 66 6f 72 20 73 4d 6f 72 70         for sMorp
0570: 68 20 69 6e 20 5f 64 4d 6f 72 70 68 2e 67 65 74  h in _dMorph.get
0580: 28 73 53 69 6d 69 6c 2c 20 5b 5d 29 3a 0a 20 20  (sSimil, []):.  
0590: 20 20 20 20 20 20 20 20 20 20 69 66 20 72 65 2e            if re.
05a0: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 2c  search(sPattern,
05b0: 20 73 4d 6f 72 70 68 29 3a 0a 20 20 20 20 20 20   sMorph):.      
05c0: 20 20 20 20 20 20 20 20 20 20 61 53 65 6c 65 63            aSelec
05d0: 74 2e 61 64 64 28 73 53 69 6d 69 6c 29 0a 20 20  t.add(sSimil).  
05e0: 20 20 72 65 74 75 72 6e 20 61 53 65 6c 65 63 74    return aSelect
05f0: 0a                                               .