调用Perspective API获取Twitter数据毒性评分时遇NoneType属性错误
问题分析与解决方案
问题描述
我正在使用Perspective API从Twitter数据中获取毒性评分,但尽管字典不为空,仍出现错误AttributeError: 'NoneType' object has no attribute 'get'。以下是我的实现代码:
def getToxicityScores(sentence): analyze_request = { 'comment': { 'text': sentence }, 'requestedAttributes': { 'TOXICITY': {}, 'INSULT': {}, 'IDENTITY_ATTACK': {}, 'THREAT': {} } } response = client.comments().analyze(body=analyze_request).execute() #print(response.get('attributeScores', {})) print(response.keys()) perspect_dict = { 'Profanity': response.get('attributeScores', {}).get('PROFANITY').get('spanScores')[0].get('score').get('value'), 'Toxicity': response.get('attributeScores', {}).get('TOXICITY').get('spanScores')[0].get('score').get('value'), 'Threat': response.get('attributeScores', {}).get('THREAT').get('spanScores')[0].get('score').get('value'), 'IdentityAttack': response.get('attributeScores', {}).get('IDENTITY_ATTACK').get('spanScores')[0].get('score').get('value'), 'Insult': response.get('attributeScores', {}).get('INSULT').get('spanScores')[0].get('score').get('value') } time.sleep(40) return perspect_dict
调用语句:getToxicityScores('shut up')
错误原因
- 未请求的属性:你在
perspect_dict中尝试获取PROFANITY评分,但在analyze_request的requestedAttributes里并没有声明请求该属性,导致response.get('attributeScores', {}).get('PROFANITY')返回None,后续调用.get('spanScores')触发AttributeError。 - 链式调用风险:即使是已请求的属性,直接链式调用
.get()时,若中间某一层数据不存在(比如spanScores为空数组),同样会出现None调用get的错误。
修复方案
方案1:补充请求+安全嵌套取值
如果需要Profanity评分,先在请求中添加该属性,再用工具函数安全获取嵌套值:
def getToxicityScores(sentence): analyze_request = { 'comment': { 'text': sentence }, 'requestedAttributes': { 'TOXICITY': {}, 'INSULT': {}, 'IDENTITY_ATTACK': {}, 'THREAT': {}, 'PROFANITY': {} # 补充请求PROFANITY属性 } } response = client.comments().analyze(body=analyze_request).execute() print(response.keys()) # 安全获取嵌套值的工具函数 def safe_get(data, key_path, default=0.0): current = data for key in key_path: if isinstance(current, dict): current = current.get(key) elif isinstance(current, list) and isinstance(key, int): current = current[key] if len(current) > key else None else: current = None if current is None: return default return current perspect_dict = { 'Profanity': safe_get(response, ['attributeScores', 'PROFANITY', 'spanScores', 0, 'score', 'value']), 'Toxicity': safe_get(response, ['attributeScores', 'TOXICITY', 'spanScores', 0, 'score', 'value']), 'Threat': safe_get(response, ['attributeScores', 'THREAT', 'spanScores', 0, 'score', 'value']), 'IdentityAttack': safe_get(response, ['attributeScores', 'IDENTITY_ATTACK', 'spanScores', 0, 'score', 'value']), 'Insult': safe_get(response, ['attributeScores', 'INSULT', 'spanScores', 0, 'score', 'value']) } time.sleep(40) return perspect_dict
方案2:直接给每个get添加默认值
如果不想用工具函数,可给每个.get()设置默认值,避免链式调用出错:
# 先确保PROFANITY已在requestedAttributes中请求 perspect_dict = { 'Profanity': response.get('attributeScores', {}).get('PROFANITY', {}).get('spanScores', [{}])[0].get('score', {}).get('value', 0.0), 'Toxicity': response.get('attributeScores', {}).get('TOXICITY', {}).get('spanScores', [{}])[0].get('score', {}).get('value', 0.0), 'Threat': response.get('attributeScores', {}).get('THREAT', {}).get('spanScores', [{}])[0].get('score', {}).get('value', 0.0), 'IdentityAttack': response.get('attributeScores', {}).get('IDENTITY_ATTACK', {}).get('spanScores', [{}])[0].get('score', {}).get('value', 0.0), 'Insult': response.get('attributeScores', {}).get('INSULT', {}).get('spanScores', [{}])[0].get('score', {}).get('value', 0.0) }
内容的提问来源于stack exchange,提问作者econCodergirl
相关产品推荐
相关产品推荐

