Source code for tryalgo.predictive_text
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""\
Predictive text for mobile phones
jill-jenn vie et christoph durr and louis abraham - 2014-2019
"""
__all__ = ["predictive_text", "propose"]
# snip{
t9 = "22233344455566677778889999"
# abcdefghijklmnopqrstuvwxyz mapping on the phone
def letter_to_digit(x):
""":returns: the digit correspondence for letter x"""
assert 'a' <= x <= 'z'
return t9[ord(x) - ord('a')]
def code_word(word):
""":returns: the digit correspondence for given word"""
return ''.join(map(letter_to_digit, word))
[docs]
def predictive_text(dic):
"""Predictive text for mobile phones
:param dic: associates weights to words from [a-z]*
:returns: a dictionary associating to words from [2-9]*
a corresponding word from the dictionary with highest weight
:complexity: linear in total word length
"""
# total_weight[p] = total weight of words having prefix p
total_weight = {}
for word, weight in dic:
prefix = ""
for x in word:
prefix += x
if prefix in total_weight:
total_weight[prefix] += weight
else:
total_weight[prefix] = weight
# prop[s] = prefix to display for s
prop = {}
for prefix in total_weight:
code = code_word(prefix)
if (code not in prop
or total_weight[prop[code]] < total_weight[prefix]):
prop[code] = prefix
return prop
[docs]
def propose(prop, seq):
"""wrapper to access a dictionary even for non-present keys"""
if seq in prop:
return prop[seq]
return None
# snip}