class WordSegmenter(object):
    """A Chinese Word Segment Toolkit.

    分词算法:
        1. 加载词典和模型数据, 支持用户自定义词典.
        2. 基于分词词典 (trie 树结构) 对文本做全切分, 构造有向无环图 (DAG),
           即词图.
        3. 基于动态规划算法计算最大概率路径, 得到基于词频的最大切分组合.
        4. 对于未登录词问题, 采用 HMMSegmnter 的字标注方法识别.

    词性标注算法:
        1. 中文分词, 得到词序列.
        2. 基于 HMM模型解码算法实现词性标注.

    TODO(fandywang):
        1. 时间、数词、人名、地名、机构名、email、url识别.
        2. 繁简转换.
        3. 多粒度切分.
        4. 停用词识别.
    """
    VOCABULARY_FILENAME = 'vocabulary.dat'  # 基本分词词典
    CUSTOM_WORDS_DIR = "custom_words"  # 用户自定义词典
    HMM_SEGMENT_MODEL_DIR = 'hmm_segment_model'  # HMM 字标注中文分词模型
    HMM_POS_MODEL_DIR = 'hmm_pos_model'  # HMM n-gram 词性标注模型

    def __init__(self):
        self.vocabulary = Vocabulary()
        self.hmm_segmenter = HMMSegmenter()
        self.max_prob_segmenter = None
        self.hmm_pos_tagger = HMMPOSTagger()

    def load(self, data_dir):
        """
        加载词典和模型文件.
        """
        self.vocabulary.load(data_dir + '/'
                + self.__class__.VOCABULARY_FILENAME,
                data_dir + '/'
                + self.__class__.CUSTOM_WORDS_DIR)
        self.hmm_segmenter.load(data_dir + '/'
                + self.__class__.HMM_SEGMENT_MODEL_DIR)
        self.max_prob_segmenter = MaxProbSegmenter(
                self.vocabulary, self.hmm_segmenter)

        self.hmm_pos_tagger.load(data_dir + '/'
                + self.__class__.HMM_POS_MODEL_DIR);

    def segment(self, text):
        """
        切词, 返回切词序列.
        """
        return self.max_prob_segmenter.segment(text)

    def segment_with_pos(self, text):
        """
        切词 + 词性标注, 返回词和词性组成的元组序列.
        """
        return self.hmm_pos_tagger.pos_tag(
                self.max_prob_segmenter.segment(text))
    def load(self, data_dir):
        """
        加载词典和模型文件.
        """
        self.vocabulary.load(data_dir + '/'
                + self.__class__.VOCABULARY_FILENAME,
                data_dir + '/'
                + self.__class__.CUSTOM_WORDS_DIR)
        self.hmm_segmenter.load(data_dir + '/'
                + self.__class__.HMM_SEGMENT_MODEL_DIR)
        self.max_prob_segmenter = MaxProbSegmenter(
                self.vocabulary, self.hmm_segmenter)

        self.hmm_pos_tagger.load(data_dir + '/'
                + self.__class__.HMM_POS_MODEL_DIR);