【问题标题】:obtain confidence/distance on country extracted by geograpy3获得由 geograpy3 提取的国家/地区的置信度/距离
【发布时间】:2021-01-30 10:00:17
【问题描述】:

我尝试了一个简单的演示来检查 geograpy 是否可以满足我的要求:尝试在非规范化地址中查找国家名称和 iso 代码(这基本上就是 geograpy 的用途! )。
问题是,在我做的测试中,geograpy 能够为每个使用的地址找到几个国家,在大多数情况下包括正确的,但是 我找不到任何类型的参数来决定哪个国家是最“正确”的。
我使用的虚假地址列表,可能反映了可以分析的现实,是这样的:

  • John Doe 115 Huntington Terrace Newark, New York 07112 Stati Uniti
  • John Doe 160 Huntington Terrace Newark, New York 07112 United States of America
  • John Doe 30 Huntington Terrace Newark, New York 07112 USA
  • John Doe 22 Huntington Terrace Newark, New York 07112 US
  • Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italia
  • Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italy

这是编写的简单代码:

import geograpy

ind = ["John Doe 115 Huntington Terrace Newark, New York 07112 Stati Uniti",
"John Doe 160 Huntington Terrace Newark, New York 07112 United States of America",
"John Doe 30 Huntington Terrace Newark, New York 07112 USA",
"John Doe 22 Huntington Terrace Newark, New York 07112 US",
"Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italia",
"Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italy"]

locator = geograpy.locator.Locator()
for address in ind:
    places = geograpy.get_place_context(text=address)
    print(address)
    #print(places)
    for country in places.countries:
      print("Country:"+country+", IsoCode:"+locator.getCountry(name=country).iso)
    print()

这是输出:

John Doe 115 Huntington Terrace Newark, New York 07112 Stati Uniti
Country:United Kingdom, IsoCode:GB
Country:Jamaica, IsoCode:JM
Country:United States, IsoCode:US

John Doe 160 Huntington Terrace Newark, New York 07112 United States of America
Country:United States, IsoCode:US
Country:United Kingdom, IsoCode:GB
Country:Netherlands, IsoCode:NL
Country:Jamaica, IsoCode:JM
Country:Argentina, IsoCode:AR

John Doe 30 Huntington Terrace Newark, New York 07112 USA
Country:United Kingdom, IsoCode:GB
Country:Jamaica, IsoCode:JM
Country:United States, IsoCode:US

John Doe 22 Huntington Terrace Newark, New York 07112 US
Country:United Kingdom, IsoCode:GB
Country:Jamaica, IsoCode:JM
Country:United States, IsoCode:US

Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italia
Country:Australia, IsoCode:AU
Country:Sweden, IsoCode:SE
Country:United States, IsoCode:US

Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italy
Country:Italy, IsoCode:IT
Country:Australia, IsoCode:AU
Country:Sweden, IsoCode:SE
Country:United States, IsoCode:US

首先,最大的问题是在意大利的地址(第 4 位)无法在所有正确的国家/地区找到(意大利/意大利),我不知道从哪里三国发现来自。
在大多数情况下,它会找到错误的国家,沉迷于正确的国家,并且 我没有任何类型的关于置信度百分比、距离或我能理解的国家/地区的指标的指标 被认为是可以接受的答案,并且在多个结果中,可能是“最佳”

我想提前道歉,但我没有时间深入研究 geograpy3,我不知道这是否是一个愚蠢的问题,但我还没有找到任何关于信心/概率/文档中的距离。

【问题讨论】:

    标签: python nlp nltk geograpy


    【解决方案1】:

    我作为 geograpy3 的提交者回答。

    看起来您在第一步尝试使用 geograpy Version1 的旧界面,然后才使用定位器。对于您的用例,改进的定位器界面可能更加合理。此界面可以使用人口或人均 gdp 等额外信息来查找“最有可能”的国家进行消歧。

    Stati Uniti/United States Italia/Italy 问题是一个语言问题 - 请参阅 geograpy version1 的长期未决问题 https://github.com/ushahidi/geograpy/issues/23。截至今天,geograpy3 中似乎还没有新问题 - 如果您需要此改进,请随时提交。

    我将您的示例添加到 geograpy3 项目中的 test_locator.py 以显示概念上的差异:

    def testStackOverflow64379688(self):
            '''
            compare old and new geograpy interface
            '''
            examples=['John Doe 160 Huntington Terrace Newark, New York 07112 United States of America',
                      'John Doe 30 Huntington Terrace Newark, New York 07112 USA',
                      'John Doe 22 Huntington Terrace Newark, New York 07112 US',
                      'Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italia',
                      'Mario Bianchi, Via Nazionale 256, 00148 Roma (RM) Italy',
                      'Newark','Rome']
            for example in examples:
                city=geograpy.locateCity(example,debug=False)
                print(city)
    

    结果:

    None
    None
    None
    None
    None
    Newark (US-NJ(New Jersey) - US(United States))
    Rome (IT-62(Latium) - IT(Italy))
    

    【讨论】:

    • 感谢您的回复。但是我有一些疑问:您向我指出的地理新界面根本无法在我的地址示例中找到 Country。正如您在测试中所写,对于我所有的地址,结果都是“无”,但我希望前 3 个美国和最后 2 个 ITA。有什么我不明白的吗?
    • 确实你的期望和界面的作用是不同的。为了您的期望,需要一个不同的界面。您想从一个可能包含或可能不包含地理信息的单词的句子中得出正确的城市答案。恕我直言,需要一个多步骤过程:首先找到与城市对应的文本部分,然后进行提取。在您的情况下,由于步骤 1 或步骤 2,步骤组合失败。如您所见,步骤 2 会起作用。如果第 1 步发现 Roma 第 2 步将不起作用,因为英语必须是罗马。
    • 在其他情况下,第 1 步失败,因为上下文阻止了它。如果您使用调试器单步调试代码或打开调试模式,您将看到发生了什么。您也可以亲自与我联系,如果您有兴趣,我可能会在在线会话中向您展示详细信息。
    • 再次感谢您的回答。我已经想象过必须进行“改进”步骤,并且对于地址拆分,我发现libpostal目标是在任何地方理解每种语言的位置字符串。所以我应该用它来尝试提取国家,然后使用另一个库来“规范化”它并获取 ISO 代码。但是对于 geograpy3 存在语言问题,所以我必须通过一个翻译步骤,我认为在非规范化的国家名称上“离线”做它并不容易。我会在内部检查我们想要实现的目标!
    • wiki.bitplan.com/index.php/Geograpy#Examples 有更多关于地理中使用的数据来自何处的详细信息。如果您在 wikidata 查询中添加更多国家/地区标签,您将获得更多结果。您可能会喜欢pypi.org/project/pylodstorage,它简化了从 rdf 结果到 json 或 sqlite 等关系数据库的转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2013-07-22
    • 2023-03-21
    相关资源
    最近更新 更多