运行 Google 云平台NLP-API 大量文档批处理模式下的实体情感分析是否可行?

Is it possible to run Google Cloud Platform NLP-API entity sentiment analysis in a batch processing mode for a large number of documents?

我对 Google Cloud Platform 比较陌生。我有一个大数据集(1800 万篇文章)。我需要使用 GCP 的 NLP-API 进行实体情感分析。就获取所有文章的实体情绪所需的时间而言,我不确定我进行分析的方式是否是最佳方式。我想知道是否有一种方法可以批处理所有这些文章,而不是遍历每一篇文章并进行 API 调用。这是我一直在使用的过程的总结。

  1. 我有大约 500 个文件,每个文件包含大约 30,000 篇文章。
  2. 在我的本地服务器上使用 python 脚本,我遍历每个文件和每篇文章,我调用给定的函数 here
  3. 我将每篇文章的全部输出存储在一个 protobuf 中。

在这一步之后,我不需要 Google API 并对存储在 protobufs 中的 API 输出执行我的最终分析。

这对于我有大约 150 万篇文章并花了几天时间的研究项目来说效果很好。现在我有 1800 万篇文章,我想知道是否有更好的方法来解决这个问题。我读过的关于批处理的文章都是针对制作应用程序或图像处理任务的。有一些东西是我想要的 here 但我不确定我是否可以用 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 的调用次数。总之,如果我要进行 1800 万次调用,那么进行所有这些调用而不是浏览每篇文章并单独调用函数的最快方法是什么?

我觉得我应该进行某种并行处理,但我对花更多时间学习 Dataproc 而不知道这是否会帮助我解决我的问题持谨慎态度。

您将需要管理合并文档以获得更小的作业总数。您还需要对每分钟的请求数和每天的总请求数进行速率限制。

定价以字符为单位,以 1,000 个字符为单位。如果您计划处理 1800 万篇文章(每篇文章多少字?),我会联系 Google 销售人员讨论您的项目并安排信贷审批。您将很快达到配额限制,然后您的工作将 return API 错误。

我将从阅读文档的这一部分开始:

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