Java 如何识别低大小写的命名实体,例如CoreNLP的kobe bryant?

Java 如何识别低大小写的命名实体,例如CoreNLP的kobe bryant?,java,stanford-nlp,Java,Stanford Nlp,我遇到了一个问题,CoreNLP只能识别以大写字符开头的命名实体,例如Kobe Bryant,但不能识别Kobe Bryant是个人!!!那么如何通过CoreNLP识别以小写字符开头的命名实体呢????谢谢你 首先,你必须承认,与正式文本相比,在小写或大小写不一致的英文文本中很难正确地获得命名实体,因为正式文本中大写字母是一个很好的线索。(这也是中文NER比英文NER难的一个原因。)然而,要让CoreNLP很好地处理小写文本,您必须做一些事情——默认模型经过培训,能够很好地处理编辑良好的文本 如

我遇到了一个问题,CoreNLP只能识别以大写字符开头的命名实体,例如Kobe Bryant,但不能识别Kobe Bryant是个人!!!那么如何通过CoreNLP识别以小写字符开头的命名实体呢????谢谢你

首先,你必须承认,与正式文本相比,在小写或大小写不一致的英文文本中很难正确地获得命名实体,因为正式文本中大写字母是一个很好的线索。(这也是中文NER比英文NER难的一个原因。)然而,要让CoreNLP很好地处理小写文本,您必须做一些事情——默认模型经过培训,能够很好地处理编辑良好的文本

如果您使用的是经过正确编辑的文本,则应使用我们的默认英文模型。如果您正在处理的文本(主要)是小写或大写,那么您应该使用以下两种解决方案之一。如果它是一个真正的混合体(就像许多社交媒体文本),您可以使用下面的truecaser解决方案,或者您可以同时使用cased和Less NER模型(作为
NER.model
属性的一长串模型)来获得

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

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

总的来说,我们不清楚这些方法中的一种是否通常或总是获胜。两种都可以

重要提示:要使下面调用的额外组件可用,您需要下载并在类路径上可用

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

% 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   _   _
相反,您可以在词性标记和NER之前运行TrueCasting:

% 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   _   _

现在,组织被识别了,通常几乎所有的实体词都被标记为具有正确实体标签的专有名词,但它没有得到ball,ball仍然是一个普通名词。当然,在没有大小写的文本中,这是一个相当难理解的词,因为ball是一个非常常见的名词。

我已经研究了一段时间NER问题,在我看来,使用斯坦福NLP的trucase是一个更好的解决方案。然而,仍然会有一些问题,truecase不能正确地注释一个句子。 除了上面的例子,trucase似乎在努力处理现在时句子。 比如说,

“布伦达·埃尔西把这件事告诉了萨莉·詹金斯。”

trucase能认出Brenda Elsey和Sally Jenkins

如果是

布伦达·艾尔西告诉萨利·詹金斯这件事

只有布伦达和萨莉·詹金斯才能得到

如果是

布伦达·艾尔西为此烧死了萨利·詹金斯


然后是Brenda和Burns Sally Jenkins。

您可能对这篇论文感兴趣(被EMNLP 2019接受):

在本文中,我们尝试了几种不同的方法来处理这个问题(包括上面@christopher manning提到的2种方法)。TLDR的主要收获包括:

  • 在测试数据上使用truecaser是个坏主意,因为truecaser的性能比您想象的要差
  • 无壳模型工作得很好
  • 但总的来说,最好的选择是使用无案例的培训数据(只需
    train_data.lower()
    )扩充原始培训数据,并重新培训模型
    从那以后,真实的情况似乎有所改善。重新运行这个,它正确地大写“ball”。耶,NLP的进展!