You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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')

错误原因

  1. 未请求的属性:你在perspect_dict中尝试获取PROFANITY评分,但在analyze_request的requestedAttributes里并没有声明请求该属性,导致response.get('attributeScores', {}).get('PROFANITY')返回None,后续调用.get('spanScores')触发AttributeError。
  2. 链式调用风险:即使是已请求的属性,直接链式调用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:20:30