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

如何制作快速斯坦福核心NLP API?

卓星波
2023-03-14
public class StanfordCoreNLPTool {


   public static StanfordCoreNLPTool instance;
   private Annotation annotation = new Annotation();
   private Properties props = new Properties();
   private PrintWriter out = new PrintWriter(System.out);;

   private StanfordCoreNLPTool(){}

   public void startPipeLine(String question){
      props = new Properties();
      props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse,mention,
      dcoref, sentiment");
      annotation = new Annotation(question);
      StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
       // run all the selected Annotators on this text
      pipeline.annotate(annotation);
      pipeline.prettyPrint(annotation, out);
   }

   public static StanfordCoreNLPTool getInstance() {
      if(instance == null){
        synchronized (StanfordCoreNLPTool.class){
            if(instance == null){
                instance = new StanfordCoreNLPTool();
            }
        }
      }
      return instance;
   }
}

它工作得很好,但需要很多时间;假设我们在一个问答系统中使用它,那么对于每一个新的输入,都必须运行pipeAnnotation。正如你所知道的,每次都要提取一些规则,训练一些数据等,以生成一个带有NLP标记的句子,如POS,NER和......

首先,我想用RMI和EJB解决这个问题,但是失败了,因为不管是什么JAVA架构,对于每一个新的句子,pipeAnnotation都应该从头开始学习。查看intellij控制台中打印的日志:

从edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger阅读词性标记器模型...完成[6.1秒]。

从edu/stanford/nlp/models/ner/english.muc.7class.distsim.crf.ser.gz加载分类器...完成[8.7秒]。

从edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz加载分类器...完成[5.0秒]。

信息:阅读25条规则[主]信息edu.stanford.nlp.pipeline.stanfordCorenlp-添加注释器解析[主]信息edu.stanford.nlp.parser.common.parsergrammar--从序列化文件edu/stanford/nlp/models/lexparser/englishpcfg.ser.gz加载解析器...完成[4.1秒]。

请帮助我找到一个解决方案,使程序快速。

共有1个答案

景景胜
2023-03-14

这里最大的问题是,startanNotation()方法将两个应该分开的东西组合在一起:

  1. 构造注释管道,包括加载大型注释器模型
  2. 注释特定文本(一个问题)并打印结果

为了使事情变得更快,这两件事必须分开,因为加载注释管道很慢,但应该只做一次,而注释每一段文本相当快。

    null
 类似资料:
  • 我曾使用grep和awk从斯坦福CRF-NER的“内联XML”中提取英语文本中的命名实体,我希望在其他人类语言中使用相同的更大工作流。 我一直在尝试法语(西班牙语似乎给我带来了一个Java错误,这是另一个故事),并使用我得到标准文本输出,每个句子都有各种类型的注释,包括正确组合在一起的多单词实体,如下所示: 我知道解析它是可能的,但当我真的只是想要整个文件中的实体列表时,这似乎浪费了很多处理。 我

  • 我是Java和Stanford NLP工具包的新手,并试图在一个项目中使用它们。具体地说,我尝试使用Stanford Corenlp toolkit来注释文本(使用Netbeans而不是命令行),并尝试使用http://nlp.Stanford.edu/software/Corenlp.shtml#Usage上提供的代码(使用Stanford Corenlp API)。问题是:有人能告诉我如何在文

  • UIMA和StanfordNLP在流水线操作之后生成输出,比如如果我们想做词性标记,那么在输入文本中首先进行标记化,然后进行词性标记。 我想使用UIMA的标记化,并在Stanford CoreNLP的POS标记器中使用该标记。但是Stanford CoreNLP的POS标记器需要在POS标记器之前运行标记器。 那么,是否可以在同一管道中使用不同的API?是否可以同时使用UIMA标记器和Stanfo

  • 有人能让我知道核心NLP的区别吗 http://stanfordnlp.github.io/CoreNLP/ 斯坦福大学NLP http://nlp.stanford.edu/

  • 我正在注释和分析一系列文本文件。 pipeline.annotate方法每次读取文件时都会变得越来越慢。最终,我得到了一个OutOfMemoryError。 管道初始化一次: 然后,我使用相同的管道实例处理每个文件(如SO和斯坦福大学在其他地方推荐的)。 明确地说,我希望问题出在我的配置上。但是,我确信失速和内存问题发生在pipeline.annotate(file)方法上。 在处理每个文件后,我

  • 我是斯坦福核心NLP的新手。我想用它来从英语,德语,法语的文本中拆分句子。这是哪一个班的工作?提前谢谢。