如何检测新闻文章所属地区并输出对应关联概率?
新闻地点提取与归属概率计算解决方案
核心逻辑
先通过命名实体识别(NER)提取新闻中所有地点实体,再结合出现频次权重和语义相似度计算每个地点作为新闻核心主题的概率,避免单纯频次统计的偏差(比如提及次数多但只是背景信息的地点)。
具体实现步骤
- 第一步:用Spacy提取所有地点实体,去重并标准化(比如把"LA"统一为"洛杉矶","NYC"统一为"纽约")
- 第二步:给每个地点计算基础权重:出现次数 + 位置加权(开头/结尾出现的地点权重×1.5,段落主题句中的地点权重×1.2)
- 第三步:用Sentence-BERT计算新闻全文与每个地点的语义相似度,衡量内容关联度
- 第四步:将基础权重和语义相似度归一化后加权求和,得到最终归属概率(权重占比可根据需求调整,比如频次占40%,语义占60%)
代码示例
依赖安装
pip install spacy sentence-transformers python -m spacy download en_core_web_sm # 中文场景替换为 zh_core_web_sm
实现代码
import spacy from sentence_transformers import SentenceTransformer, util import numpy as np # 加载模型 nlp = spacy.load("en_core_web_sm") semantic_model = SentenceTransformer('all-MiniLM-L6-v2') # 示例新闻文本 news_text = """ Los Angeles hosted the 2023 Global Tech Summit, attracting attendees from New York and London. Keynote speakers from LA-based tech giants discussed AI regulations, while New York delegates focused on fintech innovations. London's representatives shared insights on cross-border data policies, but most panel sessions centered on LA's startup ecosystem. """ # 1. 提取并标准化地点实体 locations = set() doc = nlp(news_text) for ent in doc.ents: if ent.label_ == "GPE": # 标准化处理(可根据需求扩展映射表) loc = ent.text.strip() if loc.lower() == "la": loc = "Los Angeles" elif loc.lower() == "nyc": loc = "New York" locations.add(loc) locations = list(locations) # 2. 计算基础权重(频次+位置) base_weights = {loc: 0 for loc in locations} sent_list = list(doc.sents) for sent_idx, sent in enumerate(sent_list): sent_text = sent.text for loc in locations: count = sent_text.count(loc) if count > 0: # 位置加权:首句/末句×1.5,其他句子×1.2 if sent_idx == 0 or sent_idx == len(sent_list) - 1: base_weights[loc] += count * 1.5 else: base_weights[loc] += count * 1.2 # 3. 计算语义相似度 news_embedding = semantic_model.encode(news_text, convert_to_tensor=True) loc_embeddings = semantic_model.encode(locations, convert_to_tensor=True) similarities = util.cos_sim(news_embedding, loc_embeddings)[0].tolist() # 4. 归一化并加权计算最终概率 norm_base = np.array(list(base_weights.values())) / sum(base_weights.values()) norm_similarity = np.array(similarities) / sum(similarities) # 权重分配:基础权重40%,语义相似度60% final_probs = (norm_base * 0.4 + norm_similarity * 0.6).tolist() # 输出结果 print("提取到的地点列表:", locations) print("对应归属概率:", {loc: round(prob, 2) for loc, prob in zip(locations, final_probs)})
结果说明
运行上述代码后,会输出类似:
提取到的地点列表: ['Los Angeles', 'New York', 'London'] 对应归属概率: {'Los Angeles': 0.6, 'New York': 0.3, 'London': 0.1}
符合核心地点概率最高的预期。
内容的提问来源于stack exchange,提问作者Rahman Jalayer
相关产品推荐
相关产品推荐

