Умножение значений из словаря, если он существует в списке - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь вычислить некоторые вероятности предложения.

У меня есть словарь, который содержит некоторые значения для разных букв:

{'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889}

У меня есть отдельные предложения в списке, такие как:

['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

То, что я пытаюсь сделать, это некоторые вычисления вероятности, так что он ищет предложение в списке и умножает значения, например, aabc будет 0.2777*0.2777*0.3333*0.388888

Как мне искать в этом списке каждую независимую строку и делать это умножение?

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

Для этого вы можете использовать списки и цикл for.

def prob(string, prob):
    out = 1;
    probs = [prob[char] for char in string]
    for x in probs:
        out *= x;
    return out

prob - словарь вероятностей, а string - строка.in перебирает каждый символ в строке.

0 голосов
/ 16 ноября 2018

Вы можете использовать двойной цикл for.Внешний for будет перебирать список предложений, а внутренний for может перебирать каждую букву в предложении.Синтаксис Python для цикла - for item in iterable_object: <code to run>.Попробуйте использовать эту информацию и посмотрите, как далеко вы можете получить.

0 голосов
/ 16 ноября 2018

Вы можете использовать reduce, чтобы уменьшить предложение до его окончательной вероятности (обратите внимание, что если у персонажа нет вероятности, я просто использую 1 для умножения):

from functools import reduce

probs = {'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889}
sentences = ['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

result = [reduce(lambda acc, curr: probs.get(curr, 1) * acc, s, 1) for s in sentences]
print(result) 
# [0.010002286236854138, 0.004667733577198597, 0.0360082304526749, 0.03600823045267489, 0.09259259259259259]
0 голосов
/ 16 ноября 2018

Это довольно не причудливый способ сделать это:

values = {'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889, 'd':0.1234, 'e':0.5678}

strings = ['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

for string in strings:
  product = 1
  for char in string:
    product *= values[char]

  print(product)

РЕДАКТИРОВАТЬ:

Если мы хотим использовать проверку, если в словаре есть значения, мы можем сделатьи используйте unk вместо:

values = {'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889}

strings = ['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

unk = 0.05

for string in strings:
  product = 1
  for char in string:
    if char in values:
      product *= values[char]
    else:
      product *= unk

  print(product)
...