当前位置: 首页 > 面试题库 >

使用NLTK中的Stanford NER Tagger提取人员和组织列表

昌栋
2023-03-14
问题内容

我正在尝试使用Python NLTK中的斯坦福命名实体识别器(NER)提取人员和组织的列表。当我跑步时:

from nltk.tag.stanford import NERTagger
st = NERTagger('/usr/share/stanford-ner/classifiers/all.3class.distsim.crf.ser.gz',
               '/usr/share/stanford-ner/stanford-ner.jar') 
r=st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
print(r)

输出为:

[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'),
('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'),
('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'LOCATION')]

我想要的是从此列表中以这种形式提取所有人员和组织:

Rami Eid
Sony Brook University

我试图遍历元组列表:

for x,y in i:
        if y == 'ORGANIZATION':
            print(x)

但是此代码仅每行打印一个实体:

Sony 
Brook 
University

有了真实的数据,一个句子中可以有多个组织,一个人,那么我该如何限制不同实体之间的界限呢?


问题答案:

感谢@Vaulstein发现的链接,很显然,受过训练的Stanford标记器(至少在2012年发布) 不会对命名实体进行分块
。从接受的答案:

许多NER系统使用更复杂的标签,例如IOB标签,其中B-PERS之类的代码指示人员实体的起始位置。CRFClassifier类和功能工厂支持此类标签,
但我们当前分发的模型(截至2012年)未使用它们。

您有以下选择:

  1. 收集带有相同标签的单词;例如,所有被标记的相邻单词PERSON应一起作为一个命名实体。这很容易,但是当然有时会组合不同的命名实体。(例如New York, Boston [and] Baltimore,大约是三个城市,而不是一个。) 编辑: 这是Alvas的代码在公认的答案中所做的事情。参见下面的简单实现。

  2. 使用nltk.ne_recognize()。它不使用斯坦福识别器,但使用大块实体。(这是一个围绕IOB的名为实体标记器的包装器)。

  3. 在斯坦福标记器返回的结果的基础上找出一种方法来进行自己的分块。

  4. 为您感兴趣的域训练自己的IOB命名实体分块器(使用Stanford工具或NLTK的框架)。如果您有足够的时间和资源来执行此操作,则可能会获得最佳效果。

编辑: 如果您只想提取连续命名实体的运行(上述选项1),则应使用itertools.groupby

from itertools import groupby
for tag, chunk in groupby(netagged_words, lambda x:x[1]):
    if tag != "O":
        print("%-12s"%tag, " ".join(w for w, t in chunk))

如果netagged_words(word, type)您的问题中的元组列表,则会产生:

PERSON       Rami Eid
ORGANIZATION Stony Brook University
LOCATION     NY

再次注意,如果两个相同类型的命名实体彼此相邻出现,则此方法会将它们组合在一起。例如New York, Boston [and] Baltimore大约三个城市,而不是一个。



 类似资料:
  • 问题内容: 我正在尝试从文本中提取人名。 有人有推荐的方法吗? 这就是我尝试过的(下面的代码):我正在使用查找所有标记为人的东西,然后生成该人所有NNP部分的列表。我正在跳过只有一个NNP可以避免抓住一个姓氏的人。 我得到了不错的结果,但是想知道是否有更好的方法来解决这个问题。 码: 输出: 除了维珍银河,这都是有效的输出。当然,在本文中了解维珍银河不是人的名字是很困难的(也许是不可能的)部分。

  • 工作SPARQL查询: 如何克服这个问题。

  • 问题内容: 不久前,SO上有人问如何使用NLTK的wordnet包装器检索给定同义词集的单词列表。这是建议的响应之一: 使用NLTK 3.0运行此代码将产生。 我尝试了每个先前提出的解决方案(上面链接页面上描述的每个解决方案),但是每个都抛出错误。因此,我想问:NLTK 3.0是否可以为同义词集列表打印单词?我将很感谢其他人在这个问题上可以提供的任何建议。 问题答案: WordNet在NLTK 3

  • 我是新的Python和nltk。我已经将代码从https://gist.github.com/alexbowe/879414转换为下面给定的代码,使其运行于许多文档/文本块。但我得到了以下错误 有人能帮我解决这个问题吗。我必须从数以百万计的产品评论中提取名词短语。我使用了使用Java的Standford NLP工具包,但速度非常慢,所以我认为在python中使用nltk会更好。如果有更好的解决方案

  •      1)   组织架构尽量与实际的企业组织架构相匹配      2)   组织架构尽量不要轻易改动,组织架构涉及到模板的权限范围,架构变了,一些模板的权限需要手动调整      3)   一个人员可以拥有多种角色,主角色尽量只设一个,其它角色设置为兼职模式      4)   人员名称和登陆名都在系统人员设置中不能重复,同名同姓的人员需要加后缀来区别      5)   人员尽量不要删除,可

  • 我想写一个小应用程序来验证GitHub组织的成员。 应用程序应该将具体的GitHub org成员与数据库相匹配。当某个人不在数据库中时,它应该将其从GitHub组织中删除,等等。 我在使用GitHub API时的问题是,下面的请求只列出公共成员身份(因为我没有作为用户进行身份验证,但我不想这样做)。 https://api.github.com/orgs/_orgname_/members?cli