我正在使用Google Cloud Natural Language API和 Python 进行情绪分析项目,这个问题可能与另一个问题类似,我正在做的事情如下:
- 从 Google Cloud Storage 读取 CSV 文件,文件有大约 7000 条记录。
- 将 CSV 转换为 Pandas DataFrame。
- 遍历数据框并调用自然语言 API 以对数据框的列之一执行情感分析,在同一个for 循环中,我从结果中提取分数和幅度,并将这些值添加到数据框的新列中。
- 将结果数据帧存储回 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 文件,但不会关闭,因此将其提取到全局变量即可完成这项工作 =)。