编程开发 购物 网址 游戏 小说 歌词 地图 快照 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 开发 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
移动开发 架构设计 编程语言 互联网 开发经验 Web前端 开发总结
开发杂谈 系统运维 研发管理 数据库 云 计 算 Java开发
VC(MFC) Delphi VB C++(C语言) C++ Builder 其它开发语言 云计算 Java开发 .Net开发 IOS开发 Android开发 PHP语言 JavaScript
ASP语言 HTML(CSS) HTML5 Apache MSSQL数据库 Oracle数据库 PowerBuilder Informatica 其它数据库 硬件及嵌入式开发 Linux开发资料
  编程开发知识库 -> 云计算 -> NLP06-Gensim源码简析[字典] -> 正文阅读
 

[云计算]NLP06-Gensim源码简析[字典][第1页]


摘要:分析Ginsim中的字典源代码,包括分析Dictionary类与HashDictionary类,对比两类的异同点,重点学习doc2bow函数,一句解读其中的意思。
0 前置
NLP05-Gensim源码[包与接口]:http://blog.csdn.net/ld326/article/details/78379449
1. 例子

from gensim import corpora

texts = [['human', 'interface', 'computer'],
         ['survey', 'user', 'computer', 'system', 'response', 'time'],
         ['eps', 'user', 'interface', 'system'],
         ['system', 'human', 'system', 'eps'],
         ['user', 'response', 'time'],
         ['trees'],
         ['graph', 'trees'],
         ['graph', 'minors', 'trees'],
         ['graph', 'minors', 'survey']]
print('dictionary:')
dictionary = corpora.Dictionary(texts)
print(dictionary.token2id)
print('hash dictionary:')
hashDic = corpora.HashDictionary(texts)
print(hashDic.token2id)

运行结果:
dictionary:
{'trees': 9, 'minors': 11, 'user': 4, 'eps': 8, 'system': 7, 'interface': 2, 'time': 3, 'human': 0, 'computer': 1, 'response': 5, 'survey': 6, 'graph': 10}
hash dictionary:
{'trees': 23844, 'minors': 15001, 'user': 12736, 'eps': 31049, 'system': 5798, 'interface': 12466, 'time': 29104, 'human': 31002, 'computer': 10608, 'response': 5232, 'survey': 28591, 'graph': 18451}

2.字典
有两个字典实现, 源文件都在corpora包中,可查看http://blog.csdn.net/ld326/article/details/78379449 中的文件结构。
2.1 Dictionary

 主要是<词id,词频>二元组列表,词Id实现的时是用dict的下标来编码的;

2.2 HashDictionary

 主要也是<词id,词频>二元组列表,词Id实现的时是用dict的通过指定hash函数来编码的;

3. 考查字典
其实Dictionary类与HashDictionary类实现起来代码不多.
3.1 Dictionary类

"""
This module implements the concept of Dictionary -- a mapping between words and their integer ids.
Dictionaries can be created from a corpus and 
can later be pruned according to document frequency (removing (un)common words via the :func:`Dictionary.filter_extremes` method), 
save/loaded from disk (via :func:`Dictionary.save` and :func:`Dictionary.load` methods), 
merged with other dictionary (:func:`Dictionary.merge_with`) etc.
"""

实现了词与词id的映射,实现字典这一概念。
精简:Dictionary.filter_extremes()
保存:Dictionary.save()
载入:Dictionary.load()
合并:Dictionary.merge_with()
3.2 HashDictionary类:
“””
This module implements the "hashing trick" <http://en.wikipedia.org/wiki/Hashing-Trick>_ –
a mapping between words and their integer ids using a fixed, static mapping. The
static mapping has a constant memory footprint, regardless of the number of word-types (features)
in your corpus, so it’s suitable for processing extremely large corpora.
The ids are computed as hash(word) % id_range, where hash is a user-configurable
function (adler32 by default). Using HashDictionary, new words can be represented immediately,
without an extra pass through the corpus to collect all the ids first. This is another
advantage: HashDictionary can be used with non-repeatable (once-only) streams of documents.
A disadvantage of HashDictionary is that, unlike plain :class:Dictionary, several words may map
to the same id, causing hash collisions. The word<->id mapping is no longer a bijection.
“””
对于Diction类与HashDictionary类对比:

