def METHOD_NAME(self, properties, language, dictionaries=()):
    probs = []
    alternatives = []
    canonical_prob = properties.get('canonical_probability', 1.0)
    canonical = properties['canonical']
    alternatives.append(canonical)
    probs.append(canonical_prob)
    if 'abbreviated_probability' in properties:
        probs.append(properties['abbreviated_probability'])
        abbreviated = properties['abbreviated']
        assert isinstance(abbreviated, basestring)
        alternatives.append(abbreviated)
    if properties.get('sample', False) and 'sample_probability' in properties:
        sample_prob = properties['sample_probability']
        samples = set()
        for dictionary in dictionaries:
            phrases = self.sample_phrases.get((language, dictionary), {})
            samples |= set(phrases.get(canonical, []))
        if 'sample_exclude' in properties:
            samples -= set(properties['sample_exclude'])
        if samples:
            for phrase in samples:
                probs.append(sample_prob / float(len(samples)))
                alternatives.append(phrase)
        else:
            total = sum(probs)
            probs = [p / total for p in probs]
    try:
        check_probability_distribution(probs)
    except AssertionError:
        print 'values were: {}'.format(alternatives)
        raise
    return alternatives, probs