Python 为什么。当我调用函数时,ents没有以正确的方式工作
当我运行这个程序时,Python 为什么。当我调用函数时,ents没有以正确的方式工作,python,nltk,spacy,Python,Nltk,Spacy,当我运行这个程序时,打印nlp(输入字符串)工作正常。但是当它执行行“doc\u entities=doc.ents”时 它删除了上面三行,其中包含名称mobile和email以及 我想从中提取名称 问题在哪里?“doc\u entities=doc.ents”没有以正确的方式工作,或者是什么?所以我稍微重写了您的示例,使其更简单一些,对我来说效果很好。我认为您遇到的许多问题可能与嵌套筛选和字符串操作有关,您可以轻松删除这些操作,因为spaCy已经为您完成了所有这些 这里,我只是在文本中找到的实
打印nlp(输入字符串)
工作正常。但是当它执行行“doc\u entities=doc.ents”时
问题在哪里?
“doc\u entities=doc.ents”
没有以正确的方式工作,或者是什么?所以我稍微重写了您的示例,使其更简单一些,对我来说效果很好。我认为您遇到的许多问题可能与嵌套筛选和字符串操作有关,您可以轻松删除这些操作,因为spaCy已经为您完成了所有这些
这里,我只是在文本中找到的实体上进行迭代,如果实体标签是PERSON
,并且实体由两个或多个标记组成,我们假设它是人名并打印实体文本。doc.ents
中的每个条目都是一个Span
对象,其长度是令牌的长度。因此无需拆分字符串–只需使用len(ent)
当然,只有spaCy的模型真正将该名称识别为实体时,才会返回结果。默认模型是针对通用新闻和web文本进行培训的,因此,如果您正在处理简历,如果不对用例进行微调,您可能无法始终获得完美的结果
您的问题并不完全清楚您想对电话号码或电子邮件地址做什么,但所有这些信息仍将在您的文档中提供。例如,假设您还想提取电子邮件地址,最简单的方法是在令牌上使用like_email
属性:
nlp = spacy.load('en_core_web_sm')
doc = nlp(u"John Smith") # or whatever else
for ent in doc.ents:
if ent.label_ == 'PERSON' and len(ent) >= 2:
print('The candidate name is: ', ent.text) # do something with the entity
您建议我们如何在没有输入字符串或nlp
的情况下调试此文件?同样,不知道您的文件.txt
是什么样子。@erip这是我的文本文件,我不确定这是否是问题所在,由于多个过滤器
s使示例有点难以理解–但请记住,doc.ents
返回的是生成器而不是列表,因此在开始从中提取之前,您可能希望将其包装到列表list(doc.ents)
中以创建副本。如果你用一个更直接的for
循环替换doc\u persons
提取,可能会使你的代码更容易调试——至少在你解决问题之前是这样(当然,这主要取决于个人偏好)。@InesMontani我尝试过lis(doc.ents)但产量不变,非常感谢。但当我把doc=nlp(u“Jay Pratap Pandey”)放进去时,它不会返回任何东西。是的,这是绝对可能的——模型是统计的,它们识别的实体取决于它们接受培训的数据。因此,训练语料库可能包含了很多类似于“约翰·史密斯”的名字,但没有足够多类似于“杰伊·普拉塔普·潘迪”的名字——因此该模型目前无法预测它是一个人
实体。您可以使用更多类似于应用程序需要识别的名称的示例进行研究。
nlp = spacy.load('en_core_web_sm')
doc = nlp(u"John Smith") # or whatever else
for ent in doc.ents:
if ent.label_ == 'PERSON' and len(ent) >= 2:
print('The candidate name is: ', ent.text) # do something with the entity
doc = nlp(u"John Smith, john@smith.com")
email_addresses = [token.text for token in doc if token.like_email]
# ['john@smith.com']