Как запустить вложение для циклов асинхронно? - PullRequest
0 голосов
/ 24 июня 2019

Я хотел бы оценить список текстов, используя анализ настроений GCP. Для этого я уже написал модули, которые подготавливают все для анализа настроений (очистка, разбиение и т. Д.).

В результате у меня теперь есть фрейм данных Pandas, где каждый текст имеет свою собственную строку и где каждая строка имеет ячейку со списком слов на предложение в тексте.

В качестве примера, текст: «Мне нравится stackoverflow. Это очень полезно». будет выглядеть так (для простоты я опустил всю «очистку»:

Мне нравится stackoverflow. Это очень полезно. | [["I", "like", "stackoverflow"], ["It", "is", "очень" "полезно"]]

Теперь цель моего кода - пройти каждую строку в кадре данных и сделать запрос в GCP для каждого текста (предложение должно быть просто связано с. И словом с пробелом). Тексты здесь уже разделены на предложения и слова, хотя они мне нужны, так как целые тексты здесь - предыдущие шаги редактирования.

В синхронной обработке это уже работает, но, поскольку я никогда раньше не работал с asyncio, я немного упускаю подход к разработке вложенных циклов, чтобы параллельно запрашивались не только предложения строки, но и все линии.

Я использую Python 3.7, и доступ к GCP работает нормально. Таким образом, приведенный ниже код синхронизации полностью функционален, но я бы хотел сократить время выполнения за счет асинхронности.

Я уже пытался упаковать код в последнем цикле в метод и вызвать его как асинхронный. Конечно, это приводит только к обработке отдельных предложений в строке asyncron. Я также протестировал async для, но не смог передать список в качестве параметра и не смог создать исполняемый код.

def on_document_level(df):
  # Calling a method to create new columns in the df
  df = my_pandas.add_column_to_df(df, 'sentiments_per_sents')
  df = my_pandas.add_column_to_df(df, 'magnitudes_per_sents')

  # Instantiates a client
  client = language.LanguageServiceClient()

  # Run over each row in df
  for index, row in df.iterrows():
      # Run over each Sentence
      all_sents_in_row_list = []
      for sentence in row['processed']:
          # Create String for gcp
          all_sents_in_row_list.append(' '.join(token for token in sentence))

      all_sent_in_row_str = '. '.join(sen for sen in all_sents_in_row_list)
      logging.info(all_sent_in_row_str)

      document = types.Document(
          content=all_sent_in_row_str,
          type=enums.Document.Type.PLAIN_TEXT)


      # Detects the sentiment of the text
      sentiment = client.analyze_sentiment(document=document).document_sentiment

      df.loc[index, 'sentiments_per_sents'] = sentiment.score
      df.loc[index, 'magnitudes_per_sents'] = sentiment.magnitude

  return df```
...