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”时

  • 它删除了上面三行,其中包含名称mobile和email以及 我想从中提取名称

  • 问题在哪里?
    “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']