从头开始使用Stanford NLP从文本中提取实体

本文适用于从未与Stanford nlp合作过并且需要研究和尽快应用的人。

该软件非常普遍,特别是我们的公司BaltInfoCom使用此程序。

首先,您需要了解一件简单的事情:Stanford NLP基于注释单词的原理,即一个或多个注释,例如POS(词性-词性),NER(命名实体识别-命名实体)和等

初学者在“ 快速入门”部分访问Stanford NLP网站时首先看到的是以下设计:

Properties props = new Properties(); props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,regexner,parse,depparse,coref"); StanfordCoreNLP pipeline = new StanfordCoreNLP(props); // create a document object CoreDocument document = new CoreDocument(text); // annnotate the document pipeline.annotate(document); 

StanfordCoreNLP在这里是一个传送带,我们的文本预先输入到该传送带中,打包为一个CoreDocument对象。 StanfordCoreNLP,这是整个结构中最重要且经常使用的对象,所有主要工作都通过该对象完成。

首先,我们在StanfordCoreNLP中设置参数并指出我们需要执行哪些操作。 此外,这些参数的所有可能组合都可以在链接的官方网站上找到。

  • 标记化-因此,标记化
  • 拆分-拆分为一个句子
  • pos-词性的定义
  • 引理-向每个单词添加其初始形式
  • ner-命名实体的定义,例如“组织”,“面孔”等。
  • regexner-使用正则表达式定义命名实体
  • 解析-根据语义(性别,数字等)分析每个单词
  • depparse-解析句子中单词之间的语法依赖性
  • coref-在文本中搜索对相同命名实体的引用,例如“ Mary”和“ she”

这是一个注释器(解析和分离)如何协同工作的示例:

图片

如果您不了解有关标记的注释,则可以在这些站点上找到它们的含义: 句子中的连接 含义,词性的含义

对于这些参数中的每一个,您都可以在“注释器”部分中找到其他标志,以进行更精细的调整。

如果要使用内置的Stanford NLP模型,则可以设置这些结构,但是也可以使用addAnnotator(Annotator ...)方法或在创建StanfordCoreNLP对象之前补充参数来手动设置它们。

现在介绍如何从文本中提取命名实体。 为此,Stanford NLP具有三个内置的基于正则表达式的类和一个用于通过模型标记标记的类。

正则表达式类:

  • TokensRegexAnnotator-按规则工作的注释器-SequenceMatchRules
    考虑一个基于这些规则的映射示例。

     ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" } $EMAIL = "/.*([A-z0-9-]+?)(@)([A-z0-9-]+?).*/" { ruleType: "tokens", pattern: (([]) ($EMAIL)), action: (Annotate($0, ner, "MAIL")), priority:0 } 

    第一行指出我们将在此模板中填充哪种类型的标签。
    在第二个中,我们创建一个变量,根据规则,该变量应以“ $”字符开头,并在该行的开头。

    之后,创建一个块,在其中设置规则的类型。 然后是一个用于比较的模板(在我们的例子中,我们说我们需要“ []”-后面带有变量$ EMAIL的任何令牌。在此之后,我们设置操作,在本例中,我们要对令牌进行注释。

    请注意,在示例中,“ []”和“ $ EMAIL”用括号括起来,因为$ 0表示我们要从找到的模板中突出显示哪个捕获组,而捕获组表示用括号括起来的组。 如果设置为0,则在短语“ sobaka@mail.ru mail”中,所有标记都将被注释为“ MAIL”。 如果设置1(即第一个捕获组),则仅对单词“ mail”进行注释; 如果为2,则只有sobaka@mail.ru。

    对于根据两个规则可以对同一令牌进行不同定义的情况,可以设置规则相对于另一个规则的优先级。 例如,在以下短语“ House $ 25”的情况下,可能有两个相互冲突的规则,根据其中一个规则,将数字25确定为房屋编号,根据第二个规则,将其编号确定为房屋编号。
  • RegexNERAnnotator-此注释器使用RegexNERSequenceClassifier

    为他映射如下

     regex1 TYPE overwritableType1,Type2... priority 

    这里regex1是一个正则表达式,格式为TokenSequencePattern

    TYPE是命名实体的名称。
    overwritableType1,Type2 ...-在有争议的情况下可以替换的类型。
    优先级-上述争议的优先级。
    请注意,在此映射中,所有列都必须由制表符分隔。
  • 代币RegexNERAnnotator
    该注释器与前一个注释器的不同之处在于,它使用TokensRegex库存储正则表达式,与第一个注释器相同,它允许您使用更灵活的规则进行匹配。 以及能够记录NER标签以外的标签值。
    它的映射根据RegexNERAnnotator的规则进行编译

使用NERClassifierCombiner通过模型标记文本
为了使用此类,您必须首先拥有或训练模型。

如何做到这一点可以在这里找到;
训练模型后,仅创建NERClassifierCombiner(指示模型中的路径)并调用classify方法即可。

 NERClassifierCombiner classifier = new NERClassifierCombiner(false, false, serialized_model); String text = "Some lucky people working in BaltInfoCom Org."; List<List<CoreLabel>> out = classifier.classify(text); 

注释器的完整列表可以在这里找到。

除上述内容外,如果您需要将Stanford NLP用于俄语,我也建议您来这里 。 有一些用于识别语音部分(pos-tagger)和用于识别句子中的关系(相关性解析器)的模型。

此处表示的标签类型:
Russian-ud-pos.tagger只是一个标记器,
Russian-ud-mfmini.tagger-具有形态特征的主要列表,
russian-ud-mf.tagger-具有形态特征的完整列表,有关映射的示例,请参见此处

Source: https://habr.com/ru/post/zh-CN414175/


All Articles