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

我正在尝试使用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发现的link,很显然,受过训练的斯坦福标记器(至少在2012年发布)并不对名为的实体进行分块。从the accepted answer:

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

您有以下选择:

  • 收集带有相同标签的单词;例如,所有标记为PERSON的相邻单词应一起作为一个命名实体。这很容易,但是当然有时会组合不同的命名实体。 (例如New York, Boston [and] Baltimore大约是三个城市,而不是一个城市。)编辑:这是Alvas的代码在公认的答案中所做的。参见下面的简单实现。
  • 使用nltk.ne_recognize()。它不使用斯坦福识别器,但使用大块实体。 (它是一个围绕IOB的名为实体标记器的包装器)。
  • 在斯坦福标记器返回的结果的基础上找出一种方法来进行自己的分块。
  • 针对您感兴趣的域训练您自己的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大约是三个城市,而不是一个。

    在返回'Response'(Python)中传递多个参数 - python

    我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

    Python exchangelib在子文件夹中读取邮件 - python

    我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

    R'relaimpo'软件包的Python端口 - python

    我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

    Python ThreadPoolExecutor抑制异常 - python

    from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

    如何用'-'解析字符串到节点js本地脚本? - python

    我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…