使用Python估算推文缺失的geo-location地理位置方法咨询
无地理标签推文的地理位置推算Python实现方案
可利用的核心推算逻辑
推文地理位置推算通常基于数据集自带的其他关联特征实现,常用方案优先级从高到低如下:
- 同用户历史位置复用:如果同一个用户发布的推文中有任意一条带有效经纬度标签,可直接将该位置复用到该用户所有无标签的推文中,该方法实现成本最低、准确率最高
- 用户简介位置地理编码:提取用户个人主页填写的公开位置字段,通过地理编码工具转换为经纬度坐标
- 推文文本地名实体提取:通过NER模型识别推文文本中出现的地名实体,再将实体转换为对应的经纬度坐标
具体实现代码
你已完成带经纬度标签数据的GeoDataFrame构建,后续补全缺失值的实现可参考如下:
1. 依赖导入
import pandas as pd import geopandas as gpd from shapely.geometry import Point from geopy.geocoders import Nominatim import spacy
2. 同用户历史位置复用
# 提取所有带有效经纬度的用户的位置映射 user_loc_map = gdf.dropna(subset=['geometry']).groupby('user_id')['geometry'].first().to_dict() # 给缺失geometry的行匹配同用户的已有位置 df2['geometry'] = df2.apply( lambda x: user_loc_map.get(x['user_id'], x['geometry']) if pd.isna(x['geometry']) else x['geometry'], axis=1 )
3. 用户简介位置地理编码
geolocator = Nominatim(user_agent="twitter_loc_infer") # 定义地理编码函数 def get_geo_from_loc_str(loc_str): if not loc_str or pd.isna(loc_str): return None try: location = geolocator.geocode(loc_str, timeout=10) return Point(location.longitude, location.latitude) if location else None except: return None # 给仍然缺失位置的行用用户简介位置推导 mask = df2['geometry'].isna() df2.loc[mask, 'geometry'] = df2.loc[mask, 'user_profile_location'].apply(get_geo_from_loc_str)
4. 推文文本地名实体提取推导
# 加载对应语言的NER模型,中文场景可加载中文预训练模型 nlp = spacy.load("zh_core_web_md") def get_geo_from_text(text): if not text or pd.isna(text): return None doc = nlp(text) # 提取地理实体 gpe_list = [ent.text for ent in doc.ents if ent.label_ == 'GPE'] return get_geo_from_loc_str(gpe_list[0]) if gpe_list else None # 给剩余缺失位置的行用推文文本推导 mask = df2['geometry'].isna() df2.loc[mask, 'geometry'] = df2.loc[mask, 'text'].apply(get_geo_from_text)
5. 最终结果整理
# 构建统一的GeoDataFrame final_gdf = gpd.GeoDataFrame(df2, crs="EPSG:4326", geometry='geometry') # 可根据需求过滤无法推断位置的记录 final_gdf = final_gdf.dropna(subset=['geometry'])
内容的提问来源于stack exchange,提问作者Ankita
相关产品推荐
相关产品推荐

