我正在尝试使用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的名为实体标记器的包装器)。 编辑:如果只想提取连续命名实体的运行(上面的选项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
大约是三个城市,而不是一个。
我在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抑制异常 - pythonfrom 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…