Spaces:
Runtime error
Runtime error
File size: 2,335 Bytes
5ca4e86 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
"""Modified from https://github.com/timoschick/self-debiasing/blob/main/perspective_api.py"""
import time
from typing import Dict, Optional, List
from googleapiclient import discovery
from googleapiclient.errors import HttpError
class PerspectiveApiScorer:
"""
This class provides a method for accessing Perspective API using the Google API Client to obtain attribute scores for generated texts.
"""
DEFAULT_ATTRIBUTES = ['toxicity', 'severe_toxicity', 'sexually_explicit', 'threat', 'profanity', 'identity_attack']
def __init__(self, api_key: str):
"""
:param api_key: the API key to use. For details, see https://support.perspectiveapi.com/s/docs-get-started
"""
self._service = discovery.build('commentanalyzer', 'v1alpha1', developerKey=api_key,
discoveryServiceUrl="https://commentanalyzer.googleapis.com/$discovery/rest?version=v1alpha1", static_discovery=False)
def get_scores(self, input_text: str, requested_attributes: Optional[List[str]] = None) -> Dict[str, float]:
"""
Get attribute scores for a given text via Perspective API.
:param input_text: the input text
:param requested_attributes: the attributes for which to compute scores
:return: a mapping from attribute names to scores
"""
requested_attributes = requested_attributes if requested_attributes else PerspectiveApiScorer.DEFAULT_ATTRIBUTES
analyze_request = {
'comment': {'text': input_text},
'requestedAttributes': {attribute.upper(): {} for attribute in requested_attributes},
'spanAnnotations': False,
'languages': ['en'],
}
response = None
count = 0
while (not response) and count < 60:
count += 1
try:
response = self._service.comments().analyze(body=analyze_request).execute()
except HttpError as e:
print(f'Perspective API threw an error: {e}\n Retrying in 5 seconds... Retry Count: {count} / 60')
time.sleep(5)
if response is None:
return {}
else:
return {attribute: response['attributeScores'][attribute.upper()]['summaryScore']['value'] for attribute in requested_attributes}
|