我有一个字符串(句子)列表,可能包含一个或多个荷兰城市名称。我还有一份荷兰城市名单及其各种拼写。我目前正在使用Python,但使用其他语言的解决方案也可以。
检索句子中提到的城市列表的最佳和最有效的方法是什么?
我现在所做的是循环遍历句子列表,然后在该循环内循环遍历城市列表并逐一检查是否
place_name in sentence.lower()
,所以我有:
for sentence in sentences:
for place_name in place_names:
if place_name in sentence.lower():
places[place_name] = places[place_name] + 1
这是最有效的方法吗?我也遇到了像#E;" Ee"存在于荷兰,而且这些词语带有" ee"在他们中很常见。现在我只是通过检查if place_name + ' ' in sentence.lower()
来解决这个问题,但这当然是次优和丑陋的,因为它也会忽略像阿姆斯特丹和#34; Huis这样的句子,因为它并没有结束一个空间,它也不会很好地与标点符号一起使用。我尝试使用正则表达式,但这当然太慢了。是否有更好的方法来解决这个特定问题,或者解决这个问题?我有点倾向于NLP解决方案,但我也觉得这将是一个巨大的矫枉过正。
答案 0 :(得分:4)
您可以查看Named Entity Recognition解决方案。这也可以在nltk
中完成,但此处是Spacy中的示例 - 城市将标有GPE
个标签(GPE
代表“地缘政治实体”,如国家/地区,州,城市等):
import spacy
nlp = spacy.load('en_core_web_lg')
doc = nlp(u'Some company is looking at buying an Amsterdam startup for $1 billion')
for ent in doc.ents:
print(ent.text, ent.label_)
打印:
Amsterdam GPE
$1 billion MONEY