1

我正在使用Google Cloud Natural Language API和 Python 进行情绪分析项目,这个问题可能与另一个问题类似,我正在做的事情如下:

  1. 从 Google Cloud Storage 读取 CSV 文件,文件有大约 7000 条记录。
  2. 将 CSV 转换为 Pandas DataFrame。
  3. 遍历数据框并调用自然语言 API 以对数据框的列之一执行情感分析,在同一个for 循环中,我从结果中提取分数幅度,并将这些值添加到数据框的新列中。
  4. 将结果数据帧存储回 GCS。

我将我的代码放在下面,但在此之前,我只想提一下,我已经使用少于 100 条记录的示例 CSV 对其进行了测试,并且效果很好,我也知道每分钟 600 个请求的配额限制,为什么我延迟每次迭代的原因,仍然,我得到了我在标题中指定的错误。我也知道增加 ulimit 的建议,但我认为这不是一个好的解决方案。

这是我的代码:

from google.cloud import language_v1
from google.cloud.language_v1 import enums
from google.cloud import storage
from time import sleep
import pandas
import sys

pandas.options.mode.chained_assignment = None

def parse_csv_from_gcs(csv_file):
    df = pandas.read_csv(f, encoding = "ISO-8859-1")

    return df

def analyze_sentiment(text_content):
    client = language_v1.LanguageServiceClient()
    type_ = enums.Document.Type.PLAIN_TEXT
    language = 'es'
    document = {"content": text_content, "type": type_, "language": language}
    encoding_type = enums.EncodingType.UTF8
    response = client.analyze_sentiment(document, encoding_type=encoding_type)

    return response

gcs_path = sys.argv[1]
output_bucket = sys.argv[2]
output_csv_file = sys.argv[3]

dataframe = parse_csv_from_gcs(gcs_path)

for i in dataframe.index:
    print(i)
    response = analyze_sentiment(dataframe.at[i, 'FieldOfInterest'])
    dataframe.at[i, 'Score'] = response.document_sentiment.score
    dataframe.at[i, 'Magnitude'] = response.document_sentiment.magnitude
    sleep(0.5)

print(dataframe)
dataframe.to_csv("results.csv", encoding = 'ISO-8859-1')

gcs = storage.Client()
gcs.get_bucket(output_bucket).blob(output_csv_file).upload_from_filename('results.csv', content_type='text/csv')

'analyze_sentiment' 功能与我们在Google 文档中的功能非常相似,我只是对其进行了一些修改,但它的作用几乎相同。

现在,程序在达到 550 和 700 之间的记录时引发该错误并崩溃,但我没有看到服务帐户 JSON 和调用自然语言 API 之间的相关性,所以我也认为当我调用API,它会打开帐户凭据 JSON 文件,但之后不会关闭它。

我目前遇到这个问题并且没有想法,所以任何帮助将不胜感激,在此先感谢=)!

[更新]

我已经通过从“ analyze_sentiment ”方法中提取“ client ”并将其作为参数传递来解决了这个问题,如下所示:

def analyze_sentiment(ext_content, client):
    <Code>    

看起来每次它到达这条线:

client = language_v1.languageServiceClient()

它会打开帐户凭据 JSON 文件,但不会关闭,因此将其提取到全局变量即可完成这项工作 =)。

4

1 回答 1

0

我已经用解决方案更新了原始帖子,但无论如何,感谢所有看到这个并试图回复的人=)!

于 2020-04-11T00:12:54.720 回答