перебрать список кортежей - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь извлечь главные слова из тематической модели и напечатать слова следующим образом

test_topic = [(0, [('pizza', 0.13345005), ('notch', 0.08421454), ('weekend', 0.049728252), ('fair', 0.035808913), ('thank', 0.034821175), ('girlfriend', 0.03274733), ('seen', 0.029821698), ('patient', 0.026760893), ('sucked', 0.026622303), ('skip', 0.026458882), ('san', 0.024171583), ('luckily', 0.021163197), ('god', 0.020423584), ('stellar', 0.016307), ('improve', 0.01599736)]),(1, [('ingredients', 0.019390099), ('opening', 0.018882414), ('choice', 0.013553904), ('summer', 0.01068847), ('minute', 0.010665418), ('asian', 0.010231626), ('money', 0.010114605), ('near', 0.00918076), ('dined', 0.008954125), ('odd', 0.0087335445), ('14', 0.008653159), ('noise', 0.008145982), ('place', 0.008041287), ('live', 0.0075712656), ('definitely', 0.007468632)]),(2, [('pork', 0.022275768), ('chicken', 0.022122012), ('ribs', 0.021125246), ('strips', 0.018241541), ('green', 0.014933401), ('tomato', 0.013756915), ('cheese', 0.013535802), ('juice', 0.012698732), ('soup', 0.012126858), ('good', 0.011680452), ('sauce', 0.011264608), ('grilled', 0.010635098), ('favorite', 0.010507565), ('fat', 0.009539875), ('meat', 0.009525091)])]

for i, item in enumerate(test_topic):
    for weight, term in item:
        print(term)

Однако я получаю эту ошибку

TypeError: объект 'int' не может быть повторен

Хотя print(item) возвращает

0 [('pizza', 0.13345005), ('notch', 0.08421454), ('выходные', 0.049728252), ('fair', 0.035808913), ('thank', 0.034821175), ('girlfriend', 0.03274733), ( «seen», 0,029821698), («Patient», 0,026760893), («Sucked», 0,026622303), («Skip», 0,026458882), («San», 0,024171583), («lucky», 0,021163197), («God» , 0,020423584), («звездный», 0,016307), («улучшение», 0,01599736)]

print(type(item)) возвращает int

Может кто-нибудь пролить свет на то, что я иду не так? *

Edit:

Контекст проблемы заключается в извлечении тем из корпуса рецензирования. Я использую LdaModel.show_topics , чтобы дать мне темы рассылки и из тех, которые я хочу понять главные термины. Так что я на самом деле получаю list of {str, tuple of (str, float)}.

Ответы [ 4 ]

1 голос
/ 19 мая 2019

Первый элемент в test_topic - это 0, то есть int.Вы не можете повторить это.

Если я правильно понимаю, у вас есть следующая вложенная коллекция:

(0, [(t1, w1), (t2, w2)...])
        ^ you want ^ these

Соответственно, вам следует пропустить первый элемент (0), который дает вам один элемент tuple, содержащий list из (term, weight) tuples.Затем вы можете взять этот один элемент и пройти по нему:

for i, (term, weight) in enumerate(test_topic[1:][0]):
    # Note that you don't actually use i here...
    print(term)

Вывод:

pizza
notch
weekend
fair
thank
girlfriend
seen
patient
sucked
skip
san
luckily
god
stellar
improve
0 голосов
/ 19 мая 2019

Предполагая, что вы пытаетесь сделать что-то вроде следующего

test_topic = [('pizza', 0.13345005), ('notch', 0.08421454), ('weekend', 0.049728252), ('fair', 0.035808913), ('thank', 0.034821175), ('girlfriend', 0.03274733), ('seen', 0.029821698), ('patient', 0.026760893), ('sucked', 0.026622303), ('skip', 0.026458882), ('san', 0.024171583), ('luckily', 0.021163197), ('god', 0.020423584), ('stellar', 0.016307), ('improve', 0.01599736)]
for i, tup in enumerate(test_topic):
    print(i ,tup[0], tup[1])

в вашем случае tuple (0, [()]) -> tuple, имеющий 1-й элемент 0 2-й элемент список кортежей поэтому, когда вы перечисляете это в самом первом проходе, у вас есть я == 0 и пункт == 0

0 голосов
/ 19 мая 2019

Вы перечисляете tuple, поэтому ваш первый item равен 0.

Теперь вы не можете сделать это:

weight, term = 0

Поскольку вам нужен кортеж типа ('pizza', 0.13345005), чтобы вы могли сделать это:

weight, term = ('pizza', 0.13345005)

Вы не упомянули желаемый результат, но я не совсем уверен, что вам нужен enumarate!

И порядок кажется странным, разве это не должно быть term, weight?

Итак, мы можем сделать это:

test_topic = (
    0, 
    [
        ('pizza', 0.13345005), 
        ('notch', 0.08421454), 
        ('weekend', 0.049728252),
        ...
    ]
)

for item in test_topic[1]:
    term, weight = item
    print(term, weight)
output:
pizza 0.13345005
notch 0.08421454
weekend 0.049728252
...

Вам на самом деле не нужно item здесь, вы можете просто написать:

for term, weight in test_topic[1]:
    print(term, weight)

Однако, если вам нужно enumerate (по какой-то причине, о которой вы не упомянули), вы можете сделать это так:

for i, item in enumerate(test_topic[1]):
    term, weight = item
    print(f'{i}. The weight of {term} is {weight}')

output:
0. The weight of pizza is 0.13345005
1. The weight of notch is 0.08421454
2. The weight of weekend is 0.049728252
...
0 голосов
/ 19 мая 2019

Вы получите его, потому что первый элемент в вашем списке равен нулю:

for i, item in enumerate(test_topic[1:]):
...