DQinYuan / chinese_province_city_area_mapper

一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块
MIT License
1.67k stars 396 forks source link

对于类似“启东市台湾风情街”的一种改进策略 #39

Open EnrigleZ opened 5 years ago

EnrigleZ commented 5 years ago

我在做地名解析过程中,偶尔遇见标题中提及的case,地名中街道里带个省份,这好像也是大家经常遇到的bug。

比如 "启东市台湾风情街" 会被识别为 "台湾省 南通市 启东市" (启东市在pca.csv中标记为南通市下的一个区,这个没关系)

问题的出现原因是 "台湾风情街" 中的“台湾”被识别为一个合法的province,台湾省 然后再根据 area “启东市”,对 `city 进行补全,得到南通市

从而 bug occurs...

---------------------- 一个解决方案 在 _fill_province 中不论是否已有 pca.province,都进行一次省市二元组的合法性检查。如果省份. 城市 没有在 pca.csv 中出现,则视为一个错误的分类结果。我们假设 pca.csv 是一个可靠的文档...

当上述问题出现时,舍弃现有的 pca.province,重新进行补全。

我目前的实现方式是依赖了 cpca 预处理构造的 city_map,如果 (pca.province, pca.city, "") 存在于 city_map[pca.city] 中,即为合法。

def _fill_province(pca):
    """填充省"""

    # 下面的判定条件是新加的,city_map中的每一项都有area取空字符串的情形,因此取空字符串即可
    if pca.city and (pca.province, pca.city, "") in city_map[pca.city]:
        return
    # 下面是原有的,移除了 pca.province 已存在的判定
    if pca.city and (pca.city in city_map):
        pca.province = city_map.get_value(pca.city, P)

顺便感谢一下作者的工作,cpca是一个很有用的库。由于我没有太深入阅读您的实现,可能写的方案有点粗暴。

如果我的 issue 能帮助改进cpca库,那将非常荣幸 O_O

第一次提 issue,不规范的地方多包涵

DQinYuan commented 5 years ago

感谢,其实曾经是有这个校验,后来把去掉的原因是不知道该以省为准,还是以市为准。

举个不太现实例子,假如是 "台湾省南通风情街",按照你的逻辑就会被匹配成"江苏省南通市"。

有什么更好的解决方法吗?

EnrigleZ commented 5 years ago

你的这个例子挺合理的,按照现有的逻辑会被识别为 台湾省 南通市 空字符串 风情街 (电脑不在手边没有实验

所以问题在于“字符串里的地名到底是不是真的地名”…这个问题似乎没有直接的解。

我感觉可以把province_verify和city_verify做成一个可选参数,也可以默认不触发?毕竟如果真的出现了省市无法和pca.csv匹配的情况的话,那大概率就真是一个错误匹配了。此时做一个修正也是一个权宜之举,不过这样每次会有一个对city-map的o(n)遍历,性能会也许略收影响。

至于是按照city还是province为准,可以留给用户权衡。比如上海这样到处都是陕西北路,河南中路的,应该以city为准,匹配为上海市,上海市

raof01 commented 5 years ago

如果按照中文地址从大到小的约定,可以将出现在前面的地名权重设置高一点?