如何在Python中从字符串中提取国家信息

5

我有一些文本,其中可能包含一个国家的名称。例如:

“尼日利亚:热点网络有限公司农村电话可行性研究”

这是我从中提取国家名称的方法,在第一次尝试中:

findcountry("Nigeria: Hotspot Network LTD Rural Telephony Feasibility Study")

def findCountry(stringText):
    for country in pycountry.countries:
        if country.name.lower() in stringText.lower():
            return country.name
    return None

很遗憾,它给了我错误的输出,显示为[尼日尔],而正确的国家是尼日利亚。请注意,尼日尔和尼日利亚是世界上两个不同的现有国家。
在第二次尝试中:
def findCountry(stringText):
    full_list =[]
    for country in pycountry.countries:
        if country.name.lower() in stringText.lower():
            full_list.append(country)

    if len(full_list) > 0:
        return full_list

    return None

我得到了['Niger', 'Nigeria']作为输出,但我找不到一种方法来获取尼日利亚作为我的最终输出。如何实现此目标。

注意:这里我知道尼日利亚是正确答案,但后面我会将其放入代码中,以选择文本中出现的最终国家名称,并且它应该具有非常高的检测精度。


这是你在寻找的东西吧,如何从文本中提取国家。 - Maxima
按照国家名称的长度进行降序排序。 - Selcuk
@Tangent 我正在使用相同的库,但步骤不同。正如我之前提到的,我需要正确的单一答案,而不是错误的答案。 - Talib Daryabi
4个回答

7

总是先搜索最长的字符串;这样可以避免你遇到的那种错误。

countries = sorted(pycountry.countries, key=lambda x: -len(x))

抱歉,我无法理解在哪里以及如何使用这段代码。你能否给个提示? - Talib Daryabi
你正在迭代pycountry.countries,但它并没有被排序; 而遍历已排序的countries则会给出正确的答案。 - Amadan

2

这里的问题在于出现的工作。因此,Niger对于尼日利亚是正确的。您也可以更改变量在in之前和之后的位置,但这只会解决尼日利亚的问题,而不是其他国家的问题。您可以使用 == 来解决所有情况。

def findCountry(stringText):
    for country in pycountry.countries:
        if country.name.lower() == stringText.lower():
            return country.name
    return None

谢谢你,我需要的答案也应该适用于所有其他条件。 - Talib Daryabi
非常欢迎 @TalibDaryabi。如果它解决了您的问题,请告诉我? - moshfiqrony

2

一种正则表达式的方法是构建一个包含所有目标国家的选择,然后在输入文本上使用re.findall来查找任何可能的匹配:

regex = r'\b(?:' + '|'.join(pycountry.countries) + r')\b'

def findCountry(stringText):
    countries = re.findall(regex, stringText, flags=re.IGNORECASE)
    return countries

它返回了一个空列表,需要进行一些小的更改才能运行程序。在join方法内部,我们应该写上pycountry.countries中的country.name,因为它需要文本而不是Country对象。在最终版本中,当我将我的字符串传递给findall时,它返回的是空列表,而不是尼日利亚。 - Talib Daryabi
@TalibDaryabi,请检查更新后的答案,并尝试在不区分大小写的模式下运行正则表达式搜索。 - Tim Biegeleisen
它仍然返回一个空列表。我像这样运行代码: regex = r'\b(?:' + '|'.join(country.name.lower() for country in pycountry.countries) + ')\b' countries = re.findall(regex, title, flags=re.IGNORECASE) - Talib Daryabi
标题中包含尼日利亚的字符串 - Talib Daryabi
抱歉,看来我的阅读理解能力不太好 :D 对不起... - Amadan

0
我是这样得到正确答案的:
def findCountry(stringText):
    countries = sorted([country.name for country in pycountry.countries] , key=lambda x: -len(x))
    for country in countries:
        if country.lower() in stringText.lower():
            return country
    return None

在这个问题中,遵循@Amandan的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接