我有一个字典字母
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 :(得分: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)