Python 生成便签图片

最近有文字转图片的需求,但是不太想下载 APP,就使用 Python Pillow 实现了一个,效果如下: PIL 提供了 PIL.ImageDraw.ImageDraw.text 方法,可以方便的把文字写到图片上,简单示例如下: from PIL import Image, ImageDraw, ImageFont # get an image base = Image.open('Pillow/Tests/images/hopper.png').convert('RGBA') # make a blank image for the text, initialized to transparent text color txt = Image.new('RGBA', base.size, (255,255,255,0)) # get a font fnt = ImageFont.truetype('Pillow/Tests/fonts/FreeMono.ttf', 40) # get a drawing context d = ImageDraw.Draw(txt) # draw text, half opacity d.text((10,10), "Hello", font=fnt, fill=(255,255,255,128)) # draw text, full opacity d.text((10,60), "World", font=fnt, fill=(255,255,255,255)) out = Image.alpha_composite(base, txt) out.show() 为什么要计算文字的宽高呢?把文字直接写到背景图不可以么? ...

2018-07-08 · 3 min · 469 words

微信公号DIY:MongoDB 简易ORM & 公号记账数据库设计

前两篇 微信公号DIY 系列: 微信公号DIY:一小时搭建微信聊天机器人 微信公号DIY:训练聊天机器人&公号变身图片上传工具 介绍了如何使用搭建&训练聊天机器人以及让公号支持图片上传到七牛,把公号变成一个七牛图片上传客户端。这一篇将继续开发公号,让公号变成一个更加实用的工具账本(理财从记账开始)。 代码: 项目代码已上传至github,地址为gusibi/momo:https://github.com/gusibi/momo HUGOMORE42 账本功能 账本是一个功能比较简单应用,公号内只需要支持: 记账(记账,修改金额,取消记账) 账单统计(提供数据和图片形式的统计功能) 当然后台管理功能就比较多了,这个以后再介绍。 对于数据存储,我选择的是MongoDB(选MongoDB的原因是,之前没用过,想试一下),我们先看下MongoDB和关系型数据库的不同。 MongoDB 什么是MongoDB ? MongoDB 是由C++语言编写的,是一个开放源代码的面向文档的数据库,易于开发和缩放。 mongo和传统关系数据库的最本质的区别在那里呢?MongoDB 是文档模型。 关系模型和文档模型的区别在哪里? 关系模型需要你把一个数据对象,拆分成零部件,然后存到各个相应的表里,需要的是最后把它拼起来。举例子来说,假设我们要做一个CRM应用,那么要管理客户的基本信息,包括客户名字、地址、电话等。由于每个客户可能有多个电话,那么按照第三范式,我们会把电话号码用单独的一个表来存储,并在显示客户信息的时候通过关联把需要的信息取回来。 而MongoDB的文档模式,与这个模式大不相同。由于我们的存储单位是一个文档,可以支持数组和嵌套文档,所以很多时候你直接用一个这样的文档就可以涵盖这个客户相关的所有个人信息。关系型数据库的关联功能不一定就是它的优势,而是它能够工作的必要条件。 而在MongoDB里面,利用富文档的性质,很多时候,关联是个伪需求,可以通过合理建模来避免做关联。 MongoDB 概念解析 在mongodb中基本的概念是文档、集合、数据库,下表是MongoDB和关系型数据库概念对比: SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 table joins 表连接,MongoDB不支持 primary key primary key 主键,MongoDB自动将_id字段设置为主键 通过下图实例,我们也可以更直观的的了解Mongo中的一些概念: 接下来,我从使用的角度来介绍下如何使用 python 如何使用MongoDB,在这个过程中,我会实现一个简单的MongoDB的ORM,同时也会解释一下涉及到的概念。 简易 Python MongoDB ORM python 使用 mongodb 首先,需要确认已经安装了 PyMongo,如果没有安装,使用以下命令安装: pip install pymongo # 或者 easy_install pymongo 详细安装步骤参考: PyMongo Installing / Upgrading ...

2017-07-16 · 4 min · 659 words

微信公号DIY:训练聊天机器人&公号变身图片上传工具

