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

如何用spaCy从字符串提取位置?为何仅识别出London?

英国城镇名命名实体识别问题

我需要从字符串中识别命名位置,项目涉及英国众多城镇,识别城镇名十分关键。以下是我的实现代码:

import spacy

# Load the spaCy model for English
nlp = spacy.load("en_core_web_sm")

# Define the example string
example_string = "show me all the 5k races in burnley, london and in manchester or lancashire on october 2020"

# Process the input string with spaCy
doc = nlp(example_string)

# Initialize a list to store location names
location_names = []

# Extract location-related words using spaCy's named entity recognition (NER)
for ent in doc.ents:
    if ent.label_ in ["GPE", "LOC"]:
        location_names.append(ent.text)

print("Location names:", location_names)

运行后仅识别出London,请问这是什么原因?是否因为其他城镇规模太小无法被识别?


原因分析

  • 模型训练数据限制:en_core_web_sm是spaCy的轻量小模型,训练样本以通用高频实体为主,像Burnley、Lancashire这类相对小众的英国城镇不在核心训练覆盖范围内,因此无法被识别。
  • 实体标签覆盖范围:spaCy的GPE标签主要针对国家、大型城市等主流地理实体,小模型对区域城镇、郡级行政区的识别能力较弱。

解决方案

  1. 切换至更大的预训练模型
    换用en_core_web_md或en_core_web_lg这类中/大型模型,它们的训练数据量更大,实体覆盖范围更广,能识别更多英国城镇。修改代码中的模型加载部分即可:
nlp = spacy.load("en_core_web_md")  # 或 en_core_web_lg
  1. 自定义短语匹配器
    如果需要精准识别特定英国城镇,可以用spaCy的PhraseMatcher构建自定义城镇词库,直接匹配字符串中的目标实体:
import spacy
from spacy.matcher import PhraseMatcher

nlp = spacy.load("en_core_web_sm")
matcher = PhraseMatcher(nlp.vocab)

# 自定义英国城镇列表(可根据需求扩展)
uk_towns = ["burnley", "london", "manchester", "lancashire"]
patterns = [nlp.make_doc(town) for town in uk_towns]
matcher.add("UK_TOWNS", patterns)

example_string = "show me all the 5k races in burnley, london and in manchester or lancashire on october 2020"
doc = nlp(example_string)

location_names = []
matches = matcher(doc)
for match_id, start, end in matches:
    location_names.append(doc[start:end].text.title())

print("Location names:", list(set(location_names)))  # 去重后输出
  1. 微调预训练模型
    如果有大量标注好的英国城镇实体数据,可以对spaCy模型进行微调,让模型针对性学习识别这类实体。这种方式需要准备标注数据集,适合长期且高精度的需求。

内容的提问来源于stack exchange,提问作者dexta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:43:30