public SegDecoderTagger CreateTagger(int nbest, int this_crf_max_word_num = BaseUtils.DEFAULT_CRF_MAX_WORD_NUM)
        {
            if (_modelReader == null)
            {
                return(null);
            }

            var tagger = new SegDecoderTagger(nbest, this_crf_max_word_num);

            tagger.init_by_model(_modelReader);

            return(tagger);
        }
        //Segment given text
        public int Segment(CRFSegOut[] pout,           //segment result
                           SegDecoderTagger tagger,    //Tagger per thread
                           List <List <string> > inbuf //feature set for segment
                           )
        {
            var ret = 0;

            if (inbuf.Count == 0)
            {
                //Empty input string
                return(BaseUtils.RETURN_SUCCESS);
            }

            ret = tagger.reset();
            if (ret < 0)
            {
                return(ret);
            }

            ret = tagger.add(inbuf);
            if (ret < 0)
            {
                return(ret);
            }

            //parse
            ret = tagger.parse();
            if (ret < 0)
            {
                return(ret);
            }

            //wrap result
            ret = tagger.output(pout);
            if (ret < 0)
            {
                return(ret);
            }

            return(BaseUtils.RETURN_SUCCESS);
        }