首先,请参见另一个问题,以设置要从命令行或python调用的Stanford
CoreNLP:nltk:如何防止专有名词的词干。
对于适当的大小写句子,我们看到NER可以正常工作:
>>> from corenlp import StanfordCoreNLP>>> nlp = StanfordCoreNLP('http://localhost:9000')>>> text = ('John Donk works POI Jones wants meet Xyz Corp measuring POI short term performance metrics. '... 'john donk works poi jones wants meet xyz corp measuring poi short term performance metrics')>>> output = nlp.annotate(text, properties={'annotators': 'tokenize,ssplit,pos,ner', 'outputFormat': 'json'})>>> annotated_sent0 = output['sentences'][0]>>> annotated_sent1 = output['sentences'][1]>>> for token in annotated_sent0['tokens']:... print token['word'], token['lemma'], token['pos'], token['ner']... John John NNP PERSonDonk Donk NNP PERSonworks work VBZ OPOI POI NNP ORGANIZATIonJones Jones NNP ORGANIZATIonwants want VBZ Omeet meet VB OXyz Xyz NNP ORGANIZATIonCorp Corp NNP ORGANIZATIonmeasuring measure VBG OPOI poi NN Oshort short JJ Oterm term NN Operformance performance NN Ometrics metric NNS O. . . O
对于小写的句子,您将不会获得
NNPPOS标签或任何NER标签:
>>> for token in annotated_sent1['tokens']:... print token['word'], token['lemma'], token['pos'], token['ner']... john john NN Odonk donk JJ Oworks work NNS Opoi poi VBP Ojones jone NNS Owants want VBZ Omeet meet VB Oxyz xyz NN Ocorp corp NN Omeasuring measure VBG Opoi poi NN Oshort short JJ Oterm term NN Operformance performance NN Ometrics metric NNS O
因此,您的问题应该是:
- 您的NLP应用程序的最终目标是什么?
- 为什么您的输入小写? 是您做的还是提供数据的方式?
回答完这些问题后,您可以继续确定您真正想要使用NER标签做什么,即
如果输入是小写字母,并且是由于构造NLP工具链的原因 ,那么
- 不要那样做!!! 对普通文本执行NER,不会造成您创建的变形。这是因为NER受过普通文本训练,因此在普通文本的上下文中不会真正起作用。
- 还要尝试不要混用来自不同套件的NLP工具,它们通常不能很好地发挥作用,尤其是在NLP工具链的末尾
如果输入是小写字母,因为这就是原始数据的格式 ,则:
注释一小部分数据,或查找小写的注释数据,然后重新训练模型。
- 解决该问题,并使用常规文本训练TrueCaser,然后将TrueCasing模型应用于小写文本。参见https://www.cs.cmu.edu/~llita/papers/lita.truecasing-acl2003.pdf
如果输入有错误的大小写,例如`Some big Some Small但不是全部都是Proper Noun ,则
也尝试使用truecasing解决方案。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)