Как я могу изменить свой цикл for, чтобы он не останавливался всего после одной итерации?

#python #loops #nlp #n-gram

Вопрос:

Я пытаюсь построить короткую программу, которая проходит через отдельные блоки текста, выделяет слова, которые являются существительными, обрабатывает каждое из этих существительных индивидуально с помощью движка Google N-граммов через API и вставляет результаты (насколько часто это существительное встречается в историческом корпусе N-граммов) в файл .csv.

Я успешно сделал это для одного блока текста, но я изо всех сил пытаюсь заставить свой код «перейти» ко второму. Сложность (по крайней мере, для меня) заключается в том, что задействованы два цикла for, один для указания блока текста, а другой для указания слова, которое будет обработано с помощью механизма N-граммов. Я почти уверен, что моя проблема как-то связана с этим/отступом, но я ни за что на свете не могу понять, что не так…!

Ниже приведен код в его нынешнем виде. Вывод, который я получаю в формате .csv, верен, но, как я уже сказал, в нем перечислены только results_noun_final для существительных в первой строке/блоке текста в моем вводе. Я также вставил данные csv ниже.

Любые советы очень ценятся!

Спасибо.

     DOTONET_input = csv.reader(csvfile)
    next(DOTONET_input)

    for row in DOTONET_input:
        definition = str(row[2]).lower()
        dot_code = str(row[0])
        dot_title = str(row[1]).lower()
        fullwordlist = dotonet.stripNonAlphaNum(definition)
        wordlistnonum = [x for x in fullwordlist if not any(c.isdigit() for c in x)]
        wordlist = dotonet.removeStopwords(wordlistnonum, dotonet.stopwords)
        postagged = nltk.pos_tag(wordlist)
        postag = [lis[1] for lis in postagged]
        wordpostag = {wordlist[i]: postag[i] for i in range(len(wordlist))}
        #print(wordpostag)
        nouns = {key: val for key, val in wordpostag.items() if val == "NN" or val == "NNS" or val == "NNP" }
        nounslist = list(nouns.keys())
        #print(nouns)
        print(nounslist)
        #print(postag)

        for word in nounslist:

            url =f"https://books.google.com/ngrams/json?content={word}amp;year_start=1965amp;year_end=1975amp;corpus=26amp;smoothing=3"
            resp = requests.get(url)

            if resp.ok:
                results = json.loads(resp.content)[0]
                #print(results)
                results_clean = {key: val for key, val in results.items() if key == "ngram" or key =="timeseries"}
                #print(results_clean)
                timeseries = {key: results_clean[key] for key in results_clean.keys() amp; {'timeseries'}}
                timeseriesvalues= list(timeseries.values())
                timeseriesmean=np.mean(timeseriesvalues)
                #print(timeseriesmean)
                ngramsonly = {key: results_clean[key] for key in results_clean.keys() amp; {'ngram'}}
                ngramsvalues = list(ngramsonly.values())
                results_nouns_final={"dot_code": dot_code, "dot_title": dot_title, "word": ngramsvalues, "occurrence_mean": timeseriesmean}

                print(results_nouns_final)

                field_names=['dot_code', 'dot_title', 'word', 'occurrence_mean']
                with open("Measuring_specialization.csv", 'a') as csvfile:
                    writer = csv.DictWriter(csvfile, fieldnames=field_names)
                    writer.writerows([results_nouns_final])
                continue
 

Ввод CSV, который я использую:

ТОЧечный код,точечный заголовок,точечное определение 001.061-010,АРХИТЕКТОР,»Исследует, планирует, проектирует и управляет строительными проектами для клиентов, применяя знания проектирования, строительных процедур, зонирования и строительных норм и строительных материалов. Консультируется с клиентом для определения функциональных и пространственных требований к новой структуре или реконструкции, а также подготавливает информацию о дизайне, технических характеристиках, материалах, цвете, оборудовании, сметных затратах и сроках строительства. Планирует макет проекта и объединяет инженерные элементы в единый дизайн для рассмотрения и утверждения клиентом. Готовит масштабные чертежи и контрактную документацию для строительных подрядчиков. Представляет интересы клиента при получении заявок и заключении контрактов на строительство. Управляет строительными контрактами и проводит периодическое наблюдение на месте за работами во время строительства для контроля за соблюдением планов. Может готовить руководства по эксплуатации и техническому обслуживанию, исследования и отчеты. Может использовать программное обеспечение и оборудование для компьютерного проектирования для подготовки проектов и планов. Может руководить деятельностью работников, занимающихся подготовкой чертежей и технической документации». 001.261-010,СОСТАВИТЕЛЬ: АРХИТЕКТУРНЫЙ,»Готовит подробные чертежи архитектурных проектов и планов зданий в соответствии со спецификациями, эскизами и черновиками, предоставленными АРХИТЕКТОРОМ 001.061-010. Рисует грубые и подробные эскизы, чертежи и планы в масштабе [СОСТАВИТЕЛЬ> Название мастера]».

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

1. Отступ и структура вложенных петель кажутся прекрасными. continue в самом конце это не нужно, но это не создаст проблем. Возможно, вы захотите проверить, проходят ли все запросы к Google API, так как код будет незаметно пропускать слово, если запрос завершится неудачно. В противном случае трудно сказать, что может быть не так без выборки входных данных.

2. Привет @bb1 . Спасибо за ваше предложение. Я проверил, была ли проблема с запросом, проходящим через Google API, запустив по отдельности второй блок текста, и это дало мне ожидаемые результаты. Таким образом, проблема, по-видимому, возникает именно тогда, когда в DOT_input есть второй блок текста/строки для перехода, а не с самим этим вторым блоком. Я добавил образец входных данных CSV в сообщение, на случай, если вы/кто-нибудь сможет взглянуть поближе. Если да, то заранее огромное спасибо!

3. Я не уверен, что это источник проблемы, но я запустил код (с небольшими изменениями), используя предоставленные вами данные, и заметил, что несколько запросов на сервер Google были отклонены. Вероятно, их отправляют слишком быстро. Попробуйте добавить паузу (скажем, 1 секунду) перед выполнением каждого запроса. Когда я это сделал, все запросы прошли. Вы также можете добавить код, который повторяет запрос, если он завершается неудачно, или, по крайней мере, выдает некоторую обратную связь о том, что это произошло.

4. Привет — еще раз спасибо за ваше предложение. Это может показаться невежественным вопросом, но как бы я добавил паузу в код?

5. Добавьте from time import sleep в начале вашего кода. Затем во внутреннем for цикле, после того как вы сделаете запрос, добавьте sleep(1) . Это остановит программу на 1 секунду.