StanfordCoreNLP作为线程

时间:2018-05-14 15:16:29

标签: java stanford-nlp

我是第四位软件工程师学生,我的最终项目是关于转换用户故事。 我正在使用“Stanford Core NLP”;我的道具列表是“tokenize,ssplit,pos,lemma,ner,parse”,而ner prop使它非常慢。

我在java中编写代码,我想询问是否有一些方法可以将实现stanford管道的类用作线程。 这有利于我的运行时间吗? 对于每个用户故事,我从一开始就加载实现StanfordNLP的类。 如何让它一次性加载?

2 个答案:

答案 0 :(得分:0)

您应该只构建一次管道,然后对每个故事进行管道处理。如果您发布一些示例代码,我可以帮助您改进它。您还可以在多线程模式下运行管道,并同时处理多个核心。

答案 1 :(得分:0)

这是实施StanfordNLP的课程 - " SentimentAnalyzer"。 对于不同的算法,我想几次使用这个类。 我应该在哪里打电话给这个课程,以便在我运行项目时不会伤害我?

公共类SentimentAnalyzer {

private StanfordCoreNLP pipeline;


//private Hashtable<String, ArrayList<String>> POS_TaggingArray; // k, v


public void initializeCoreNLP() {


    Properties props = new Properties();
    props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse");
    pipeline = new StanfordCoreNLP(props);

}

public void getSentiment(String text) {

    int index = 0;

    Annotation annotation= new Annotation(text);
    pipeline.annotate(annotation);

    Hashtable<String, ArrayList<String>> POS_array = new Hashtable<String, ArrayList<String>>();
    List<String> sentances_list=new ArrayList<>(  );
    List<Tree> constituencyParse = new ArrayList<>(  );
    List<String> W_lemmas= new ArrayList<>(  );
    String[] ner;

    ner = new String[text.length()];

    List<CoreMap> sentences = annotation.get( CoreAnnotations.SentencesAnnotation.class ); //divide to sentences

    for (CoreMap sentence : sentences) {
        sentances_list.add( sentence.toString() );
        constituencyParse.add( sentence.get(TreeCoreAnnotations.TreeAnnotation.class) )  ;
        for (CoreLabel token : sentence.get( CoreAnnotations.TokensAnnotation.class )) {
            String word = token.get( CoreAnnotations.TextAnnotation.class );//get the word
            String pos = token.get( CoreAnnotations.PartOfSpeechAnnotation.class );//get part of sentance

            String key = String.valueOf( POS_array.get(pos) );
            if(key.equals( "null" )) {
                POS_array.put(pos, new ArrayList<String>());
                POS_array.get(pos).add(word);
            } else{

                POS_array.get(pos).add(word);

            }
            if(pos.equals( "NN" ) || pos.equals( "NNS" ) || pos.equals( "NNP" ) || pos.equals(  "NNSP" )){   //for w list
                W_lemmas.add( token.get(CoreAnnotations.LemmaAnnotation.class) );
                String role = token.get( CoreAnnotations.NamedEntityTagAnnotation.class );
                if (!(role==null)) {
                    ner[index]=role;
                }
                else {
                    ner[index]="empty";
                }
            }
            index+=1;
        }
    }
}

}