Bounter:一个针对大数据集的计数器

2017 年 11 月 24 日 Python程序员

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

Bounter 是一个C语言编写的Python库。它仅以较小的固定大小的内存便能在巨大的数据集里进行十分高效的项目概率统计。

为什么选择Bounter?

Bounter让你能够计算一项东西出现的次数,这类似于Python内建的dictCounter

然而,和dictCounter不同的是,Bounter能够处理巨大的集合,这些集合项甚至都与RAM大小不相符。这通常应用于机器学习和自然语言处理,如字典构建匹配检测,这需要估算数十亿计的项目来得到它们的统计得分以及后续的过滤。

Bounter通过优化了的低级的C语言框架实现了近似算法,来避免Python对象的开销。它允许你指定想要使用的最大内存。在下面Wikipedia的例子中,Bounter使用了比Counter少31倍的内存。

Bounter有些情况下比内建的dict和Counter还要快,因此只要你把你处理的项当作字符串(字节字符和Unicode,Bounter在Python2和Python3里都支持),就没有理由不使用Bounter。

安装步骤

Bounter只需要Python2.7及以上版本或者Pyhon3.3及以上版本,并且有一个C编译器:

或者如果你愿意,也可以使用source tar.gz:进行安装:

它是如何工作的呢?

它并没有什么魔力,只是巧妙的使用了近似算法和扎实的技术。

特别是,Bounter底层实现了三种不同的算法,根据“计数”类型你需要:

1. 基数估算:有多少唯一项?

这是应用了HyperLogLog算法构建于Joshua Andersen的 HLL代码之上)并使用最小内存的一个最简单的应用场景。

2. 项目频次:这一项出现了多少次?

这个例子使用了最小略图算法以固定大小的内存高效的估算出了项目的数量。具体详情和参数请参考API文档。

