#ifndef CPPJIBEA_HMMSEGMENT_H #define CPPJIBEA_HMMSEGMENT_H #include #include #include #include "Limonp/str_functs.hpp" #include "Limonp/logger.hpp" #include "globals.h" #include "TransCode.hpp" #include "ISegment.hpp" #include "SegmentBase.hpp" namespace CppJieba { using namespace Limonp; class HMMSegment: public SegmentBase { public: /* * STATUS: * 0:B, 1:E, 2:M, 3:S * */ enum {B = 0, E = 1, M = 2, S = 3, STATUS_SUM = 4}; private: char _statMap[STATUS_SUM]; double _startProb[STATUS_SUM]; double _transProb[STATUS_SUM][STATUS_SUM]; EmitProbMap _emitProbB; EmitProbMap _emitProbE; EmitProbMap _emitProbM; EmitProbMap _emitProbS; vector _emitProbVec; public: HMMSegment(); virtual ~HMMSegment(); public: bool init(const char* const modelPath); bool dispose(); public: bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector& res)const ; bool cut(const string& str, vector& res)const; bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector& res)const; //virtual bool cut(const string& str, vector& res)const; private: bool _viterbi(Unicode::const_iterator begin, Unicode::const_iterator end, vector& status)const; bool _loadModel(const char* const filePath); bool _getLine(ifstream& ifile, string& line); bool _loadEmitProb(const string& line, EmitProbMap& mp); bool _decodeOne(const string& str, uint16_t& res); double _getEmitProb(const EmitProbMap* ptMp, uint16_t key, double defVal)const ; }; } #endif