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

斯坦福NLP:OutOfMemoryError

弓胜泫
2023-03-14

我正在注释和分析一系列文本文件。

pipeline.annotate方法每次读取文件时都会变得越来越慢。最终,我得到了一个OutOfMemoryError。

管道初始化一次:

protected void initializeNlp()
{
    Log.getLogger().debug("Starting Stanford NLP");


    // creates a StanfordCoreNLP object, with POS tagging, lemmatization,
    // NER, parsing, and
    Properties props = new Properties();

    props.put("annotators", "tokenize, ssplit, pos, lemma, ner, regexner, depparse,  natlog,  openie");
    props.put("regexner.mapping", namedEntityPropertiesPath);

    pipeline = new StanfordCoreNLP(props);


    Log.getLogger().debug("\n\n\nStarted Stanford NLP Successfully\n\n\n");
}

然后,我使用相同的管道实例处理每个文件(如SO和斯坦福大学在其他地方推荐的)。

     public void processFile(Path file)
{
    try
    {
        Instant start = Instant.now();

        Annotation document = new Annotation(cleanString);
        Log.getLogger().info("ANNOTATE");
        pipeline.annotate(document);
        Long millis= Duration.between(start, Instant.now()).toMillis();
        Log.getLogger().info("Annotation Duration in millis: "+millis);

        AnalyzedFile af = AnalyzedFileFactory.getAnalyzedFile(AnalyzedFileFactory.GENERIC_JOB_POST, file);

        processSentences(af, document);

        Log.getLogger().info("\n\n\nFile Processing Complete\n\n\n\n\n");



        Long millis1= Duration.between(start, Instant.now()).toMillis();
        Log.getLogger().info("Total Duration in millis: "+millis1);

        allFiles.put(file.toUri().toString(), af);


    }
    catch (Exception e)
    {
        Log.getLogger().debug(e.getMessage(), e);
    }

}

明确地说,我希望问题出在我的配置上。但是,我确信失速和内存问题发生在pipeline.annotate(file)方法上。

在处理每个文件后,我会处理除管道(例如CoreLabel)之外的所有对斯坦福NLP对象的引用。也就是说,在我的代码中,除了方法级别之外,我不保留对任何斯坦福对象的引用。

任何提示或指导都将不胜感激

共有1个答案

秦胡媚
2023-03-14

好的,问题的最后一句话让我仔细检查了一下。答案是我在自己的一门课上一直引用CoreMap。换句话说,我在记忆中保留了语料库中每个句子的所有树、标记和其他分析。

简言之,将StanfordNLP CoreMaps保留一定数量的句子,然后进行处置。

(我想一个核心计算语言学家会说,一旦分析了CoreMap,就很少需要保留它,但我必须在这里声明我的新手身份)

 类似资料:
  • 我在使用Stanford pipeline(CoreNLP的最后一个版本)解析BNC时遇到了一个问题。 解析器只是停留在这个句子中,它甚至不会抛出错误。句子在web界面中得到正确的解析。 我尝试了标记器的选项,但没有结果。 我添加了我正在使用的命令行:java[...]edu.stanford.nlp.pipeline.stanfordCorenlp-注释器tokenize,ssplit,pos,

  • 我假设我试图将输出转换成的格式是旧版本的CorenLP的默认输出。有什么方法可以得到所需格式的输出吗?

  • 试图运行示例,但我一直无法打开“english-left3words-distsim.tagger”文件可能丢失。文件没有丢失,目录指向模型jar文件的位置,路径:edu\stanford\nlp\模型\pos-tagger\english-left3word在jar文件中是正确的。 我使用3.7.0,安装从nuget在视觉工作室2015. 代码如下: 我确实在Stack上看到了一个类似的问题,他

  • 这是意料之中的行为吗?我在前面运行完整的管道吗?

  • 我使用StanfordNLP来标记用智能手机编写的一组消息。这些文本有很多拼写错误,不遵守标点符号规则。通常,空格缺失会影响标记化。 例如,以下句子漏掉了“California.This”和“university,founded”中的空格。 斯坦福大学位于加利福尼亚州,这所大学是一所伟大的大学,创建于1891年。 标记器返回: {“斯坦福”、“大学”、“是”、“位于”、“加利福尼亚州”。这个”、“

  • 我对这两个软件包做了一些比较,不确定应该朝哪个方向发展。我想简要介绍的是: 命名实体识别(人员、地点、组织等) 据我所知,OpenNLP和Stanford CoreNLP公开了非常相似的功能。然而,斯坦福大学的CoreNLP看起来有更多的活动,而OpenNLP在过去六个月里只有几次提交。 根据我所看到的,OpenNLP似乎更容易训练新的模型,仅仅因为这个原因可能更具吸引力。然而,我的问题是,其他人