source: CMIP6dreqbuild/trunk/src/framework/titles.py @ 1291

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/titles.py@1291
Revision 1291, 7.8 KB checked in by mjuckes, 11 months ago (diff)

01.00.29 candidate

Line 
1
2import collections, autocorrect, shelve
3import re
4from dreqPy import dreq
5dq = dreq.loadDreq()
6
7re_nm = re.compile( '[0-9]+(nm|m|hPa)' )
8
9class BuildWl(object):
10  def __init__(self):
11    self.cc = collections.defaultdict( set )
12  def add(self,k,v):
13    self.cc[k].add(v)
14
15
16words = collections.defaultdict( set )
17wl = collections.defaultdict( set )
18def getstuff():
19  khyzz = collections.defaultdict( set )
20  for i in dq.coll['var'].items:
21    for w in i.title.split():
22      words[w].add( i.title )
23      wl[w.lower()].add( i.title )
24
25  bl = dict()
26  for x in range(1,8):
27    bl[x] = [w for w in words if len(w) == x]
28
29  khy = [k for k in words if k.find('-') != -1]
30  for k in khy:
31    this = k.replace('-',' ').lower()
32    for i in dq.coll['var'].items:
33      if i.title.lower().find( this ) != -1:
34        khyzz[k.lower()].add( i.title )
35  return words, wl, khy, khyzz, bl
36 
37
38special = dict()
39##Articles: a, an, the
40## Coordinating Conjunctions: and, but, or, for, nor, etc.
41## Prepositions (fewer than five letters): on, at, to, from, by, etc` ... per
42
43## that: possibly a conjunction, but not likely in this context
44
45lower = dict()
46
47lower[1] = ['a']
48lower[2] = ['as', 'at', 'by', 'in', 'nm', 'of', 'on', 'or', 'to']
49lower[3] = [ 'and', 'any', 'but', 'for',  'non', 'nor', 'not', 'out', 'per', 'the']
50lower[4] = ['into', 'onto', 'over', 'than', 'with', 'from']
51lower[5] = ['neither','either','degree']
52
53special[1] = ['X', 'Y', 'T', 'O', 'D']
54special[2] = ['10', '1H', '1m', '2H', '2m', '3D', '50', 'C3', 'C4', 'CO', 'H2', 'N2', 'NO', 'Ox', 'O2', 'O3', 'OD', 'OH', 'XY', 'pH']
55special[3] = ['100', '10m', '13C', '14C', '17O', '18O', '20C', '440', '443', '500', '550', '850', '865', '870', 'CH4', 'CO2', 'CWD', 'DMS', 'HCl', 'HO2', 'N2O', 'NH3', 'NH4', 'NHx', 'NO2', 'NO3', 'NOx', 'NOy', 'NPP', 'O1D',  'PAN', 'PBL', 'PO2', 'SF6', 'SO2', 'SO4', 'SWE', 'TEM', 'TOA', 'hPa']
56special[4] = ['1000', '100m', '300m', '700m', 'C2H2', 'C2H6', 'C3H6', 'C3H8', 'CFAD', 'HNO3', 'MISR', 'PCO2', 'PM10' ]
57special[5] = ['10hPa', '13CO2', '14CO2', '2000m', '4XCO2', '550nm', 'CFC11', 'CFC12', 'DI14C', 'ISCCP', 'MODIS', 'NMVOC', 'PM1.0', 'PM2.5', 'UGRID']
58special[6] = ['CFC113', 'HCFC22'] 
59special[7] = ['CALIPSO', 'PARASOL']
60special[8] = ['(=dp/dt)', '13Carbon', '14Carbon', 'CH3COCH3', 'CloudSat']
61
62people = set( ['Leovy', 'Hibler', 'Wesely', 'Eliassen', 'Vaisala', 'Redi', 'Boussinesq' ] )
63vocab = set( ['Dianeutral', 'Diazotrophs', 'Downwelling', 'Epineutral', 'Landuse', 'Longwave', 'Meltpond', 'Mesozooplankton', 'Methanogenesis', 'Methanotrophy', 'Microzooplankton', 'Needleleaf', 'Picophytoplankton', 'Streamfunction', 'Submesoscale', 'Thermosteric'] )
64
65class Specials(object):
66  def __init__(self):
67    self.ll = set()
68    self.uu = set()
69    for k,v in lower.items():
70      for x in v:
71         self.ll.add(x)
72
73    for k,v in special.items():
74      for x in v:
75         self.uu.add(x)
76
77    hyphen02 = set(['Run-off','Air-to-Sea','2D-Field','3D-Field'])
78    self.ehy = dict()
79    for k in hyphen02:
80      self.ehy[ k.lower() ] = k
81
82specials = Specials()
83
84re_x = re.compile( '([;:,\-\(\)"\'\_+*><=/.\[\]])' )
85re_n = re.compile( '[0-9]\.*[0-9]' )
86re_chem = re.compile( '^(((C|N|O|Br|F|Fe|H|Ca|Cl|Ch|S|Si)[0-9xy]{0,4}){1,6})$' )
87
88def cleantext(ss):
89  res = set( re_x.findall( ss ) )
90  print res
91  for x in res:
92    ss = ss.replace( x, ' ' )
93  print ss
94  ss = ' '.join( [x.strip() for x in ss.split() ] )
95  return ss
96 
97
98def mycap(s):
99  if s in specials.ll:
100    return s.lower()
101  elif s in specials.uu:
102    return s
103  elif re_nm.match(s):
104    return s
105  else:
106    return s.capitalize()
107
108def getFrag(name):
109 class Frag(object):
110  words = collections.defaultdict( set )
111  wl = collections.defaultdict( set )
112  wl2 = BuildWl()
113  def __init__(self,s,ttl):
114    self.prf = ''
115    self.sfx = ''
116    if s[0] in ['(',',','.','"']:
117      self.prf = s[0]
118    if s[-1] in [')',',','.','"',';']:
119      self.sfx = s[-1]
120    self.word = s[len(self.prf):len(s)-len(self.sfx)]
121    self.words[self.word].add( ttl )
122    self.ttl = ttl
123 
124  def cap(self):
125    if self.word.find( '-' ) != -1:
126      if self.word.lower() in specials.ehy:
127        this = specials.ehy[self.word.lower()]
128      else:
129        this = '-'.join( [mycap(x) for x in self.word.split('-')] )
130    else:
131      this = mycap( self.word )
132     
133    if len(this) == 1:
134      print 'L1: ',self.word, this
135
136    self.wl[this].add( self.ttl )
137    self.wl2.add(this, self.ttl )
138    self.styled = this
139
140    return ''.join( [self.prf,this,self.sfx] )
141
142  def low(self):
143    self.wl[self.word.lower()].add( self.ttl )
144    self.wl2.add(self.word.lower(), self.ttl )
145    self.styled = self.word.lower()
146    return ''.join( [self.prf,self.word.lower(),self.sfx] )
147
148  def full(self,save=True):
149    if save:
150      self.wl[self.word].add( self.ttl )
151      self.wl2.add(self.word, self.ttl )
152      self.styled = self.word
153    return ''.join( [self.prf,self.word,self.sfx] )
154
155 Frag.__name__ = name
156 return Frag
157
158class TitleCase(object):
159  def __init__(self):
160    self.frag = getFrag( 'FragVar' )
161    self.fragd = getFrag( 'FragDesc' )
162    self.sh = shelve.open( 'inSh/titleCase' )
163    self.desc = set()
164    self.chem = set()
165    specials = set()
166    lowers = set()
167    for k in special:
168      for x in special[k]:
169        specials.add(x)
170    for k in lower:
171      for x in lower[k]:
172        lowers.add(x)
173
174    ee = dict()
175    for i in dq.coll['var'].items:
176      parts = [self.frag(x,i.title) for x in i.title.split() ]
177      for x in cleantext( i.description ).split():
178        if len( re_n.findall(x) ) == 0:
179          if re_chem.match(x) == None:
180            y = self.fragd(x,i.description)
181            y.low()
182            self.desc.add( y.word.lower() )
183          else:
184            self.chem.add( x )
185
186      pold = [x.full(save=False) for x in parts]
187      pnew = []
188      if parts[0].word in specials:
189        pnew.append( parts[0].full() )
190      else:
191        pnew.append( parts[0].cap() )
192
193      for p in parts[1:]:
194        if p.word in specials:
195          pnew.append( p.full() )
196        elif p.word.lower() in lowers:
197          pnew.append( p.low() )
198        else:
199          pnew.append( p.cap() )
200        if p.styled == 'ice':
201          print 'ICE:: ',parts
202        elif p.word.lower() == 'ice':
203          print 'ice: ',p.word,p.styled, parts
204
205      if pold != pnew:
206         ee[tuple(pnew)] = pold
207
208
209   
210    for l in sorted( ee.keys() ):
211         print '----------------'
212         old = ' '.join(ee[l])
213         print old
214         new = ' '.join(l)
215         print new
216         self.sh[old] = new
217
218    print 'NUMBER OF CHANGES: ', len(ee)
219
220  def list(self):
221    for k in sorted(special.keys()):
222      print k, ':: ',' '.join( sorted( special[k] ) )
223    for k in sorted(lower.keys()):
224      print k, ':: ',' '.join( sorted( lower[k] ) )
225     
226
227class MyChecker(object):
228  def __init__(self,tag,frag,full=True):
229    self.full = full
230    self.tag = tag
231    self.frag = frag
232    self.ns = self.nc = self.ne = 0
233    self.known = autocorrect.word.KNOWN_WORDS.union( [x.lower() for x in vocab] ).union( (x.lower() for x in people) )
234
235
236  def check(self,k,key=None):
237    if key == None:
238      key = k
239    if k in specials.uu:
240      self.ns += 1
241    elif k.lower() in self.known:
242      self.nc += 1
243    else:
244      if self.full:
245        print '%sUNKNOWN: ' % self.tag, k, self.frag.wl[key]
246      else:
247        print '%sUNKNOWN: ' % self.tag, k, list( self.frag.wl[key] )[0][:80]
248      self.ne += 1
249
250def run():
251  tc = TitleCase()
252  tc.list()
253
254  myCheck = MyChecker('v::', tc.frag)
255
256  for k in sorted( tc.frag.wl.keys() ):
257    if k.find('-') != -1:
258      for x in k.split( '-'):
259        myCheck.check(x,key=k)
260    else:
261      myCheck.check(k)
262
263  myCheck = MyChecker( 'd::', tc.fragd, full=False)
264  for k in sorted( tc.fragd.wl.keys() ):
265    if k.find('-') != -1:
266      for x in k.split( '-'):
267        myCheck.check(x,key=k)
268    else:
269      myCheck.check(k)
270
271  print myCheck.ns, myCheck.nc, myCheck.ne
272  tc.sh.close()
273  return tc
274
275if __name__ == "__main__":
276  tc = run()
277
Note: See TracBrowser for help on using the repository browser.