drime

French rhyme dictionary with web and CLI interface
git clone https://a3nm.net/git/drime/
Log | Files | Refs | README

frhyme.py (1477B)


      1 #!/usr/bin/env python3
      2 
      3 """Try to guess the last few phonemes of a French word, by a lookup in a
      4 precompiled trie"""
      5 
      6 import os
      7 import json
      8 import sys
      9 from pprint import pprint
     10 
     11 DEFAULT_NBEST=5
     12 
     13 f = open(os.path.join(os.path.dirname(
     14   os.path.realpath(__file__)), 'frhyme.json'))
     15 trie = json.load(f)
     16 f.close()
     17 
     18 def to_list(d, rev=True):
     19   return [(d[a], a[::-1] if rev else a) for a in d.keys()]
     20 
     21 def trie2list(trie):
     22   v, c = trie
     23   if c == {}:
     24     return to_list(v)
     25   else:
     26     d = {}
     27     for child in c.keys():
     28       l = trie2list(c[child])
     29       for x in l:
     30         if x[1] not in d.keys():
     31           d[x[1]] = 0
     32         d[x[1]] += x[0]
     33     return to_list(d, False)
     34 
     35 def add_dict(a, b):
     36   return dict( [ (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) ] )
     37 
     38 def do_lookup(trie, key):
     39   if len(key) == 0 or key[0] not in trie[1].keys():
     40     return trie2list(trie)
     41   return do_lookup(trie[1][key[0]], key[1:])
     42 
     43 def nbest(l, t):
     44   l = sorted(l)[-t:]
     45   l.reverse()
     46   return l
     47 
     48 def lookup(key, n=DEFAULT_NBEST):
     49   """Return n top pronunciations for key"""
     50   return nbest(do_lookup(trie, key[::-1] + '  '), n)
     51 
     52 def wrap_lookup(line, n):
     53   pprint(lookup(line.lower().strip(), n))
     54 
     55 if __name__ == '__main__':
     56   n = DEFAULT_NBEST
     57   if len(sys.argv) >= 2:
     58     n = int(sys.argv[1])
     59   if len(sys.argv) > 2:
     60     for arg in sys.argv[2:]:
     61       wrap_lookup(arg, n)
     62   else:
     63     while True:
     64       line = sys.stdin.readline()
     65       if not line:
     66         break
     67       wrap_lookup(line, n)
     68