2013-04-27 3 views
2

Я пытаюсь найти вхождения одного списка слов в другой список слов. Мой код выглядит следующим образом:Неверные результаты подсчета частоты

for cat, text2 in posts: 
words=wordpunct_tokenize(text2) 
for word in words: 
    if word in top: 
     counter[word]+=1 

print counter 

Слова выглядит следующим образом: [("Post1", "post1" ,"post1"), ("post2","post2), ("post3")] сверху выглядит следующим образом "Post1, Post2, Post3" Ожидаемый результат будет:

{post1: 3} 
{post2, 2} 
{post3, 1} 

однако выход теперь я получаю:

{'post1': 3}) 
{'post2': 2, 'post1': 3}) 
{'post3': 1, 'post2': 2, 'post1': 3}) 

Похоже, что программа добавляет слова из предыдущей строки в следующий, кто-нибудь знает, как я могу это исправить?

+1

Вы уверены, что в отступлении? Счетчик вне цикла? –

+0

Вы правы, «счетчик печати» должен находиться внутри цикла, это кажется потерянным при вставке его здесь. – Shifu

+0

@NipunBatra I второй. @Nikolaas Я думаю, что код делает то, что вы ему рассказываете. Где вы инициализируете 'counter'? Поскольку 'counter' обновляется для каждой записи в' posts', ее необходимо повторно инициализировать в пределах одного цикла (т. Е. Цикл 'for ... in posts:'); в противном случае изменения предыдущей итерации цикла будут сохранены для следующей итерации. – user

ответ

2

Подсказка: есть класс в Python, что уже делает то, что вы хотите, это называется Counter и это в collections модулы:

from collections import Counter 
c = Counter() 
for cat, text2 in posts: 
    c.update(word for word in wordpunct_tokenize(text2) if word in top) 

В конце концов, переменная c будет содержать счетчик частоты слова найдены.

+0

Проблема в том, что он учитывает все вхождения любых слов в сообщениях, мне нужно, чтобы они учитывали только слова, которые находятся сверху. Спасибо, что посмотрели на это! – Shifu

+1

Извините, я просто это понял. Я обновил свой ответ! –

+1

Спасибо, что это было здорово. – Shifu

Смежные вопросы