zoukankan      html  css  js  c++  java
  • dictionary.go

    package sego

    import "github.com/adamzy/cedar-go"

    // Dictionary结构体实现了一个字串前缀树,一个分词可能出现在叶子节点也有可能出现在非叶节点
    type Dictionary struct {
        trie           *cedar.Cedar // Cedar 前缀树
        maxTokenLength int          // 词典中最长的分词
        tokens         []Token      // 词典中所有的分词,方便遍历
        totalFrequency int64        // 词典中所有分词的频率之和
    }

    func NewDictionary() *Dictionary {
        return &Dictionary{trie: cedar.New()}
    }

    // 词典中最长的分词
    func (dict *Dictionary) MaxTokenLength() int {
        return dict.maxTokenLength
    }

    // 词典中分词数目
    func (dict *Dictionary) NumTokens() int {
        return len(dict.tokens)
    }

    // 词典中所有分词的频率之和
    func (dict *Dictionary) TotalFrequency() int64 {
        return dict.totalFrequency
    }

    // 向词典中加入一个分词
    func (dict *Dictionary) addToken(token Token) {
        bytes := textSliceToBytes(token.text)
        _, err := dict.trie.Get(bytes)
        if err == nil {
            return
        }

        dict.trie.Insert(bytes, dict.NumTokens())
        dict.tokens = append(dict.tokens, token)
        dict.totalFrequency += int64(token.frequency)
        if len(token.text) > dict.maxTokenLength {
            dict.maxTokenLength = len(token.text)
        }
    }

    // 在词典中查找和字元组words可以前缀匹配的所有分词
    // 返回值为找到的分词数
    func (dict *Dictionary) lookupTokens(words []Text, tokens []*Token) (numOfTokens int) {
        var id, value int
        var err error
        for _, word := range words {
            id, err = dict.trie.Jump(word, id)
            if err != nil {
                break
            }
            value, err = dict.trie.Value(id)
            if err == nil {
                tokens[numOfTokens] = &dict.tokens[value]
                numOfTokens++
            }
        }
        return
    }

  • 相关阅读:
    yb课堂之自定义异常和配置 《五》
    文件包含总结--2018自我整理
    文件上传总结--2018自我整理
    i春秋 “百度杯”CTF比赛 十月场 web题 Backdoor
    bugku web题INSERT INTO注入
    SCTF2018-Event easiest web
    初识thinkphp(5)
    “百度杯”CTF比赛 九月场 YeserCMS
    初识thinkphp(4)
    0MQ是会阻塞的,不要字面上看到队列就等同非阻塞。
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7462008.html
Copyright © 2011-2022 走看看