将Google Cloud NLP API实体情感输出转JSON并提取特定实体情感参数
直接从Google Cloud NL API结果中提取目标候选人的情感数据
不用序列化JSON也完全没问题!Google Cloud Natural Language API返回的实体情感分析对象本身就提供了直接访问属性的方法,完全可以跳过序列化步骤,直接从返回的AnalyzeEntitySentimentResponse对象里提取你需要的信息。
下面是具体的实现思路和代码示例:
首先,我们先把需要匹配的候选人姓名及简称做一个分组,这样可以统一处理不同的称呼:
# 定义候选人和对应的匹配关键词(转小写后匹配) candidate_keywords = { "Donald Trump": ["donald trump", "trump", "@realdonaldtrump"], "Hillary Clinton": ["hillary clinton", "hillary", "clinton"], "Bernie Sanders": ["bernie sanders", "bernie", "sanders"], "Ted Cruz": ["ted cruz", "cruz"] }
接下来,假设你已经通过API调用得到了response对象(就是client.analyze_entity_sentiment()返回的结果),我们直接遍历里面的实体,匹配目标候选人并提取情感数据:
from google.cloud import language_v1 # 这里省略API调用的代码,假设你已经拿到了response # client = language_v1.LanguageServiceClient() # document = language_v1.Document(content=your_text, type_=language_v1.Document.Type.PLAIN_TEXT) # response = client.analyze_entity_sentiment(request={"document": document}) # 存储结果的字典 candidate_sentiments = {} for entity in response.entities: # 把实体名称转成小写,避免大小写匹配问题 entity_name_lower = entity.name.lower() # 检查当前实体是否属于我们关注的候选人 for candidate, keywords in candidate_keywords.items(): if entity_name_lower in keywords: # 如果是第一次匹配到该候选人,初始化数据结构 if candidate not in candidate_sentiments: candidate_sentiments[candidate] = { "total_score": 0, "total_magnitude": 0, "mention_count": 0 } # 累加情感数据 candidate_sentiments[candidate]["total_score"] += entity.sentiment.score candidate_sentiments[candidate]["total_magnitude"] += entity.sentiment.magnitude candidate_sentiments[candidate]["mention_count"] += 1 break # 匹配到对应的候选人后就停止检查其他关键词 # 计算最终的平均情感值和总情感量级(如果需要单条提及的结果,可以跳过这一步) final_results = {} for candidate, data in candidate_sentiments.items(): final_results[candidate] = { "average_sentiment_score": round(data["total_score"] / data["mention_count"], 2), "total_sentiment_magnitude": round(data["total_magnitude"], 2), "mention_times": data["mention_count"] } # 输出结果 for candidate, result in final_results.items(): print(f"--- {candidate} ---") print(f"平均情感值: {result['average_sentiment_score']}") print(f"总情感量级: {result['total_sentiment_magnitude']}") print(f"被提及次数: {result['mention_times']}\n")
关键说明:
- 直接访问API返回对象的属性:
entity.name是实体的名称,entity.sentiment.score是情感值(范围-1到1,负数表示负面,正数表示正面),entity.sentiment.magnitude是情感量级(范围0到无穷,数值越高表示情感强度越大,不管正负)。 - 大小写处理:把实体名称转成小写后再匹配关键词,避免因为大小写不一致导致漏匹配(比如"Trump"和"trump")。
- 数据聚合:如果同一个候选人被多次提及,上面的代码会计算平均情感值和总量级,如果你需要保留每一次提及的单独数据,可以把
candidate_sentiments里的存储改成列表,直接追加每次的score和magnitude即可。 - 扩展匹配:如果还有其他变体称呼(比如"Donald J. Trump"),直接在对应的候选人关键词列表里添加即可。
这样处理完全不需要序列化JSON,直接利用API返回对象的原生属性,既高效又能避免重新调用API的耗时问题。
内容的提问来源于stack exchange,提问作者Mona Jalal
相关产品推荐
相关产品推荐

