从字符串解析始发地城市和目的地城市

2020-07-06 16:29:44

我有一个熊猫数据框,其中一列是带有特定旅行详细信息的一串字符串。我的目标是解析每个字符串以提取始发地城市和目的地城市(我最终希望有两个新列,标题分别为';Origin&39;和';Destination&39;)。

从纽约到意大利威尼斯的阿提哈德航空公司从布鲁塞尔到曼谷的往返航班,从洛杉矶到墨西哥瓜达拉哈拉的往返航班,从巴黎飞往澳大利亚新西兰,往返包括两个托运行李。]。

出发地:美国纽约;目的地:意大利威尼斯;出发地:布鲁塞尔;目的地:泰国曼谷;出发地:美国洛杉矶;目的地:墨西哥瓜达拉哈拉;出发地:法国巴黎;目的地:澳大利亚/新西兰(鉴于两个国家,这是一个复杂的案例)。

到目前为止,我已经尝试了各种NLTK方法,但最接近我的是使用nltk.pos_tag方法来标记字符串中的每个单词。结果是具有每个单词和关联标记的元组列表。这里有一个例子……。

[(';Fly';,';NNP';),(';to';,';to';),(';Australia';,';NNP&39;),(';&;,';CC';),(';New';,';NNP&39;),(';New';,';NNP&39;),(';新西兰(';,';NNP';),(';来自';,';NNP';),(';巴黎,';NNP';),(';来自';,';IN';),(';-,422';,';NNP';),(';返回&##。,';nn';),(';包括';,';vbg';),(';2';,';CD';),(';选中';,';vbd';),(';包';,';nns&39;),(';!#39;,'。)]。

我被困在这个阶段,不确定如何最好地实现这一点。请问谁能给我指个方向?谢谢。

乍一看几乎是不可能的,除非您可以访问某些包含相当复杂组件的API。

乍一看,你似乎在要求神奇地解决自然语言问题。但让我们将其分解,并将其范围扩大到某个点,即某些东西是可以构建的。

首先,要识别国家和城市,您需要枚举它们的数据,因此让我们尝试一下:https://www.google.com/search?q=list+of+countries+and+cities+in+the+world+json。

在搜索结果的顶部,我们找到指向https://datahub.io/core/world-cities-cities.json文件的WORLD。现在我们把它们装入不同的国家和城市。

导入请求导入请求端口jsonities_url=";https://pkgstore.datahub.io/core/world-cities/world-cities_json/data/5b3dd46ad10990bca47b04b4739a02ba/world-cities_json.json";cities_json=json.loads(requests.get(cities_url).content.decode(';utf8';))countries=Set([City[';Country&39;]For Cities in Cities_json])Cities=Set([CITHER[';NAME&39;]FOR CITIES_JSON])。

导入请求从FlashText导入关键字Processorities_url=";https://pkgstore.datahub.io/core/world-cities/world-cities_json/data/5b3dd46ad10990bca47b04b4739a02ba/world-cities_json.json";cities_json=json.loads(requests.get(cities_url).content.decode(';utf8';))countries=Set([CITURE[';Country&39;]for City in Cities_json])Cities=Set([CITURE[';NAME';[For City in Cities])Keyword_Processor=KeywordProcessor(case_sensitive=False)keyword_processor.add_keywords_from_list(sorted(countries))keyword_processor.add_keywords_from_list(sorted(cities))texts=[纽约至意大利威尼斯,US271;,#39;,#39;阿提哈德从布鲁塞尔至曼谷的往返航班,从洛杉矶至墨西哥瓜达拉哈拉,US191&39;,#39;的阿提哈德往返航班。[#39;纽约至意大利威尼斯,USD271;,#39;,#39;阿提哈德回程航班从洛杉矶至墨西哥瓜达拉哈拉,US191&39;,#39;从巴黎飞往澳大利亚和新西兰,往返422美元,包括2张托运的bags';]keyword_processor.extract_keywords(texts[0])机票。

是的,您不能只信任单个数据源,所以让我们尝试获取所有数据源。

导入请求导入jsonities_url=";https://pkgstore.datahub.io/core/world-cities/world-cities_json/data/5b3dd46ad10990bca47b04b4739a02ba/world-cities_json.json";cities1_json=json.loads(requests.get(cities_url).content.decode(';utf8';))countries1=Set([City[';Country&39;]for City in Cities 1_json])cities1=Set([CITURE[';NAME';]对于城市中的城市1_json])dr5hn_cities_url=";https://raw.githubusercontent.com/dr5hn/countries-states-cities-database/master/cities.json";dr5hn_countries_url=";https://raw.githubusercontent.com/dr5hn/countries-states-cities-database/master/countries.json";cities2_json=json.loads(requests.get(dr5hn_cities_url).content.decode(';utf8';))Countries2_json=json.loads(requests.get(dr5hn_countries_url).content.decode(';utf8';))countries2=Set([c[';Name&39;]for c in Countries2_json])cities2=set([c[';Name&39;]for c in cities2_json])Countries=Countries2.Union(Countries1)Cities=cities2.Union(Cities1)。

从FlashText导入KeywordProcessorkeyword_Processor=KeywordProcessor(case_sensitive=False)keyword_processor.add_keywords_from_list(sorted(countries))keyword_processor.add_keywords_from_list(sorted(cities))texts=[';纽约到意大利威尼斯,费用为271;,#39;;从布鲁塞尔到曼谷的阿提哈德往返航班,从洛杉矶到墨西哥瓜达拉哈拉,费用191&39;,#39;从巴黎飞往澳大利亚和新西兰,回程422英镑,包括2个托运行李&39英镑;]keyword_processor.Extract_关键字(TEXTS[0])。

好的,要进行更多的理智检查,我们只需在城市列表中寻找约克就可以了。

>;>;>;[在城市中,如果c;york&39;in c.low()][';Yorklyn&39;,';Yorklyn&39;,';york;West York&39;,';yorktown Heights';,';约克郡东部骑马约克半岛;约克半岛;yorke;yorke;yorke半岛';,';yorke;yorke半岛';,';yorke;yorke;yorke半岛。纽约东部;约克维尔;约克城;约克顿;纽约东部;约克维尔;约克城;约克顿;纽约东部;约克维尔;约克镇;纽约东部;约克维尔;约克顿;纽约东部;约克维尔;约克镇;约克顿;约克镇;纽约市约克城,约克海滩,约克郡,北约克郡,约克斯克诺布,约克斯克诺布,约克郡约克郡,约克郡[约克郡,约克斯克诺布,约克镇,约克港,约克郡北约克郡,约克郡北约克郡,约克斯克诺布#39;,#39;约克城#39;,#39;约克港,#39;约克郡,#39;约克郡,#39;约克郡,#39;约克郡。

语言学家:欢迎来到自然语言处理的世界,在这个世界里,自然语言是一种社会结构,主观上受社区和个体差异的影响。

NLP实践者(一个真正的NLP实践者,在嘈杂的用户生成的文本上工作):您只需添加到列表中即可。但在此之前,请根据您已有的列表检查您的指标。

对于您的样本测试集中的每个文本,您应该提供一些真理标签,以确保您可以测量您的度量标准。

从itertools导入zip_long从FlashText导入KeywordProcessorkeyword_Processor=KeywordProcessor(case_sensitive=False)keyword_processor.add_keywords_from_list(sorted(countries))keyword_processor.add_keywords_from_list(sorted(cities))texts_labels=[(';纽约到意大利威尼斯,用于271&39;,(';纽约,';威尼斯&39;,';意大利&39;)),(';从布鲁塞尔到曼谷的阿提哈德往返航班,从巴黎飞往澳大利亚新西兰,从巴黎飞往澳大利亚新西兰,包括2个托运行李,从洛杉矶到墨西哥瓜达拉哈拉的往返航班为191&39;,(#39;洛杉矶,#39;瓜达拉哈拉),(#39;布鲁塞尔,#39;,#39;曼谷),(#39;从洛杉矶到墨西哥瓜达拉哈拉的往返航班,包括2个托运行李),(#39;从布鲁塞尔到曼谷的阿提哈德往返航班),(从洛杉矶到墨西哥瓜达拉哈拉的往返航班,包括2个托运行李),(#39;从布鲁塞尔到曼谷的阿提哈德往返航班),(从洛杉矶到墨西哥瓜达拉哈拉的往返航班,包括2个托运行李。新西兰(#39;,#39;巴黎))]#No.。正确提取的术语数。TRUE_PORTIALS=0FALSE_PORTURES=0TOTAL_TRUE=0对于文本,TEXTS_LABEL中的标签:EXTECTED=KEYWORD_PROCESOR。EXTRACT_KEYOYS(TEXT)#我们在此做一些假设,即#EXTECTED和TRUE的顺序必须相同。TRUE_PORTIALS+=SUM(1表示e,l in zip_long(已提取,标签),如果e==l)FALSE_POLITIES+=SUM(1对于e,l在zip_long(已提取,标签)中,如果e!=l)TOTAL_TRUE+=len(标签)#仅可视化糖果。打印(文本)打印(提取)打印(标签)打印()。

好的,好的,那么看看上面的方法所犯的错误,很简单,纽约不在城市列表中。

你:看,我做到了!现在我应该喝杯啤酒。语言学家:我住在马拉维怎么样?

是的,如果我们只是尝试一些愚蠢的事情,比如在我们的关键字处理器中添加以";City&34;结尾的城市的关键字,会怎么样?

对于城市中的c:if';City&39;in c.lower()和c.endswith(';City';)和c[:-5]不在城市中:if c[:-5].strie():keyword_processor.add_keyword(c[:-5])print(c[:-5])。

从itertools中导入FlashText中的ZIP_LONGEST导入关键字ProcessorKeyword_Processor=KeywordProcessor(case_sensitive=False)keyword_processor.add_keywords_from_list(sorted(countries))keyword_processor.add_keywords_from_list(sorted(cities))for c in Cities:if';City';in c.lower()和c.endswith(';City';)和c[:-5]不在城市:if c[:-5].strie():keyword_processor.add_keyword(c[:-5])texts_labels=[(';从纽约到意大利威尼斯,使用271';,(';纽约,#39;威尼斯;,#39;意大利#39;)),(';从布鲁塞尔到曼谷的往返航班,阿提哈德从?,407';,(';布鲁塞尔';,#39;曼谷)),(从洛杉矶到墨西哥瓜达拉哈拉,美国191#39;,(#39;洛杉矶,#39;瓜达拉哈拉)),(#39;从巴黎飞往澳大利亚新西兰,来回包括2个托运行李#39;,(';澳大利亚,#39;新西兰&39;)),(#39;回程包括2个托运行李),(';洛杉矶,#39;瓜达拉哈拉;),(##39;从巴黎飞往澳大利亚新西兰,#39;回程包括2个托运行李),(';澳大利亚,#39;新西兰;#39;,#39;我住在佛罗里达#39;,(#39;佛罗里达),(#39;我住在马拉维),(#39;我住在济州#39;,(';济州&39;))]#不,(#39;我住在济州#39;,(';佛罗里达#39;)),(';我住在马拉维#39;,(##39;我住在马拉维)),(##39;我住在济州岛)]#不。正确提取的术语数。TRUE_PORTIALS=0FALSE_PORTURES=0TOTAL_TRUE=0对于文本,TEXTS_LABEL中的标签:EXTECTED=KEYWORD_PROCESOR。EXTRACT_KEYOYS(TEXT)#我们在此做一些假设,即#EXTECTED和TRUE的顺序必须相同。TRUE_PORTIALS+=SUM(1表示e,l in zip_long(已提取,标签),如果e==l)FALSE_POLITIES+=SUM(1对于e,l在zip_long(已提取,标签)中,如果e!=l)TOTAL_TRUE+=len(标签)#仅可视化糖果。打印(文本)打印(提取)打印(标签)打印()。

纽约至意大利威尼斯美国271[#39;纽约,#39;威尼斯,意大利#39;](#39;纽约,#39;威尼斯,意大利#39;)从布鲁塞尔到曼谷的阿提哈德回程航班,从阿提哈德出发,407[#39;布鲁塞尔,#39;曼谷#39;](#39;)从洛杉矶飞往墨西哥瓜达拉哈拉,票价191[#39;洛杉矶,#39;,#39;瓜达拉哈拉;墨西哥](#39;洛杉矶,#39;瓜达拉哈拉#;)从巴黎飞往澳大利亚和新西兰,往返422次,包括2个托运行李[#39;澳大利亚,#39;新西兰#;#]。我住在佛罗里达[佛罗里达]弗罗里达我住在马拉威[#39;马拉维]我住在济州[#39;济州]济州。

但说真的,这只是问题的一角。如果你有这样一句话,会发生什么:

恭喜你,你又陷入了另一个多义的NLP兔子洞,同样的词有不同的意思,在这种情况下,亚当很可能指的是句子中的一个人,但巧合的是它也是一个城市的名称(根据你从中提取的数据)。(根据你提取的数据,亚当很可能指的是句子中的一个人,但也巧合地也是一个城市的名称)。

我看到你在那里做了什么..。即使我们忽略这种多义性的胡说八道,您仍然没有给我想要的输出:

[从纽约到意大利威尼斯的阿提哈德航空公司从布鲁塞尔到曼谷的往返航班,从洛杉矶到墨西哥瓜达拉哈拉的往返航班,从巴黎飞往澳大利亚新西兰,包括2个托运行李。]].[从纽约到意大利威尼斯的往返航班,阿提哈德从洛杉矶到墨西哥瓜达拉哈拉的往返航班,包括2个托运行李。]].[=。

出发地:美国纽约;目的地:意大利威尼斯;出发地:布鲁塞尔;目的地:泰国曼谷;出发地:美国洛杉矶;目的地:墨西哥瓜达拉哈拉;出发地:法国巴黎;目的地:澳大利亚/新西兰(鉴于两个国家,这是一个复杂的案例)

语言学家:即使假设城市前面的介词(如From、To)给了你起点和目的地标签,你怎么处理多航段航班的情况呢?

让我们以您已有的假设为基础,尝试一些相同的FlashText方法。

从itertools中导入FlashText中的ZIP_LONGEST导入关键字ProcessorKeyword_Processor=KeywordProcessor(case_sensitive=False)keyword_processor.add_keywords_from_list(sorted(countries))keyword_processor.add_keywords_from_list(sorted(cities))for c in Cities:if';City';in c.lower()和c.endswith(';City';)和c[:-5]不在城市:if c[:-5].strie():keyword_processor.add_keyword(c[:-5])keyword_processor.add_keyword(';to';)keyword_processor.add_keyword(';from';)texts=[';纽约到意大利威尼斯,使用271';,#39;阿提哈德从布鲁塞尔到曼谷的往返航班。从洛杉矶飞往墨西哥瓜达拉哈拉(Us191';,';);从巴黎飞往澳大利亚和新西兰(从巴黎返回,包括2个托运行李)文本:Extracted=keyword_processor.tract_keyons(Text)print(Text)print(已提取)print(已提取)print()。

从纽约到意大利威尼斯的美国271[纽约,#39;到#39;,#39;威尼斯,意大利;]从布鲁塞尔到曼谷的往返航班,阿提哈德从布鲁塞尔出发,407[#39;从布鲁塞尔,#39;到#39;,#39;曼谷,#39;从#39;,#39;到#39;曼谷,#39;到#39;曼谷,#39;从阿提哈德往返于##39;,#39;布鲁塞尔至##39;,#39;曼谷,#39;从阿提哈德往返曼谷。从洛杉矶到墨西哥瓜达拉哈拉,票价191[#39;,#39;洛杉矶到#39;,#39;瓜达拉哈拉,墨西哥&39;]从巴黎飞往澳大利亚新西兰,回程包括两个托运行李[#39;到#39;澳大利亚,#39;新西兰&39],回程包括两个托运行李。[#39;,#39;到##39;,#39;澳大利亚,#39;,#39;新西兰&39]从巴黎飞往澳大利亚和新西兰的往返航班包括两个托运行李[#39;到#39;,#39;澳大利亚,#39;新西兰&39;][';,#39;到##39;,#39;澳大利亚,#39;新西兰&39;]从巴黎飞往澳大利亚和新西兰。巴黎';,';出自';]。

好的,让我们处理上面的输出,看看我们对问题1做了些什么。也许可以检查From后面的项是否是城市,如果不是,删除To/From?

从itertools中导入FlashText中的ZIP_LONGEST导入关键字ProcessorKeyword_Processor=KeywordProcessor(case_sensitive=False)keyword_processor.add_keywords_from_list(sorted(countries))keyword_processor.add_keywords_from_list(sorted(cities))for c in Cities:if';City';in c.lower()和c.endswith(';City';)和c[:-5]不在城市:if c[:-5].strie():keyword_processor.add_keyword(c[:-5])keyword_processor.add_keyword(';to';)keyword_processor.add_keyword(';from';)texts=[';纽约到意大利威尼斯,使用271';,#39;阿提哈德从布鲁塞尔到曼谷的往返航班。从洛杉矶飞往墨西哥瓜达拉哈拉,从巴黎飞往澳大利亚新西兰,从巴黎返回,包括2个托运的袋子[422]以获取文本文本:Extracted=keyword_processor.Extract_Keyones(Text)print(Text)new_Extracted=[]Extracted_Next=Extracted[1:]for e_i,e_iplus1 in zip_long(Extracted,Extracted_Next):if e_i==&39;from&。和e_iplus1不在城市,e_iplus1不在国家:print(e_i,e_iplus1)从';继续elif e_i==';and e_iplus1==None:#列表中的最后一个单词。继续执行ELSE:new_Extracted.append(E_I)print(New_Extracted)print()。

这似乎起到了作用,将不在城市/国家之前的单词从其中删除。

从纽约到意大利威尼斯271[纽约,#39;到#39;,威尼斯;威尼斯]从布鲁塞尔到曼谷的往返航班,阿提哈德从洛杉矶到瓜德岛,从零开始,从##39;布鲁塞尔,##39;到##39;,#39;曼谷,#39;[#39;]阿提哈德从[##39;,#39;从##39;布鲁塞尔,##39;到##39;,#39;曼谷#39;]从洛杉矶到关岛的阿提哈德往返航班是从布鲁塞尔到曼谷的往返航班,阿提哈德航空公司从洛杉矶到关岛的阿提哈德往返航班为[##39;,##39;到##39;,#39;威尼斯]。瓜达拉哈拉,墨西哥]从巴黎飞往澳大利亚新西兰,422次回程,包括2个托运行李从无[#39;到#39;,#39;澳大利亚,#39;新西兰,#39;从#39;,#39;巴黎#39;飞到新西兰][#39;从#39;,#39;到##39;新西兰&39;,#39;从';,#39;巴黎';][#39;从#39;,#39;到##39;新西兰&39;,#39;从巴黎#39;,#39;从#39;,#39;到##39;新西兰#39;,#39;新西兰][#39;,#39;从#39;,#39;巴黎##39;]]

语言学家:仔细想想,是否应该通过在知情的情况下做出决定,让歧义短语变得明显,从而解决歧义呢?如果是这样的话,知情决定中的信息是什么?是否应该先按照某个模板检测信息,然后再填写歧义?

你:我对你已经失去耐心了……。你让我转了一圈又一圈,我一直从新闻、谷歌和Facebook等媒体上听到的能听懂人类语言的人工智能在哪里?!

你:你给我的是基于规则的,所有这些中的人工智能在哪里?

NLP从业者:你不是想要百分之百吗?编写业务逻辑或基于规则的系统将是真正实现这一目标的唯一途径,因为给定的特定数据集没有任何可用于训练人工智能的预设数据集。

你:你说训练人工智能是什么意思?为什么我不能直接使用谷歌、Facebook、亚马逊、微软甚至IBM的人工智能呢?

是的,没有真正现成的神奇解决方案,如果你想使用人工智能或机器学习算法,你很可能需要更多的训练数据,比如上面例子中显示的text_labels对。

对(事后看来)可能是个糟糕问题的奇妙回答。邮箱:Bravo@Alvas-Merv Merzoug。

最好的答案。哇,阿尔瓦斯。你刚刚去找了核心人物。我喜欢读你的回答--乔伊什

尽管有所有的缺陷、错误和可疑的方向-这就是StackOverflow仍然闪耀的地方:看到魔术师在工作。++-1月1日。

点击“发布您的答案”,即表示您同意我们的服务条款、隐私政策和Cookie政策。

不是你想要的答案吗?浏览标记的其他问题或提出您自己的问题。