Ошибка типа: ‘in ‘ требует строку в качестве левого операнда, а не генератора в Python

#python

#python

Вопрос:

Я пытаюсь проанализировать данные твитов.

Моя форма данных выглядит следующим образом:

 59593936 3061025991 null null <d>2009-08-01 00:00:37</d> <s>amp;<a href="http://help.twitter.com/index.php?pg=kb.pageamp;amp;id=75" rel="nofollow"amp;>txtamp;</aamp;></s> <t>honda just recalled 440k accords...traffic around here is gonna be light...win!!</t> ajc8587 15 24 158 -18000 0 0 <n>adrienne conner</n> <ud>2009-07-23 21:27:10</ud> <t>eastern time (us amp;amp; canada)</t> <l>ga</l>
22020233 3061032620 null null <d>2009-08-01 00:01:03</d> <s>amp;<a href="http://alexking.org/projects/wordpress" rel="nofollow"amp;>twitter toolsamp;</aamp;></s> <t>new blog post: honda recalls 440k cars over airbag risk http://bit.ly/2wsma</t> madcitywi 294 290 9098 -21600 0 0 <n>madcity</n> <ud>2009-02-26 15:25:04</ud> <t>central time (us amp;amp; canada)</t> <l>madison, wi</l>
  

Я хочу получить общее количество твитов и количество твитов, связанных с ключевыми словами. Я подготовил ключевые слова в текстовом файле. Кроме того, я хочу получить текстовое содержимое твита, общее количество твитов, содержащих упоминание (@), ретвит (RT) и URL (я хочу сохранить каждый URL в другом файле).

Итак, я закодировал так.

 import time
import os

total_tweet_count = 0
related_tweet_count = 0
rt_count = 0
mention_count = 0
URLs = {}

def get_keywords(filepath, mode):
    with open(filepath, mode) as f:
        for line in f:
            yield line.split().lower()

for line in open('/nas/minsu/2009_06.txt'):
    tweet = line.strip().lower()

    total_tweet_count  = 1

    with open('./related_tweets.txt', 'a') as save_file_1:
        keywords = get_keywords('./related_keywords.txt', 'r')

        if keywords in line:
            text =  line.split('<t>')[1].split('</t>')[0]

            if 'http://' in text:
                try:
                    url = text.split('http://')[1].split()[0]
                    url = 'http://'   url

                    if url not in URLs:
                        URLs[url] = []
                    URLs[url].append('t'   text)

                    save_file_3 = open('./URLs_in_related_tweets.txt', 'a')
                    print >> save_file_3, URLs

                except:
                    pass

            if '@' in text:
                mention_count  =1

            if 'RT' in text:
                rt_count  = 1

            related_tweet_count  = 1

            print >> save_file_1, text

    save_file_2 = open('./info_related_tweets.txt', 'w')

print >> save_file_2, str(total_tweet_count)   't'   srt(related_tweet_count)   't'   str(mention_count)   't'   str(rt_count)

save_file_1.close()
save_file_2.close()
save_file_3.close()
  

Ниже приведены примеры ключевых слов

 Depression
Placebo
X-rays
X-ray
HIV
Blood preasure
Flu
Fever
Oral Health
Antibiotics
Diabetes
Mellitus
Genetic disorders
  

Я думаю, что в моем коде много проблем, но первая ошибка выглядит следующим образом:

Трассировка (последний последний вызов): файл «health_related_tweets.py «, строка 23, в если ключевые слова в строке: TypeError: ‘in’ требует строку в качестве левого операнда, а не генератора

Пожалуйста, помогите мне!

Комментарии:

1. Я думаю, вам нужно использовать регулярное выражение. Это инструмент, который нужно использовать, когда нужно извлечь данные из текста. См. Модуль re

Ответ №1:

Причина в том, что keywords = get_keywords(...) возвращает генератор. Логически размышляя об этом, ключевые слова должны быть списком всех ключевых слов. И для каждого ключевого слова в этом списке вы хотите проверить, есть ли оно в твите / строке или нет.

Пример кода:

 keywords = get_keywords('./related_keywords.txt', 'r')
has_keyword = False
for keyword in keywords:
  if keyword in line:
    has_keyword = True
    break
if has_keyword:
  # Your code here (for the case when the line has at least one keyword)
  

(Приведенный выше код будет заменен if keywords in line: )

Комментарии:

1. Я получил еще одну ошибку. (Трассировка (последний последний вызов): файл «health_related_tweets.py «, строка 25, в <module> для ключевого слова в keywords: File «health_related_tweets.py «, строка 13, в get_keywords yield line.split().lower() Ошибка атрибута: объект ‘list’ не имеет атрибута ‘lower’) Я подумал, что мне нужно преобразовать ключевые слова и твиты, которые будут проанализированы в нижнем регистре для синтаксического анализа. Поэтому я вставил «.lower» в свой код. Но это приводит к ошибке …. . Как я должен это исправить?

2. Опять же, это имеет смысл. line.split() выдаст вам список (строк), а lower() работает со строкой. Можете ли вы дать мне пример related_keywords.txt .

3. related_keywords.txt содержит такие слова: Депрессия у стоматолога Плацебо Рентген Рентген ВИЧ Предрасположенность к гриппу (они разделены на enter. Я имею в виду, что каждое слово, такое как ВИЧ и рентген, или фраза, такая как Boold preasure, записывается в строку. Поэтому я разделил его на «.split ()»)

4. Я поместил примеры ключевых слов в основной текст! Спасибо за вашу помощь!

5. Отлично. И в идеале вам не требуется функция разделения, потому что вы не хотите разделять слово типа «кровяное давление» на [«кровь», «давление»] . вы ищете целое слово в тексте.