如何使用spaCy从地址数据中提取城市、国家实体并统计其出现次数
从地址文本提取城市、国家实体并统计频次的解决方案
原代码存在的问题
- 依赖维基百科在线接口做实体分类,网络不稳定时会直接报错,同时接口响应速度慢,歧义匹配率高,不适用于批量地址处理
- 缺失文本预处理、实体清洗逻辑,拼写差异、无效字符会导致同一实体被重复计数
- 没有实现频次统计的相关逻辑
环境依赖安装
运行前先执行以下命令安装所需依赖:
pip install spacy pycountry python -m spacy download en_core_web_lg
优化后可运行代码
import spacy import pycountry from collections import Counter # 加载spaCy大模型 nlp = spacy.load('en_core_web_lg') # 读取地址文件,替换为你本地的文件路径 with open("C:/Users/johns/Desktop/NewFolder/address1.txt", "r", encoding="utf-8", errors="ignore") as f: text = f.read() # 提取所有GPE实体 gpe_entities = [ent.text.strip() for ent in nlp(text).ents if ent.label_ == "GPE"] # 本地匹配国家实体,不需要联网 countries = [] cities = [] # 提前加载所有国家名称到集合,提升匹配速度 country_names = {country.name.lower() for country in pycountry.countries} for ent in gpe_entities: if ent.lower() in country_names: countries.append(ent) else: cities.append(ent) # 统计出现频次 country_counts = Counter(countries) city_counts = Counter(cities) # 打印结果 print("国家出现频次:") for country, cnt in country_counts.most_common(): print(f"{country}: {cnt}次") print("\n城市/地区出现频次:") for city, cnt in city_counts.most_common(): print(f"{city}: {cnt}次")
效果说明
针对你提供的地址示例,运行后会正确识别出:
- 国家:Egypt、India、Pakistan等,统计对应出现次数
- 城市:GIZA、New Delhi、Islamabad、Hyderabad等,统计对应出现次数
如果需要进一步提升识别准确率,可以自定义补充地名词典到spaCy的实体规则里,适配特殊拼写的地名。
内容的提问来源于stack exchange,提问作者Sherlock
相关产品推荐
相关产品推荐