为做进一步的优化,最小略图选择性地支持了一种对数概率计数器

  • bounter(need_iteration=False):默认选项。精确计数,非概率计算。每批次占用4个字节(最大2^32)。

  • bounter(need_iteration=False, log_counting=1024):一个占用2字节的整数计数器。2048以内的数值会是精确的,更大的会有+/-2%的误差。最大可表示的值大概是2^71。

  • bounter(need_iteration=False, log_counting=8):一个更加令人称奇的概率计数器,它仅使用1个字节。8以内的值是精确的,更大的话会有+/-30%的误差。最大可表示的值大概是2^33

    这些在内存与准确性上的折衷有些时候正好迎合了自然语言处理。在这种场景下能够处理巨大数据集比判断一个事件发生的准确度高55482倍或是55519倍更加重要。

    3. 全项迭代:“有些什么项目以及它们出现的频次是多少?”

    除了键值(字符串)本身之外,它还存储了整个基数和每个项目出现的频次(8字节)。使用了最多的内存,但支持了最广的功能。

    这一项在底层使用了自定义的C哈希表来优化字符串的存储。当接近分配的最大内存时,它会移除低计数的对象,而不是扩展这个表。


    更多详细内容,请参考API docstrings


    英文版Wikipedia上的例子

    让我们来计算一下在英文版Wikipedia语料库里所有双字出现的频次:

    Wikipedia数据集包含了总数1,860,927,726单词里的7,661,318个去重单词,总数1,857,420,106双字里的179,413,989个去重双字。

    为了测试Bounter的准确性, 我们自动化地从这些双字里抽取一些组合 (常用的多字表达,例如:"New York", "network license", "Supreme Court" or "elementary school")

    我们把从Counter和Bounter里抽取出来的组合做了对比,并在以下展示了精度和回调:

    相比内建的Counter或dict, Bounter以少31倍的内存使用获得100%的完美F1分数。尽管只使用了128MB(少250倍内存)的内存,但仍然要快61%,而且F1分数还能达到96.04%。


    支持

    可以使用Github issues提交问题,如果有任何探讨和功能上的想法也可以发送邮件给我们。



    Bounter是在MIT许可下发布的开源软件。


    英文原文:https://github.com/RaRe-Technologies/bounter
    译者:🐻大白


    登录查看更多
    2

    相关内容

    Python是一种面向对象的解释型计算机程序设计语言,在设计中注重代码的可读性,同时也是一种功能强大的通用型语言。
    【2020新书】实战R语言4,323页pdf
    专知会员服务
    100+阅读 · 2020年7月1日
    【实用书】学习用Python编写代码进行数据分析,103页pdf
    专知会员服务
    194+阅读 · 2020年6月29日
    【2020新书】从Excel中学习数据挖掘,223页pdf
    专知会员服务
    90+阅读 · 2020年6月28日
    【2020新书】使用高级C# 提升你的编程技能,412页pdf
    专知会员服务
    57+阅读 · 2020年6月26日
    【实用书】Python技术手册,第三版767页pdf
    专知会员服务
    234+阅读 · 2020年5月21日
    【干货书】流畅Python,766页pdf,中英文版
    专知会员服务
    225+阅读 · 2020年3月22日
    算法与数据结构Python,369页pdf
    专知会员服务
    162+阅读 · 2020年3月4日
    【新书】Python中的经典计算机科学问题,224页PDF
    专知会员服务
    52+阅读 · 2019年12月31日
    针对初学者的循环神经网络介绍
    Python程序员
    8+阅读 · 2019年8月20日
    文本分析与可视化
    Python程序员
    9+阅读 · 2019年2月28日
    开发 | 用 Python 做机器学习不得不收藏的重要库
    AI科技评论
    5+阅读 · 2019年1月8日
    【大数据】海量数据分析能力形成和大数据关键技术
    产业智能官
    17+阅读 · 2018年10月29日
    大数据流处理平台的技术选型参考
    架构文摘
    4+阅读 · 2018年3月14日
    基于大数据搭建社交好友推荐系统
    云栖社区
    8+阅读 · 2018年2月2日
    python文本相似度计算
    北京思腾合力科技有限公司
    24+阅读 · 2017年11月6日
    【宁波站】网络爬虫与文本挖掘
    数萃大数据
    5+阅读 · 2017年7月19日
    一个人的企业安全建设之路
    FreeBuf
    5+阅读 · 2017年7月7日
    简单车牌检测
    计算机视觉战队
    6+阅读 · 2017年6月23日
    Talking-Heads Attention
    Arxiv
    15+阅读 · 2020年3月5日
    Arxiv
    3+阅读 · 2018年11月29日
    Arxiv
    12+阅读 · 2018年9月15日
    Knowledge Based Machine Reading Comprehension
    Arxiv
    4+阅读 · 2018年9月12日
    Arxiv
    5+阅读 · 2015年9月14日
    VIP会员
    相关VIP内容
    【2020新书】实战R语言4,323页pdf
    专知会员服务
    100+阅读 · 2020年7月1日
    【实用书】学习用Python编写代码进行数据分析,103页pdf
    专知会员服务
    194+阅读 · 2020年6月29日
    【2020新书】从Excel中学习数据挖掘,223页pdf
    专知会员服务
    90+阅读 · 2020年6月28日
    【2020新书】使用高级C# 提升你的编程技能,412页pdf
    专知会员服务
    57+阅读 · 2020年6月26日
    【实用书】Python技术手册,第三版767页pdf
    专知会员服务
    234+阅读 · 2020年5月21日
    【干货书】流畅Python,766页pdf,中英文版
    专知会员服务
    225+阅读 · 2020年3月22日
    算法与数据结构Python,369页pdf
    专知会员服务
    162+阅读 · 2020年3月4日
    【新书】Python中的经典计算机科学问题,224页PDF
    专知会员服务
    52+阅读 · 2019年12月31日
    相关资讯
    针对初学者的循环神经网络介绍
    Python程序员
    8+阅读 · 2019年8月20日
    文本分析与可视化
    Python程序员
    9+阅读 · 2019年2月28日
    开发 | 用 Python 做机器学习不得不收藏的重要库
    AI科技评论
    5+阅读 · 2019年1月8日
    【大数据】海量数据分析能力形成和大数据关键技术
    产业智能官
    17+阅读 · 2018年10月29日
    大数据流处理平台的技术选型参考
    架构文摘
    4+阅读 · 2018年3月14日
    基于大数据搭建社交好友推荐系统
    云栖社区
    8+阅读 · 2018年2月2日
    python文本相似度计算
    北京思腾合力科技有限公司
    24+阅读 · 2017年11月6日
    【宁波站】网络爬虫与文本挖掘
    数萃大数据
    5+阅读 · 2017年7月19日
    一个人的企业安全建设之路
    FreeBuf
    5+阅读 · 2017年7月7日
    简单车牌检测
    计算机视觉战队
    6+阅读 · 2017年6月23日
    Top
    微信扫码咨询专知VIP会员