2016-10-28 5 views
0

Я пытаюсь обрабатывать некоторые твиты с помощью Python, и я пытаюсь сделать подсчет слов из самых популярных слов, содержащихся в 7 разных твитах. У меня есть файл настройки, каждый твит объект JSON на своей собственной линии, и когда я пытаюсь распечатать каждый твит с помощью следующих, она прекрасно работает:Python - только чтение последней строки файла в определенных обстоятельствах

with open(fname, 'r') as f: 
for line in f: 
    tweet = json.loads(line) # load it as Python dict 
    print(json.dumps(tweet, indent=4)) 

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

with open(fname, 'r', encoding='utf8') as f: 
count_all = Counter() 
# Create a list with all the terms 
terms_stop = [term for term in tokens if term not in stop] 
for line in f: 
    # Update the counter 
    count_all.update(terms_stop) 
# Print the first 5 most frequent words 
print(count_all.most_common(5)) 

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

Следующий код предназначен для того, чтобы увидеть, какие слова чаще всего группируются вместе. Он производит 5 случайно сгруппированных слов из последнего твита, при этом счетчик всего 1, что означает, что он только читает последний твит (один раз) и ни один из других твитов.

with open(fname, 'r', encoding='utf8') as f: 
count_all = Counter() 
# Create a list with all the terms 
terms_stop = [term for term in tokens if term not in stop] 
# Import Bigrams to group words together 
terms_bigram = bigrams(terms_stop) 
for line in f: 
    # Update the counter 
    count_all.update(terms_bigram) 
# Print the first 5 most frequent words 
print(count_all.most_common(5)) 

Формат моего файла JSON выглядит следующим образом:

{"created_at":"Tue Oct 25 11:24:54 +0000 2016","id":4444444444,.....} 
{"created_at":..... } 
{etc} 

Помощь будет наиболее ценится! Большое спасибо заранее.

ОБНОВЛЕНИЕ: Не знаю, как я пропустил его, но спасибо за помощь всем! Я забыл включить 'line' в мой цикл for. Вот рабочий код:

with open(fname, 'r', encoding='utf8') as f: 
count_all = Counter() 
for line in f: 
    tweet = json.loads(line) 
    tokens = preprocess(tweet['text']) 
    # Create a list with all the terms 
    terms_stop = [term for term in tokens if term not in stop] 
    # Update the counter 
    count_all.update(terms_stop) 
# Print the first 5 most frequent words 
print(count_all.most_common(5)) 

Мне просто пришлось объединить токенизатор со словом.

+0

Правильно ли отпечаток? – cdarke

ответ

1

Может быть, я что-то отсутствует, но вы никогда не использовать линию в для цикла:

for line in f: 
    # Update the counter 
    count_all.update(terms_bigram) 

так что вы просто перебираете линии, делающие то же самое для каждой строки.

+0

Работа! Спасибо! Я отредактирую свой оригинальный вопрос с рабочим решением. –

0

Попробуйте прочитать файл:

with open(fname) as d: 
    tweet = json.load(d) 

Если не работают, разместить более подробную информацию о формате данных файла.

Новое обновление:

with open(fname) as d: 
    data = d.readlines() 

tweet = [json.loads(x) for x in data] 

Это даст вам список словарей (в формате JSON)

+0

Это дает ошибку - JSONDecodeError: Дополнительные данные: строка 2 столбца 1. Я отредактирую свое оригинальное сообщение относительно формата данных файла. Спасибо за вашу помощь. –

+0

Проверить новое обновление – Wonka