当前位置: 首页 > 知识库问答 >
问题:

动态添加属性到StanfordCoreNLP注释器或管道

濮阳品
2023-03-14

低于我的情况。

我有一个处理文本的类文本处理器。我需要在这样的文本中找到相关的引用,然后用斯坦福大学的OpenIE工具提取信息。我使用这两条管道:

“标记化、ssplit、pos、引理、ner、解析、提及、coref”表示共指。

用于信息提取的“标记化、ssplit、pos、引理、depparse、natlog、openie”。

单独使用它们来分析单个文本需要很多时间,但目前我必须这样做,因为同时使用它们需要大量内存,管道将超出我的内存限制。

public class TextProcessor(){
    Properties props;
    StanfordCoreNLP pipeline;

    public TextProcessor() {
        props = new Properties();
        props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,mention,coref");
        pipeline = new StanfordCoreNLP(props);
    }


    // Performs NER and COREF 
     public void process(String text) {
         Annotation document = new Annotation(malware.getDescription());
         pipeline.annotate(document);

         // Process text (tokenization, pos, lemma, ner, coref)....
     }

     public void extractInformation(String document) {
         props = new Properties();
         props.setProperty("annotators", "tokenize,ssplit,pos,lemma,depparse,natlog,openie");
         pipeline = new StanfordCoreNLP(props);

         Annotation doc = new Annotation(document);
         pipeline.annotate(doc);

         // Extract informations from doc ...
    }

有没有办法把这两条管道动态地连接起来?我是说,像这样的:

1) “标记化、ssplit、pos、引理、ner、depparse、提纲、coref”

2) “标记化、ssplit、pos、引理、ner、depparse、提纲、coref、natlog、openie”。

我试图从第一个方法process(String text)返回一个注释对象,然后在方法extractInformation(String text)中向其添加其他三个属性,如下所示:

     public Annotation process(String text) {
         Annotation document = new Annotation(malware.getDescription());
         pipeline.annotate(document);

         // Process text (tokenization, pos, lemma, ner, coref)....
         return document;
     }

     public void extractInformation(Annotation document) {
         props.setProperty("annotators","depparse,natlog,openie");
         pipeline = new StanfordCoreNLP(props);
         pipeline.annotate(document);

         // Extract informations from doc ...
    }

但是我得到了这个错误:

注释器“depparse”需要注释“TextAnnotation”。此注释器的通常要求是:标记化、ssplit、pos。

我原以为将新的三个属性(depparse、natlog、openie)添加到一个已经注释过的文档(带有tokenize、ssplit、pos)会起作用,但事实并非如此。

那么,有没有办法将这些属性添加到最旧的管道中,避免再次执行所有管道(加上新属性)并避免内存超出其边界?



更新

我所需要做的就是

     public Annotation process(String text) {
         Annotation document = new Annotation(malware.getDescription());
         pipeline.annotate(document);

         // Process text (tokenization, pos, lemma, ner, coref)....
         StanfordCoreNLP.clearAnnotatorPool(); // <-- Added: to get rid of the models and solve the memory issue
         return document;
     }

     public void extractInformation(Annotation document) {
         props.setProperty("annotators","natlog,openie");

         props.setProperty("enforceRequirements", "false") //<-- Added

         pipeline = new StanfordCoreNLP(props);
         pipeline.annotate(document);

         // Extract informations from doc ...
    }

或者,您可以使用:

pipeline = new StanfordCoreNLP(props, false);

在提取信息(注释文档)中。

共有1个答案

湛光华
2023-03-14

听起来像是要构建第一个管道,在一组文档上运行它,清除内存,然后构建第二个管道,在一组文档上运行它。

如果在同一组注释上运行第二个管道,它只会选择第一个管道完成的位置。但是您需要将enforceRequirements设置为false,这样第二条管道就不会崩溃。同样,在使用完第一个管道之后,应该运行StanfordCoreNLP。clearAnnotatorPool()删除模型,否则无法解决内存问题。

 类似资料:
  • 有没有办法动态设置@JsonProperty注释,例如: 或者我可以简单地重命名实例的字段吗?如果是这样,请给我一个主意。此外,可以以何种方式与序列化一起使用?

  • 我想在Angular 7中动态添加div属性。 我尝试了这个: 我有一个错误: 未捕获的错误:模板分析错误:无法绑定到“code ”,因为它不是“div”的已知属性。(" *ngFor="let e of etats。_ embedded . Etats " style = " background:{ { e . codecouleur } }!重要;“[错误-

  • 问题内容: 嗨:在我们的应用程序中,我们已经从数据库中检索了一些数据,例如,表中包含以下字段:id,名称,年龄,地址,电子邮件。 然后,我们将根据客户提供一些这些属性。 如果客户需要ID,名称,我们将获得ID名称;如果客户需要ID,名称,年龄,则将获得ID,名称,年龄。 现在,我们想创建一个包装这些属性的类。但是,我们不知道确切要求哪个字段。 我可以在这里用Class替换地图吗? 问题答案: 如果

  • 问题内容: 这是我想在属性文件中执行的操作 现在我能处理的文件是 有什么办法做这样的事情 问题答案: 您可以使用Apache的共享配置写入和读取属性的文件,特别是setComment()函数中的PropertiesConfigurationLayout它允许您指定每个属性的注释。 请注意,上述链接是指Commons Configuration v1.x,而同时发布了v2.0,它具有不同的程序包名称

  • 我正在尝试在我的java spring项目中的swagger定义中添加新的属性。我已阅读文档并特别 https://springfox.github.io/springfox/docs/snapshot/#plugins 例如,我有这个定义: 我想要: 你能帮我在定义中添加meteo属性吗?在本例中,我的目标是以编程方式添加attribute,而不使用注释。

  • 预期结果:用循环去写,现在是写死的,当长度是2的时候是 obj= _tableArray[nodeList[0]].children[nodeList[1]]