#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 секунду.