如何通过CoreNLP识别一个小写的命名实体,如kobe bryant?

时间:2017-07-14 07:46:48

标签: java stanford-nlp

我遇到了一个问题,CoreNLP只能识别像科比·布莱恩特这样的命名实体,它以一个大写字母开头,但是不能认出科比布莱恩特作为一个人!那么如何通过CoreNLP识别以小写字符开头的命名实体????欣赏它!!!!

3 个答案:

答案 0 :(得分:6)

首先,你必须承认,使用小写或不一致的英文文本比使用正式文本更难获得命名实体,大写字母是一个很好的线索。 (这也是为什么中文NER比英语NER更难的一个原因。)尽管如此,你必须做些事情才能让CoreNLP在小写文本上运行得相当好 - 默认模型经过训练,能够很好地处理编辑良好的文本。 / p>

如果您正在使用正确编辑的文本,则应使用我们的默认英语模型。如果您正在使用的文本(主要)是小写或大写,那么您应该使用下面提供的两种解决方案之一。如果它是一个真正的混合(如许多社交媒体文本),您可以使用下面的truecaser解决方案,或者您可以通过使用两个套装和无壳NER模型获得(作为给出的一长串模型ner.model属性。)

方法1:无壳模型。我们还提供忽略案例信息的英语模型。它们将在所有小写文本上更好地工作。

方法2:使用truecaser。我们提供了一个truecase注释器,它试图将文本转换为正式编辑的大写。您可以先应用它,然后使用常规注释器。

一般来说,我们不清楚这些方法中的一种通常或总是获胜。你可以尝试两种方式。

重要提示:要获得下面调用的额外组件,您需要下载the English models jar,并在类路径中使用它。

这是一个例子。我们从示例文本开始:

% cat lakers.txt
lonzo ball talked about kobe bryant after the lakers game.

使用默认模型时,找不到任何实体,并且所有单词都只获得一个通用名词标记。悲哀!

% java edu.stanford.nlp.pipeline.StanfordCoreNLP -file lakers.txt -outputFormat conll -annotators tokenize,ssplit,pos,lemma,ner
% cat lakers.txt.conll 
1   lonzo   lonzo   NN  O   _   _
2   ball    ball    NN  O   _   _
3   talked  talk    VBD O   _   _
4   about   about   IN  O   _   _
5   kobe    kobe    NN  O   _   _
6   bryant  bryant  NN  O   _   _
7   after   after   IN  O   _   _
8   the the DT  O   _   _
9   lakers  laker   NNS O   _   _
10  game    game    NN  O   _   _
11  .   .   .   O   _   _

下面,我们要求使用无壳模型,然后我们做得很好:所有名称单词现在都被识别为专有名词,并且识别出两个人名。但球队名称仍然缺席。

% java edu.stanford.nlp.pipeline.StanfordCoreNLP -outputFormat conll -annotators tokenize,ssplit,pos,lemma,ner -file lakers.txt -pos.model edu/stanford/nlp/models/pos-tagger/english-caseless-left3words-distsim.tagger -ner.model edu/stanford/nlp/models/ner/english.all.3class.caseless.distsim.crf.ser.gz,edu/stanford/nlp/models/ner/english.muc.7class.caseless.distsim.crf.ser.gz,edu/stanford/nlp/models/ner/english.conll.4class.caseless.distsim.crf.ser.gz
% cat lakers.txt.conll 
1   lonzo   lonzo   NNP PERSON  _   _
2   ball    ball    NNP PERSON  _   _
3   talked  talk    VBD O   _   _
4   about   about   IN  O   _   _
5   kobe    kobe    NNP PERSON  _   _
6   bryant  bryant  NNP PERSON  _   _
7   after   after   IN  O   _   _
8   the the DT  O   _   _
9   lakers  lakers  NNPS    O   _   _
10  game    game    NN  O   _   _
11  .   .   .   O   _   _

相反,您可以在POS标记和NER之前运行truecasing:

% java edu.stanford.nlp.pipeline.StanfordCoreNLP -outputFormat conll -annotators tokenize,ssplit,truecase,pos,lemma,ner -file lakers.txt -truecase.overwriteText
% cat lakers.txt.conll 
1   Lonzo   Lonzo   NNP PERSON  _   _
2   ball    ball    NN  O   _   _
3   talked  talk    VBD O   _   _
4   about   about   IN  O   _   _
5   Kobe    Kobe    NNP PERSON  _   _
6   Bryant  Bryant  NNP PERSON  _   _
7   after   after   IN  O   _   _
8   the the DT  O   _   _
9   Lakers  Lakers  NNPS    ORGANIZATION    _   _
10  game    game    NN  O   _   _
11  .   .   .   O   _   _

现在,组织 Lakers 已被识别,并且通常几乎所有实体词都被标记为具有正确实体标签的专有名词,但它无法获得 ball ,这仍然是一个普通的名词。当然,在无壳文本中,这是一个相当难以理解的词,因为 ball 是一个非常频繁的普通名词。

答案 1 :(得分:0)

我研究NER问题已有一段时间了,在我看来,使用Stanford NLP的trucase是更好的解决方案。但是,仍然存在一些问题,truecase无法正确注释句子。 除上述示例外,trucase似乎在处理当前时态句子。 例如,

  

“ brenda elsey告诉了Sally Jenkins。”

trucase可以识别Brenda Elsey和Sally Jenkins。

如果是

  

brenda elsey告诉Sally Jenkins。

它只能得到布伦达和萨莉·詹金斯。

如果是

  

brenda elsey为此烧伤了莎莉詹金斯。

然后得到Brenda和Burns Sally Jenkins。

答案 2 :(得分:0)

您可能对本文感兴趣(EMNLP 2019接受):https://arxiv.org/abs/1903.11222

在本文中,我们尝试了几种解决此确切问题的方法(包括上面@ christopher-manning提到的2种方法)。 TLDR,主要收获是:

  1. 在测试数据上使用Truecaser是一个坏主意,因为Truecaser的性能比您想象的要差。
  2. 无外壳模型运行得很好。
  3. 但是总的来说,最好的选择是用无用的训练数据(仅$500 / (3 / 31) = $5,167 )扩充原始训练数据并重新训练模型。