我可以使用Spacy NER模型提取人名,但它包括律师/警察/或其他所有人。我的问题是根据新闻文章提取被告/被定罪/或犯下罪行的人的名字。
例如下面的nes文章https://www.channelnewsasia.com/news/world/turkey-frees-opposition-figure-pending-terrorism-trial---anadolu-11095480
安卡拉:国有的阿纳多卢通讯社称,土耳其一家法院周一下令保释一名前反对派议员,当时他正因恐怖主义相关指控接受审判。
埃伦·埃尔德姆在2018年年中的选举中失去了席位,该选举授予总统塔伊普·埃尔多安全面的新权力。自6月以来,他一直被监禁,并被指控在2014年担任反对派报纸编辑期间发布非法窃听信息。
他否认协助美国神职人员费特胡拉·居伦追随者的指控,后者被指控策划了2016年一场失败的政变。
Eren Erdem是主要被告,我只需要这个名字,但Spacy模型提取了所有人的名字塔伊普·埃尔多安(总统)费特胡拉·居伦Enis BerberogluTuvan Gumrukcuetc
我需要罪犯的名字,而不是总统或警察。
我们可以使用Python/NER吗?
编辑:我们可以在这里应用知识图的概念吗?我探索了很多,但找不到关于这个案例的令人信服的文章。如果有人能深入了解这个概念或提供文章链接(相关),那就太好了。
首先,你必须问问自己,文本的读者是如何识别罪犯的。代表罪犯的专有名词具有动词的论证功能(可以是"他是罪犯"中的连接动词,也可以是语义更复杂的动词,如"该男子2年前也犯下谋杀罪")。这种论证功能(在例子中是"主体")完美地确定了犯罪实体。你要做的是:
- 识别包含罪犯的句子,包括动词的所谓子类别框架(给出论据,例如"主题"、"对象"等)
- 解析句子,使自变量可访问(使用nltk或spaCy)并使用NER
- 提取实体,该实体既被NER识别,又被论点位置的动词子分类,该论点位置将罪犯的角色分配给实体
- 如有必要,当使用人称代词时,执行回指解析,该回指解析需要与代词所指的实体相匹配(你可以将其想象为代词的某种参照链)
实际上,没有现成的模型,而是一个语言管道每个单独的步骤都有实现。对于任何更详细的内容,您确实需要粘贴一些代码来回答实现管道上的直接问题。
你可以使用机器学习,但为此你需要执行步骤1和2,所以最好先试试这些步骤。
我还在我的项目中使用spacy来提取受害者的名字,我还得到了很多非受害者的名字——比如警察、医生、嫌疑人等。像spacy这样的工具非常有用,但你也需要帮助它,以确定你想提取哪种类型的PERSON实体。要过滤掉我想要的名字,我要做的是:
- 分析文章并识别一些常见模式。通常,来自相同来源的文章采用相同的格式。在你的案例中,我查看了给定网站上的几篇文章,其格式如下:"嫌疑人姓名、年龄、被指控/被捕/其他同义词"或"嫌疑人姓名,谁,被指控/逮捕/其他同义语"。这是犯罪相关文章的常见格式。当然,也可能有其他格式,但不太可能有太多,因为这些网站通常遵循特定的标准,或者文章是由少数作者撰写的
你从中看到了什么模式?这是因为有可疑名字的句子通常被分为三块。[1]第一个是后面跟着逗号的名字,[2]第二个是数字(年龄)或以"谁"开头的描述,后面跟着逗号,[3]第三个包括类似于"逮捕"的动词,如逮捕、监禁、被告等。
在你的例子中:"[1]Eren Erdem,[2]在2018年年中的选举中失去了席位,授予总统塔伊普·埃尔多安全面的新权力,[3]自6月以来一直被监禁,并被指控在2014年担任反对派报纸编辑期间发布非法窃听信息。
-
使用正则表达式仅捕获具有此模式的短语。在Python中:
进口再对于finditer中的结果(r'(\w+\w+\w+){1,5},\swho\s(\w++\w+){0,20},\s(\w++){0,5}(被捕|入狱)\s(\w+\w+){0,10}',text,flags=re.I):print(result.group())#将其传递给spacyprint(result.group().split(",")[0])#或此
您可以使用机器学习,但总会有一些结果需要调整。你也可以利用得分。如果文章是关于嫌疑人的,那么出现最多的PERSON实体通常是嫌疑人本人,其他实体可能只被提及几次,有时只被提及一次。