4. init()方法
Diction类
def init(self, documents=None, prune_at=2000000)
HashDictionary类
def init(self, documents=None, id_range=32000, myhash=zlib.adler32, debug=True)
这个比较上面那个多了一个hash函数,这个hash函数可以自已来指定的。
5. 核心函数doc2bow
两个类都一样

def doc2bow(self, document, allow_update=False, return_missing=False)
"""
Convert `document` (a list of words) into the bag-of-words format = list
of `(token_id, token_count)` 2-tuples. Each word is assumed to be a
**tokenized and normalized** string (either unicode or utf8-encoded). No further preprocessing is done on the words in `document`; apply tokenization, stemming etc. before calling this method.

If `allow_update` is set, then also update dictionary in the process: create
ids for new words. At the same time, update document frequencies -- for
each word appearing in this document, increase its document frequency (`self.dfs`) by one.

If `allow_update` is **not** set, this function is `const`, aka read-only.
"""

把document转化成词袋的形式(即

# 功能:文档转词袋表示
def doc2bow(self, document, allow_update=False, return_missing=False):
    # 输入:document--输入一个字符串数据;allow_update:是否更新字典;
# return_missing:是否返回没有匹配上的字符串
    # 输出:result字典,是document转完之后的bow数据。如果return_missing为
# True,这个missing变量也返回。
    #  
    result = {}
    missing = {}
    # 文档排序,用来统计词前作一个预处理
    document = sorted(document)  # convert the input to plain list (needed below)
    # 统计每个词在输入文档中出现多少次
    for word_norm, group in itertools.groupby(document):
        frequency = len(list(group))  # how many times does this word appear in the input document
        # 把词转成hash编码
        tokenid = self.restricted_hash(word_norm)
        # 更新词频
        result[tokenid] = result.get(tokenid, 0) + frequency
        if self.debug:
            # increment document count for each unique token that appeared in the document
            self.dfs_debug[word_norm] = self.dfs_debug.get(word_norm, 0) + 1
# 更新词典
    if allow_update or self.allow_update:
 # 词典文档数
        self.num_docs += 1
 # 词典文档的所有词数统计[基于文档的]
        self.num_pos += len(document)
         # 词典文档的所有词数统计[基于去重后的]
        self.num_nnz += len(result)
        if self.debug:
            # increment document count for each unique tokenid that appeared in the document
            # done here, because several words may map to the same tokenid
            for tokenid in iterkeys(result):
                self.dfs[tokenid] = self.dfs.get(tokenid, 0) + 1

    # return tokenids, in ascending id order
    # 对Id进行排序返回
    result = sorted(iteritems(result))
    if return_missing:
        return result, missing
    else:
        return result

另外,这里面用到一个hash函数:

# 计算hash编码,myhash函数是在构造函数时赋值的,可以自己定义与选择一个合适的函数。
def restricted_hash(self, token):
    """
    Calculate id of the given token. Also keep track of what words were mapped to what ids, for debugging reasons.
    """
    h = self.myhash(utils.to_utf8(token)) % self.id_range
    if self.debug:
        self.token2id[token] = h
        self.id2token.setdefault(h, set()).add(token)
    return h

7. 后记

 字典的实现没有太复杂的算法,代码不是太多,看起来还可以。

【作者:happyprince, http://blog.csdn.net/ld326/article/details/78386012】
阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文已收录于以下专栏:

发表评论
HTML/XML objective-c Delphi Ruby PHP C# C++ JavaScript Visual Basic Python Java CSS SQL 其它
相关文章推荐
ffmpeg源码简析(十三)ffmpeg API变更 2009-03-01—— 2017-05-09变更
Add:新增的Change/Rename:修改的Deprecate:过时的。以后很有可能删除。Remove:删除的 The last version increases were: libavcode...
King1425 2017-05-09 10:43 1210 基于gensim的Doc2Vec简析
摘要:本文主要描述了一种文章向量(doc2vec)表示及其训练的相关内容,并列出相关例子。两位大牛Quoc Le 和 Tomas Mikolov(搞出Word2vec的家伙)在2014年的《Distr...
lenbow 2016-08-04 16:10 19509 基于gensim的Doc2Vec简析
1、Word2vec的基本原理 先简述一下Word2vec相关原理,因为本文要讲述的doc2vec是基于Word2vec思想的算法。w2v的数学知识还比较丰富,网络上相关资料也很多。如果要系统的...
junjie20082008 2016-12-16 18:20 1133

Floodlight核心包源码简析
2014-04-21 14:36 562KB 下载
java Executors源码简析
package a160229; import java.util.Random; import java.util.concurrent.ExecutorService; import java....
everyong 2016-02-29 16:13 360 hbase bulk load相关源码简析之HFileOutputFormat、LoadIncrementalHFiles
hbase bulkload主要涉及的类有这么几个: HFileOutputFormat LoadIncrementablHFile PutSortReducer KeyValueSortReduce...
u011689674 2013-11-28 17:24 3180 repo与git(二)repo源码简析
个人邮箱:xiaokeweng@gmail.com 接下来我们对照着官网提供的下载android源码的过程来看一下使用repo的步骤: http://sour
xiaokeweng 2012-11-28 19:51 2089 Surf算法学习心得(二)——源码简析
说明:作为初学者,我对于源代码也只是简单的分析,开始和(一)中一样都叫做源码分析,后来感觉自己分析的质量不太好,还是都改为源码简析吧,结合起(一)及后面的心得来看估计效果会好点,呵呵。只是希望对于即将...
chenbang110 2012-05-07 09:44 1816 ffmpeg源码简析(一)结构总览
未毕业通过校招进入了某做机的公司从事camera方面的工作。比较悲剧的是做了将近一年的Camera之后,正要研究Camera上下层打通任督二脉的时候,公司架构调整加上OS版本大变动,被调到了多媒体组(...
King1425 2017-04-24 14:24 2154 lucene搜索源码过程简析
转载请务必注明,原创地址,谢谢配合!  http://qindongliang1922.iteye.com/blog/2013702  今天来谈下有关在Lucene中,如何完成一个搜索的过程,...
ccit0519 2014-02-11 14:17 1068
ld326 +关注
原创 34 粉丝 4 喜欢 0 码云  
他的最新文章 更多文章
NLP06-Gensim源码简析[字典] NLP04-pyLDAvis可视化主题 NLP03-Gensim转换与相似计算
在线课程

【免费】搜狗机器翻译技术分享
讲师:

深度学习在推荐领域的应用和实践
讲师:吴岸城
热门文章 模运算
4809
同余问题的口诀
1532
大数据学习[07]:elasticsearch5.6.1集群与问题
757
人月神话读后感言2
724
匿名内部类是怎么回事
667
1
  云计算 最新文章
NLP06-Gensim源码简析[字典]
pandas中使用三元表达式
Docker基础笔记
大数据工程师必备技能图谱
ServiceComb中的数据最终一致性方案
63. Unique Paths II
手把手教你建github技术博客by hexo
hadoop datanode结点不启动导致dfs控制台显
spark on yarn架构简介
mapreduce程序本地模式调试
上一篇文章           查看所有文章
加:2017-10-30 04:04:25  更:2017-10-30 04:05:03 
VC(MFC) Delphi VB C++(C语言) C++ Builder 其它开发语言 云计算 Java开发 .Net开发 IOS开发 Android开发 PHP语言 JavaScript
ASP语言 HTML(CSS) HTML5 Apache MSSQL数据库 Oracle数据库 PowerBuilder Informatica 其它数据库 硬件及嵌入式开发 Linux开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年6日历
2018-6-19 22:19:06
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程开发知识库