Взятие двух значений из двух списков кортежей и умножение - PullRequest
0 голосов
/ 20 февраля 2019

Я вычисляю TD IDF из списка кортежей.Я рассчитал значение TF, и оно сохраняется в списке кортежей, и я вычислил значение IDF, которое также сохраняется в списке кортежей.Например:

>>print(tf)

[(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)

Затем

>>print(idf

[(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)

Теперь я хочу умножить значение 0.00364 на 2.43854, а затем 0.001821 на 2.739, чтобы вывод был в любом формате таким образом: word, td*idf

Ofc это всего лишь два значения из многих, но я не уверен, как мне перебрать оба списка, сохраняя при этом «вычисленное значение» в слове.

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Попробуйте:

tf =[(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]
idf= [(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)]
output = [(i[0],i[1]*j[1]) for i,j in zip(tf,idf)]

на выходе будет:

 [(('0', 'CD'), 0.008883578684102406), (('09:00', 'CD'), 0.004990113560018382)]
0 голосов
/ 20 февраля 2019

Просто используйте понимание списка.Имейте в виду, что если порядок слов отключен, вы прекратите добавлять неправильный td * idf к неправильному слову.Чтобы избежать несоответствия значений словам, возможно, вы сначала хотите sort список кортежей.Однако, если длины tf и idf различны, более длинный список будет обрезан, чтобы соответствовать более короткому.Это также будет проблематично, поскольку слова могут не совпадать, если имеется дополнительный кортеж, смещающий каждый кортеж на один индекс вниз.

result = [(tup1[0], tup1[1]*tup2[1]) for tup1, tup2 in zip(tf,idf)]
0 голосов
/ 20 февраля 2019

Может преобразовать их обоих в диктовку:

tf = [(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]

tf_dict = dict(tf)
print(tf_dict) 
>> {('0', 'CD'): 0.0036429872495446266, ('09:00', 'CD'): 0.0018214936247723133}

idf = [(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)]
idf_dict = dict(idf)


# now you have same keys in both dicts
res = {k: v*idf_dict[v] for k,v in tf_dict.items()}
0 голосов
/ 20 февраля 2019

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

tf = [(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]
idf = [(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)]

[(t1, v1*v2) for (t1, v1), (t2, v2) in zip(tf,idf)]

Вывод

[(('0', 'CD'), 0.008883578684102406), (('09:00', 'CD'), 0.004990113560018382)]

Обновление

Если элементы в кортежах не всегда находятся в одном и том же порядке, например:

tf = [(('0', 'CD'), 0.0036429872495446266), (0.0018214936247723133, ('09:00', 'CD'))]

, вы можете заказать их, используя:

[(t,f) if isinstance(t, tuple) else (f,t) for t, f in tf]
# [(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]
...