【问题标题】:How can I send a batch of strings to the Google Cloud Natural Language API?如何向 Google Cloud Natural Language API 发送一批字符串?
【发布时间】:2023-03-12 21:33:02
【问题描述】:

我有一个 Pandas 数据框,其中包含我想使用 Google 的 NLP API 分析的许多社交媒体 cmets。 Google 的文档仅讨论(据我所知)如何对单个字符串进行分类,而不是在一个请求中对多个字符串进行分类。对 API 的每个请求,一次对一条评论进行分类,大约需要半秒,当我试图在任何时候对超过 10,000 条评论进行分类时,这非常慢。有没有办法将字符串列表单独分类,我相信这会更快?

这是我目前使用的代码:

import numpy as np
import pandas as pd
from google.cloud import language

client = language.LanguageServiceClient()

def classify(string):
    document = language.types.Document(content=string, type=language.enums.Document.Type.PLAIN_TEXT)
    sentiment = client.analyze_sentiment(document=document).document_sentiment
    return (sentiment.score, sentiment.magnitude)

def sentiment_analysis_df(df):    
    df['sentiment_score'] = np.zeros(len(df))
    df['sentiment_magnitude'] = np.zeros(len(df))
    for i in range(len(df)):
        score, magnitude = classify(df['comment'].iloc[i])
        df['sentiment_score'].iloc[i] = score
        df['sentiment_magnitude'].iloc[i] = magnitude
    # Other steps including saving dataframe as CSV are done here

我在这里看到了另外两个提出类似问题的帖子,herehere,但第一个假设句号用于字符串分隔(在我的情况下不正确,因为许多字符串由多个句子),第二个只有讨论速率限制和成本的答案。

【问题讨论】:

    标签: python pandas google-cloud-platform nlp


    【解决方案1】:

    如果您想并行化请求,您可以让 Spark 作业为您完成。

    这里有一个代码 sn-p 我自己试过并工作了:

    from pyspark.context import SparkContext
    from pyspark import SparkConf
    
    from google.cloud import language
    from google.cloud.language import enums
    from google.cloud.language import types
    
    
    def comment_analysis(comment):
    
        client = language.LanguageServiceClient()
        document = types.Document(
            content=comment,
            type=enums.Document.Type.PLAIN_TEXT)
        annotations = client.analyze_sentiment(document=document)
        total_score = annotations.document_sentiment.score
        return total_score
    
    
    sc = SparkContext.getOrCreate(SparkConf())
    
    expressions = sc.textFile("sentiment_lines.txt")
    
    mapped_expressions = expressions.map(lambda comment: comment_analysis(comment))
    

    (其中,sentiment_lines.txt 是带有一些 cmets 的纯文本文档)

    mapped_expressions 的每个元素都是表达式中每个“评论”的整体情绪。

    此外,请记住,您可以让 Dataproc 运行 Spark 作业,这样一切都在 Google Cloud 中进行管理。

    【讨论】:

    • 您也可以尝试直接在 pandas 上使用“apply”(没有 spark)并调用 comment_analysis 函数作为第一种方法,看看它是如何执行的
    • 我很高兴这对你有用!如果是这样,您能否将其标记为解决方案?如果没有,您能否具体说明您的用例还有哪些具体需求?
    • 对不起,现在标记为答案,我是堆栈溢出的新手,不知道该怎么做!
    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多