静音 Stanford coreNLP 日志记录

Mute Stanford coreNLP logging

首先,Java不是我常用的语言,所以我很基础。我需要在这个特定的项目中使用它,所以请耐心等待,如果我遗漏了任何相关信息,请索取,我很乐意提供。

我已经能够实现 coreNLP,并且看起来它工作正常,但是生成了很多消息,例如:

ene 20, 2017 10:38:42 AM edu.stanford.nlp.process.PTBLexer next
ADVERTENCIA: Untokenizable: 【 (U+3010, decimal: 12304)

经过一些研究(文档,google,此处的其他线程),我 认为(抱歉,我不知道如何确定)coreNLP在我的类路径中找到 slf4j-api.jar,并通过它登录。

我可以使用 JVM 的哪些属性来设置要打印的消息的日志记录级别?

此外,我可以在哪个 .properties 文件中设置它们? (我的项目资源文件夹中已经有一个 commons-logging.properties、一个 simplelog.properties 和一个 StanfordCoreNLP.properties 来设置其他包的属性。

如果我理解你的问题,你想在程序执行时禁用所有 StanfordNLP 日志消息。

您可以禁用日志消息。 Redwood 日志框架被用作 Stanford NLP 中的日志框架。首先,清除 Redwood 的默认配置(以显示日志消息),然后创建 StanfordNLP 管道。

import edu.stanford.nlp.util.logging.RedwoodConfiguration;
RedwoodConfiguration.current().clear().apply();
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);

希望对您有所帮助。

Om 的回答很好,但还有两个可能有用的方法:

  • 如果只是来自分词器的这些警告让您感到厌烦,您可以(在代码中或在 StanfordCoreNLP.properties 中)设置 属性 让它们消失:props.setProperty("tokenize.options", "untokenizable=NoneKeep");.
  • 如果 slf4j 在类路径中,那么默认情况下,我们自己的 Redwoods 记录器确实会通过 slf4j 进行记录。因此,您还可以使用 slf4j 设置日志记录级别。

根据Christopher Manning的建议,我遵循了这个link How to configure slf4j-simple

我用 org.slf4j.simpleLogger.defaultLogLevel=warn.

行创建了一个文件 src/simplelogger.properties

我可以通过将空白输出流设置为系统错误流来解决它。

System.setErr(new PrintStream(new BlankOutputStream())); // set blank error stream
// ... Add annotators ...
System.setErr(System.err); // Reset to default

伴随class是

public class BlankOutputStream extends OutputStream {

    @Override
    public void write(int b) throws IOException {
        // Do nothing
    }

}

Om 的回答禁用了所有日志记录。但是,如果您仍希望记录错误,请使用:

RedwoodConfiguration.errorLevel().apply();

我还使用 jdk 日志而不是 slf4j 日志来避免加载 slfj 依赖项,如下所示:

RedwoodConfiguration.javaUtilLogging().apply();

这两个选项可以以任意顺序一起使用。所需的导入是:

import edu.stanford.nlp.util.logging.RedwoodConfiguration;