2015-10-18 72 views
1

的补我有一本字典字母获取字典

letterstoProbabilityMap={"aaa":0.4,"bbb":0.7,"ccc":01} 

对此我有三个字母串和他们发生(我缩短了字典)的概率。 我正在根据一些训练数据分配这些概率。但我也想分配一个概率给我没有看到的字符串/键。例如“aaa”。 因为我所有的密钥都在set aaa-zzz中。 有没有一种快速的方法让我获得非赋值/补码并快速赋值。 (我明白我的问题是相当抽象的。)

编辑 值不固定它实际上是一个地方概率。 下面是我用来计算我知道的概率的代码片段 重点是我保留一个概率质量,然后我将它分配给我没见过的三个字母字符串(因为我知道所有字符串都在aaa-zzz之间)

for trigram in sorted(threeletter_counts.keys()): 
     numerator=threeletter_counts[trigram]+1 
     denominator=twoletter_counts[trigram[:2]]+30 
     prob=numerator/denominator 
+0

因此,有你有26 * 26门* 26门的钥匙? aaa到zzz? – Pynchia

+0

BTW 0.4 + 0.7 + ...大于1.0 – Pynchia

+0

不完全我有一个相对随机数量的键之间aaa-zzz我想通过字典获得找出那些我没有哪些是在集aaa-zzz并分配一个值。我基本上为我的训练数据中没有的值进行拉平平滑处理 – NeptuneGamer

回答

3

你可以去通过所有字符串,并使用setdefault

for letters in itertools.product(string.ascii_lowercase, repeat=3): 
    letterstoProbabilityMap.setdefault(''.join(letters), 
             computeMissingProbability(letters)) 

但如果计算是昂贵的,并会经常去浪费,因为大多数键已经存在,最好先检查一下先:

for letters in itertools.product(string.ascii_lowercase, repeat=3): 
    key = ''.join(letters) 
    if key not in letterstoProbabilityMap: 
     letterstoProbabilityMap[key] = computeMissingProbability(letters) 

或者,也许使用defaultdict,是否适合你:

fullMap = collections.defaultdict(lambda: 0.123, letterstoProbabilityMap) 

如果默认值就是0.0:

fullMap = collections.defaultdict(float, letterstoProbabilityMap) 
+0

但我想这只会使用固定值? – NeptuneGamer

+0

'defaultdict'只是固定值,是的。使用'setdefault',你可以计算出一个基于字母的值,但如果代价很高并且大部分键都已经存在了,那么你最好先检查键是否存在,然后如果不存在就像正常那样分配。 –

+0

不错只是出于兴趣,他们会添加非字母字符的方式吗? – NeptuneGamer