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添加新词响应较快。
网友评论