上一篇 一小时搭建微信聊天机器人 介绍了如何搭建一个可用的聊天机器人,但是和机器人聊完你会发现,聊天机器人实在是太傻了,来回就那么几句。这是因为我们给聊天机器人的数据太少,他只能在我们给的训练集中找它认为最合适的。那么,如何导入更多的训练数据呢? 我能想到最简单的方法是找对话的数据,然后把这些数据作为训练数据训练机器人。 感谢 candlewill 已经收集好了大量的训练数据,dialog_corpus https://github.com/candlewill/Dialog_Corpus 。 HUGOMORE42 这个库中包含电影台词、中英文短信息、自然语言处理相关的数据集、小黄鸡语料等。这里我选择电影台词语料。 语料地址为:dgk_lost_conv:https://github.com/rustch3n/dgk_lost_conv chatterbot 训练逻辑处理模块 这个模块提供训练机器人的方法,chatterbot自带了通过输入list来训练([“你好”, “你好啊”] 后者是前者的回答)以及通过导入Corpus格式文件来训练的方式。 这里我们选择使用第一种,通过输入list来训练机器人。 处理训练数据 首先下载数据集: wget https://codeload.github.com/rustch3n/dgk_lost_conv/zip/master # 解压 $ unzip dgk_lost_conv-master.zip 我们先打开一个文件看下数据结构: E M 你得想想办法 我弟弟是无辜的 M 他可是美国公民啊 M 对此我也无能为力 M 你当然能 M 再去犯罪现场看看 定能证实清白 M 你看 我不过是个夜间办事员而已 M 你若真想解决问题 M 最好等领事来 M 他早上才上班 M 我很抱歉 E M 那我自己来搞定 M 你兄弟 M 关在哪个监狱? M 索纳监狱 E M 怎么了? M 那里关的都是最穷凶极恶的罪犯 M 别的监狱都不收 .conv 语料文件中:E 是分隔符 M 表示会话。因为我是使用输入list 的方式训练数据,这时我可以以分隔符E为分隔,将一段对话放入一个list中,那么上述例子中的训练数据应该被格式化为: ...

2017-07-08 · 3 min · 571 words

微信公号DIY:一小时搭建微信聊天机器人

最近借用了女朋友的公号,感觉如果只是用来发文章,太浪费微信给提供的这些功能了。想了想,先从最简单的开始,做一个聊天机器人吧。 使用Python实现聊天机器人的方案有多种:AIML、chatterBot以及图灵聊天机器人和微软小冰等。 考虑到以后可能会做一些定制化的需求,这里我选择了chatterBot(github 项目地址:https://github.com/gunthercox/ChatterBot)。 chatterbot是一款python接口的,基于一系列规则和机器学习算法完成的聊天机器人。具有结构清晰,可扩展性好,简单实用的特点。 HUGOMORE42 chatterBot 的工作流程如图: 输入模块(input adapter)从终端或者API等输入源获取数据 输入源会被指定的逻辑处理模块(logic Adapter)分别处理,逻辑处理模块会匹配训练集中已知的最接近输入数据句子A,然后根据句子A去找到相关度最高的结果B,如果有多个逻辑处理模块返回了不同的结果,会返回一个相关度最高的结果。 输出模块(output adapter)将匹配到的结果返回给终端或者API。 值得一说的是chatterBot 是一个模块化的项目,分为 input Adapter、logic Adapter、storage Adapter、output Adapter以及Trainer 模块。 logic Adapter是一个插件式设计,主进程在启动时会将用户定义的所有逻辑处理插件添加到logic context中,然后交MultiLogicAdapter 进行处理,MultiLogicAdapter 依次调用每个 logic Adapter,logic Adapter 被调用时先执行can_process 方式判断输入是否可以命中这个逻辑处理插件。比如”今天天气怎么样“这样的问题显然需要命中天气逻辑处理插件,这时时间逻辑处理插件的can_process 则会返回False。在命中后logic Adapter 负责计算出对应的回答(Statement对象)以及可信度(confidence),MultiLogicAdapter会取可信度最高的回答,并进入下一步。 下面我们来看下 chatterBot 如何使用 chatterBot 安装&使用 安装 chatterBot 是使用Python编写的,可以使用 pip 安装: pip install chatterbot chatterBot 的中文对话要求Python3 以上版本,建议在Python3.x 环境下开发 测试 打开iPython,输入测试一下 In [1]: from chatterbot import ChatBot # import ChatBot In [2]: momo = ChatBot('Momo', trainer='chatterbot.trainers.ChatterBotCorpusTrainer') /Users/gs/.virtualenvs/py3/lib/python3.6/site-packages/chatterbot/storage/jsonfile.py:26: UnsuitableForProductionWarning: The JsonFileStorageAdapter is not recommended for production environments. self.UnsuitableForProductionWarning # 这里storage adapter 默认使用的是 json 格式存储数据的,如果想在服务端部署,应该避免使用这种格式,因为实在是太慢了 In [3]: momo.train("chatterbot.corpus.chinese") # 指定训练集,这里我们使用中文 # 下边是对话结果 In [4]: momo.get_response('你好') Out[4]: <Statement text:你好> In [5]: momo.get_response('怎么了') Out[5]: <Statement text:没什么.> In [6]: momo.get_response('你知道它的所有内容吗?') Out[6]: <Statement text:优美胜于丑陋.> In [7]: momo.get_response('你是一个程序员吗?') Out[7]: <Statement text:我是个程序员> In [8]: momo.get_response('你使用什么语言呢?') Out[8]: <Statement text:我经常使用 Python, Java 和 C++ .> 这时你已经可以和机器人对话了,不过现在由于训练数据太少,机器人只能返回简单的对话。 ...

2017-07-05 · 5 min · 1035 words