美文网首页
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