美文网首页
gensim源码:Dictionary与HashDictiona

gensim源码:Dictionary与HashDictiona

作者: 书生意气少年时 | 来源:发表于2018-05-11 18:16 被阅读0次

        gensim中有Dictionary和HashDictionary两类。Dictionary是一个词Map一个id,继承自Mapping类。HashDictionary是是通过Hash词来得到id,多个词可能拥有同一个id,继承自dict类。

    1.Dictionary

        继承自Mapping类,拥有keys,values,items, get方法

    Attributes:

        token2id:(str, int)字典

        id2token:(int, str)字典,只有在使用的时候才会生成(lazy)

        dfs:(token_id,count)统计多少文档出现该词

        num_docs:文档数

        num_pos:词数(有重复)

        num_nnz:BOW矩阵中的非0总数,所有文档单词数(文档内无重复,文档之间有可能重复)

    __init__(documents=None,prune_at=20000000):

        调用add_documnets方法

    add_documnets(documents,prune_at)

        将文档加入字典中,调用doc2bow方法

        documents参数:iterable of iterable of str,如[[“中”,“美” ],["我", “他”]]

        prune_at参数:字典包含的最大词数,文档超出则不包含超出词,默认200万

    doc2bow(document, allow_update=False, return_missing=False)

        转换为词袋模型bag of word格式为(token_id, token_count)

        allow_update:词典是否可以扩展

        return_missing:是否返回字典中没有的新增词

    doc2idx(document, unknown_word_index=-1)

        将文档中的词转换为字典对应token_id, 字典中没有的返回unknown_word_index

    filter_extremes(no_below=5, no_above=0.5, keep_n=100000, keep_tokens=None):

        依照上下界和关键词缩减词典,词典变成一个原始词典的子集

        no_below最小出现次数,no_above最大dfs频率,keep_n最多个数,keep_token必须包含的词

    filter_n_most_frequent(remove_n)

        删除dfs文档频率最高的n个字,词典变成缩减后的词典。调用filter_tokens实现

    filter_tokens( bad_ids=None, good_ids=None)

        删除bad_ids的词或者留下good_ids中的词。

        函数生成token_ids和dfs,因为删减后的字典索引是间断的,所以完成后调用compactify方法    

    compactify

        将不连续索引的词典转换为连续索引的词典

    save_as_text( fname, sort_by_word=True)

        保存字典到文件,第一行是num_docs

    load_from_text(fname)

        从文件加载字典    

    merge_with(other):

        将另外一个词典加到现有词典上,以前的词典存在使用原有id,没有的词添加到旧词典最后

    from_corpus(corpus, id2word=None)

        将一个BOW变成一个字典,如果id2word=None,word默认为str(id)


    2.HashDictionary

        继承自dict类,有values,items,fromKeys,update,pop,get等方法

    __init__(documents=None, id_range=32000, myhash=zlib.adler32, debug=True)

        id_range为hash表长度,myhash为hash方法,id = myhash(key)%id_range,debug表示是否存储dfs(token_id,count)和dfs_debug(token,count)。

    restricted_hash(self, token)

        计算token的id,id = myhash(key)%id_range

    add_documents(self, documents)

        包装类,同Dictionary。调用doc2bow方法

    doc2bow(self, document, allow_update=False, return_missing=False)

        同Dictionary,增加了dfs(token_id,count)和dfs_debug(token,count)

     filter_extremes(no_below=5, no_above=0.5, keep_n=100000)

        缩减词典,同Dictionary

    save_as_text(fname)

        保存字典,格式为(token_id ,token_id count, [[token,count][..]])


    3.总结

        两类基本结构相同,区别主要有以下几点:

        1.继承类不同,Dictionary继承Mapping,HashDictionary继承dict,因此两者继承的方法不同

        2.token_id生成方法不同,Dictionary中使用整数序列,不同字典中可能不同;HashDictionary使用hash方法,token_id不会发生变化,具有自己的优势,但多个词对应一个id使其略显混乱。

        3.Dictionary方法较完整,HashDictionary实现方法较少,如HashDictionary没有merge等方法。

        4.Dictionary使用较为广泛,而HashDictionary添加新词响应较快。

    相关文章

      网友评论

          本文标题:gensim源码:Dictionary与HashDictiona

          本文链接:https://www.haomeiwen.com/subject/rncqdftx.html