我刚开始使用Stanford CoreNLP,我想建立一个定制的NER模型来寻找人.
不幸的是,我没有为意大利人找到一个好的模型.我需要在简历/ CV文档中找到这些实体.
这里的问题是像那些文档可以有不同的结构,例如我可以有:
情况1
- Name: John - Surname: Travolta - Last name: Travolta - Full name: John Travolta (so many labels that can represent the entity of the person i need to extract)
案例2
My name is John Travolta and I was born ...
基本上,我可以有结构化数据(有不同的标签)或我应该找到这些实体的上下文.
这类文件的最佳方法是什么?在这种情况下,maxent模型可以工作吗?
目前,我采用策略来找到左边有东西的模式,右边有东西,按照这种方法我有80/85%找到实体.
例:
Name: John Birthdate: 2000-01-01
这意味着我在模式的左边有"Name:",在右边有一个\n(直到它找到\n).我可以创建一个很长的模式列表.我想到了模式,因为我不需要在"其他"上下文中使用名称.
例如,如果用户在工作经历中写入其他名称,则我不需要它们.因为我在寻找个人名字,而不是其他人.使用这种方法,我可以减少误报,因为我将查看特定模式而不是"一般名称".
这种方法的一个问题是我有一个很大的模式列表(1个模式= 1个正则表达式),所以如果我添加其他模式,它就不能很好地扩展.
如果我可以训练一个具有所有这些模式的NER模型,那将是非常棒的,但我应该使用大量文件来训练它.
案例1的传统(可能是最佳)方法是编写文档分段代码,而案例2是大多数系统的设计目标.您可以搜索谷歌学者的"文档细分",以获得"最佳"方法的一些想法.最常见的(也是最容易实现的)是简单地使用正则表达式,如果文档结构一致,则可以非常有效.其他方法更复杂,但通常在文档结构更加多样化时需要.
您的NER管道至少需要:
预处理/文本标记化.从一些简单的标记化规则开始
文档分段(冒号,破折号,定位标题,任何形式等).我会从正则表达式开始.
POS标签(最好是使用现成的东西,比如使用意大利语的TreeTagger)
NER,一个MaxEnt模型将起作用,其中一些重要的功能是大写,POS标签和可能的字典功能(意大利电话簿?).您将需要一些标记数据.
第一个案件可能是微不足道的,我同意Ozborn的建议.
我想就案例2提出一些建议.
斯坦福NLP提供了一个优秀的英文名称识别器,但可能无法找到所有人名.OpenNLP也提供了不错的表现,但比斯坦福要小得多.还有许多其他实体识别器可用于英语.我将重点关注StanfordNLP,这里有几点需要考虑.
公报.您可以为模型提供名称列表,还可以自定义"公报"条目的匹配方式.斯坦福在设置时还提供了草率匹配选项,允许与公报条目进行部分匹配.部分匹配应该适用于人名.
斯坦福大学建设性地认可实体.如果在文件中,"John Travolta"这样的名称被认可,那么即使它没有关于"Travolta"的任何想法,它也会在同一份文件中得到"Travolta".因此,尽可能多地在文档中附加信息.在熟悉的上下文中添加case-1中识别的名称,例如"我的名字是John Travolta".如果"John Travolta"被案例1中采用的规则所承认.添加虚假句子可以改善召回.
制定培训基准是一个非常昂贵和枯燥的过程; 你应该按照数万个句子的顺序进行注释,以获得不错的测试性能.我相信即使你有一个经过注释的训练数据训练的模型,性能也不会比你实施上述两个步骤更好.
@编辑
由于这个问题的提问者对无监督的基于模式的方法感兴趣,我正在扩展我的答案来讨论这些.
当监督数据不可用时,通常使用称为引导模式学习方法的方法.该算法从一小组感兴趣的种子实例(如书籍列表)开始,并输出更多相同类型的实例.
有关更多信息,请参阅以下资源
SPIED是一种使用上述技术的软件,可供下载和使用.
Sonal Gupta获得博士学位.关于这个话题,她的论文可以在这里找到.
有关此主题的简要介绍,请参阅这些幻灯片.
谢谢