Можно ли запустить анализ настроений сущностей NLP-API Google Cloud Platform в режиме пакетной обработки для большого количества документов? - PullRequest
1 голос
/ 02 октября 2019

Я относительно новичок в Google Cloud Platform. У меня есть большой набор данных (18 миллионов статей). Мне нужно провести анализ настроения объекта с помощью NLP-API GCP. Я не уверен, является ли способ, которым я проводил свой анализ, наиболее оптимальным с точки зрения времени, которое требуется, чтобы получить чувство сущности для всех статей. Интересно, есть ли способ пакетной обработки всех этих статей вместо итерации каждой из них и выполнения вызова API. Вот краткое описание процесса, который я использовал.

  1. У меня около 500 файлов, каждый из которых содержит около 30 000 статей.
  2. Используя скрипт python на моем локальном сервере, яперебирая каждый файл и для каждой статьи я вызываю функцию, указанную здесь
  3. Я сохраняю весь вывод для каждой статьи в protobuf.

После этого шага мне не требуется API Google, и я выполняю окончательный анализ вывода API, хранящегося в protobufs.

Это сработало достаточно для исследовательского проекта, где у меня было около 1,5 миллиона статей и заняло несколько дней. Теперь, когда у меня есть 18 миллионов статей, мне интересно, есть ли лучший способ сделать это. Статьи, которые я читал о пакетной обработке, направлены на создание приложений или задач обработки изображений. Было что-то вроде того, что я хотел здесь , но я не уверен, смогу ли я сделать это с помощью NLP-API.

Это фрагмент моего кода, а DF - это фрейм данных Pandas, гдеУ меня есть свои статьи.

def entity_sentiment_text(text):
    """Detects entity sentiment in the provided text."""
    if isinstance(text, six.binary_type):
        text = text.decode('utf-8')
    document = types.Document(
        content=text.encode('utf-8'),
        type=enums.Document.Type.PLAIN_TEXT)
    # Detect and send native Python encoding to receive correct word offsets.
    encoding = enums.EncodingType.UTF32
    if sys.maxunicode == 65535:
        encoding = enums.EncodingType.UTF16
    result = client.analyze_entity_sentiment(document, encoding)
    return result


for i,id_val in enumerate(article_ids):
    loop_start = time.time()
    if i%100 == 0:
        print i
    # create dynamic name, like "D:\Current Download\Attachment82673"
        dynamic_folder_name = os.path.join(folder, str(i))
    # create 'dynamic' dir, if it does not exist
        if not os.path.exists(dynamic_folder_name):
            os.makedirs(dynamic_folder_name)
    file_name = str(id_val) + ".txt"
    text = list(DF.loc[id_val])[1]
    try:
        text = unicode(text, errors='ignore')
        result = entity_sentiment_text(text)
        # print result
        with open(dynamic_folder_name + "/" + str(id_val) + ".bin", 'w') as result_file:
            result_file.write(result.SerializeToString())
            result_file.close()     
    except Exception as e: 
        print(e)
        with open("../"article_id_error.log", "a") as error_file:
            error_file.write(json.dumps(str(id_val) + "\n"))
        log_exception(e,id_val)

Обратите внимание, что это разовый анализ для исследования, и я не создаю приложение. Я также знаю, что не могу уменьшить количество обращений к API. Таким образом, если я делаю 18 миллионов вызовов, каков самый быстрый способ сделать все эти вызовы вместо того, чтобы проходить каждую статью и вызывать функцию по отдельности?

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

1 Ответ

0 голосов
/ 02 октября 2019

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

Цены основаны на символах в единицах по 1000 символов. Если вы планируете обработать 18 миллионов статей (сколько слов в статье?), Я бы связался с Google Sales, чтобы обсудить ваш проект и договориться об одобрении кредита. Вы очень быстро достигнете пределов квоты, и тогда ваши задания будут возвращать ошибки API.

Я бы начал с чтения этого раздела документации:

https://cloud.google.com/natural-language/docs/resources

...