征稿启示| 让更多的NLPer看到你的文章

认真的给AINLP公众号征个稿,之前在AINLP技术交流群分享过,现在希望更多有技术写作习惯的同学看到。

如果你平时有写技术文章的习惯并且愿意分享给更多NLPer看到,文章已经发布或者计划发布在你个人的互联网上的任何地方,譬如独立博客、知乎专栏、Github、各类博客平台,欢迎投稿给AINLP公众号,自然语言处理、机器学习、深度学习相关即可,我们会做初步的判断是否合适。

如果OK并且授权AINLP公众号原创标志,我们愿意给予一些物质感谢,包括百元稿费(或等价书籍)+ 价值20个小时1080TI的GPU云算力(也可以使用其他机器例如2080或者2080TI算力)+知识星球"AINLP芝麻街"的嘉宾身份。

如果不授权AINLP公众号原创标志,只是希望能分享给更多的人,也同样欢迎,包括或者不限于已经发布在个人公众号的NLP相关文章,其他地方的技术文章,Github个人相关项目,欢迎自荐,我们按转载模式进行操作。

关于原创标志,这是公众号保护技术原创文章的一个很好的模式,形式上就是在作者前加个原创,例如:

关于AINLP的GPU云服务,请参考:

AINLP-DBC GPU 云服务器租用平台建立,价格足够便宜

关于AINLP芝麻街,请参考:

我们建了一个免费的知识星球:AINLP芝麻街,欢迎来玩,期待一个高质量的NLP问答社区

最后,常欢迎大家来投稿,当然,我们也非常鼓励大家进行技术写作,写作能力是程序之外非常棒的一个软技能。

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP君微信(id:AINLP2),备注工作/研究方向+加群目的。

AINLP公众号新增"彩虹屁生成器"

前几天,看到了一条很有意思的微博:

整理了一些自动生成器,无聊的时候可以玩儿一天

‣ 马丁路德骂人生成器,收集了他作品里所有的脏话,连出处都有。点击即可感受辱骂
O网页链接

‣ 狗屁不通文章生成器,写稿必备
O网页链接

‣ 彩虹屁生成器,夸人难手可🐎住
O网页链接

‣ 特殊字体生成器,可以将文字生成其他有趣字体
O网页链接

‣ 诺基亚短信图片生成器:O网页链接

‣ 记仇表情包生成器:O网页链接

‣ 爱豆翻牌生成器:O网页链接

‣ 颜文字生成器:O顔文字作るよ(  ゚д゚ )

‣ Bgm自动生成器:O网页链接

‣ 骂人宝典生成器:O网页链接

‣ 在线表情包制作器:O网页链接

‣ 藏头诗生成器:O网页链接

‣ cp短打生成器,我就没打开过...你们可以试试
O网页链接

因为最近喜欢给AINLP公众号后台(对话)加一些小东西,所以就一个一个的试了一下,看看有没有可能加到AINLP公众号后台的,最后锁定“彩虹屁生成器”。不过在这之前,特意搜了一下什么是彩虹屁,以下来自百度百科的解释:

彩虹屁,网络流行语,饭圈常用语,最早流行起来的时间是在2017年。意思为粉丝们花式吹捧自己的偶像,浑身是宝,全是优点,字面意思为就连偶像放屁都能把它出口成章面不改色的吹成是彩虹。

词语来源:
该词最早出自于2017年的追星女孩,也就是所谓的饭圈,堪称是追星女孩的必备素养。

发展经过:
该词在2017年就火了,由于《镇魂》这部网络剧,又一次火了,而且还做出了很多各式各样的表情包。就好比要夸一个人,但是没有词汇去夸,那么“彩虹屁”就是一个非常棒的替代词。

引用示例
该词就是模仿韩国的用语,用词语气非常的夸张,常见的饭圈用语,就是说偶像放一个屁,就能比喻成彩虹。追星女孩她们眼中的偶像是非常棒的,所以怎么看都是好的。

上面微博提到的工具里面记仇表情包生成器、彩虹屁生成器、骂人宝典生成器由 @直播点吧 制作 ,我在调研过程发现作者提供API接口,所以就私信问了一下授权,@直播点吧 很客气,让我发邮件给 shadiaoapp@gmail.com 就可以了,所以发了封邮件,作者回复很迅速,给设置了来源白名单,并且还给了我一份来源于网友的彩虹屁数据,例如:

弱水三千我只取一瓢,你就是那个瓢
想把今天的白云寄给你,想把今天的皑皑白雪寄给你,想把我寄给你。
如果你来了 春天就可以 不用来了
我算不上低调 但也不喜欢炫耀 却想让每个认识我的人都知道你。
你就像⻜机、火车一样;你晚了,我等你;我晚了,你就⾛了。
螃蟹在剥我的壳,笔记本在写我;漫天的我落在枫叶雪花上;而你在想我。
如果你的⼀⽣需要有⼈捧在手上 那个⼈只能是我 必须是我
喜欢看你认真的样⼦,喜欢听你的声⾳,忍不住想要永远拥有你的微笑~
关于想你这件事 躲得过⼈潮汹涌的街 却躲不过四下⽆⼈的夜
在这什么都善变的⼈间 我想陪你一起看一看这永远有多远

有了这些条件,就可以很快的给AINLP添加"彩虹屁生成器"功能了,感兴趣的同学可以直接通过AINLP公众号测试,只要问句中包含“彩虹屁”三个字即可:

本来想和夸夸聊天机器人放在一起的,但是读着貌似不是夸人的感觉,所以最终还是单独处理了,感兴趣的同学可以关注AINLP公众号,后台对话直接测试:

注:原创文章,转载请注明出处及保留链接“我爱自然语言处理”:http://www.52nlp.cn

本文链接地址:AINLP公众号新增"彩虹屁生成器" http://www.52nlp.cn/?p=12419

AINLP公众号增加"狗屁不通文章生成器"

最近比较火的一个Github项目是:狗屁不通文章生成器(https://github.com/menzi11/BullshitGenerator),虽然和自然语言生成有点关系,但是代码其实和自然语言处理基本无关,或者说作者用了一点trick和规则,不过项目本身还是很有意思的:

BullshitGenerator

本项目为python3版本, 还有由suulnnka修改在线版, 使用更加方便: https://suulnnka.github.io/BullshitGenerator/index.html

下一步计划:

防止文章过于内容重复
加入更多啰嗦话.
加入马三立<开会迷>里的内容
加入手写体直接渲染出图片的功能(仅仅用于测试本人的打印机是否工作正常, 请勿做它用).
关于Pull requests:
鄙人每个requests都会仔细阅读, 但因近期事情较多, merge未必及时, 毕竟是业余项目, 请大家见谅. 如果未来实在更新不及时, 也欢迎有志之士替代本人继续本项目.

关于中文变量名:
平时撸码鄙人是不写中文变量名的, 本项目中的中文变量名只是最开始瞎写的时候边写语料边写代码时懒得切英文输入法了. 不过既然如此就保持吧!

关于生成算法
鄙人才疏学浅并不会任何自然语言处理相关算法. 而且目前比较偏爱简单有效的方式达到目的方式. 除非撞到了天花板, 否则暂时不会引入任何神经网络等算法. 不过欢迎任何人另开分支实现更复杂, 效果更好的算法. 不过除非效果拔群, 否则鄙人暂时不会融合.

这套代码不复杂,我把这套“狗屁不通文章生成器”对接到AINLP公众号后台了,做了一点修改,并且将生成字数限制在500字了,方便微信查看,感兴趣的同学可以关注AINLP,对话回复“狗屁不通文章:主题句”:

例如我输入“狗屁不通文章:自然语言处理”,生成了这样一段废话:

吉姆·罗恩在不经意间这样说过,要么你主宰生活,要么你被生活主宰。这句话把我们带到了一个新的维度去思考这个问题: 不难发现,在当今社会中,越来越多的人开始自然语言处理。自然语言处理,发生了会如何,不发生又会如何。我们都知道,只要有意义,那么就必须慎重考虑。了解清楚自然语言处理到底是一种怎么样的存在,是解决一切问题的关键。自然语言处理的发生,到底需要如何做到,不自然语言处理的发生,又会如何产生。德国曾经说过,只有在人群中间,才能认识自己。我希望诸位也能好好地体会这句话。 那么,总结地来说,这种事实对本人来说意义重大,相信对这个世界也是有一定意义的。我强烈建议自然语言处理,对我个人而言,自然语言处理不仅仅是一个重大的事件,还可能会改变我的人生。自然语言处理的发生,到底需要如何做到,不自然语言处理的发生,又会如何产生。我强烈建议自然语言处理,我们一般认为,抓住了问题的关键,其他一切就会迎刃而解。问题的关键究竟为何?这种事实对本人来说意义重大,相信对这个世界也是有一定意义的。要想清楚,自然语言处理,到底是一种怎么样的存在。马克思曾经说过,一切节省,归根到底都归结为时间的节省。这句话语虽然很短,但令我浮想联翩。 屠格涅夫曾经提到过,凡事只要看得淡些,就没有什么可忧虑的了;只要不因愤怒而夸大事态,就没有什么事情值得生气的了。我希望诸位也能好好地体会这句话。

微信公众号对话是这样的:

注:原创文章,转载请注明出处及保留链接“我爱自然语言处理”:http://www.52nlp.cn

本文链接地址:AINLP公众号增加"狗屁不通文章生成器" http://www.52nlp.cn/?p=12405

200行写一个自动微分工具

简介

机器学习工具包(PyTorch/TensorFlow)一般都具有自动微分(Automatic Differentiation)机制,微分求解方法包括手动求解法(Manual Differentiation)、数值微分法(Numerical Differentiation)、符号微法(Symbolic Differentiation)、自动微分法(Automatic Differentiation),具体的详细介绍可以参见自动微分(Automatic Differentiation)简介,这里主要说一下自动微分法的实现。

自动微分法实现

github地址:https://github.com/tiandiweizun/autodiff

git上有不少自动微分的实现,如autograd等,这里还有一个特别简单的AutodiffEngine更适合作为教程,但AutodiffEngine是静态图,整个过程对于初学者还是有点复杂的,主要是不直观,于是动手autodiff写了一个简单的动态图的求导,里面的大部分算子的实现还是参照AutodiffEngine的。

设计:其实主要是2个类,一个类Tensor用于保存数据,另一个类OP支持forward和backward,然后各种具体的运算类,如加减乘除等继承OP,然后实现具体的forward和backward过程

过程:分为forward和backward两个过程,forward从前往后计算得到最终的输出,并返回新的tensor(如下图中的v1),新的tensor保存通过哪些子tensor(v-1),哪个具体的算子(ln)计算得到的(计算图),backward按照计算图计算梯度,并赋值给对应的子tensor(v-1)

实现:

先贴一点代码

class Tensor:
    def __init__(self, data, from_tensors=None, op=None, grad=None):
        self.data = data  # 数据
        self.from_tensors = from_tensors  # 是从什么Tensor得到的,保存计算图的历史
        self.op = op  # 操作符运算
        # 梯度
        if grad:
            self.grad = grad
        else:
            self.grad = numpy.zeros(self.data.shape) if isinstance(self.data, numpy.ndarray) else 0
    
    def __add__(self, other):
        # 先判断other是否是常数,然后再调用
        return add.forward([self, other]) if isinstance(other, Tensor) else add_with_const.forward([self, other])

    def backward(self, grad=None):
        # 判断y的梯度是否存在,如果不存在初始化和y.data一样类型的1的数据
        if grad is None:
            self.grad = grad = numpy.ones(self.data.shape) if isinstance(self.data, numpy.ndarray) else 1
        # 如果op不存在,则说明该Tensor为根节点,其from_tensors也必然不存在,否则计算梯度
        if self.op:
            grad = self.op.backward(self.from_tensors, grad)
        if self.from_tensors:
            for i in range(len(grad)):
                tensor = self.from_tensors[i]
                # 把梯度加给对应的子Tensor,因为该Tensor可能参与多个运算
                tensor.grad += grad[i]
                # 子Tensor进行后向过程
                tensor.backward(grad[i])

    # 清空梯度,训练的时候,每个batch应该清空梯度
    def zero_gard(self):
        self.grad = numpy.zeros(self.data.shape) if isinstance(self.data, numpy.ndarray) else 0
class OP:
    def forward(self, from_tensors):
        pass

    def backward(self, from_tensors, grad):
        pass


class Add(OP):
    def forward(self, from_tensors):
        return Tensor(from_tensors[0].data + from_tensors[1].data, from_tensors, self)

    def backward(self, from_tensors, grad):
        return [grad, grad]


add = Add()

这里以加法为例,讲一下具体的实现。

Tensor类有四个属性,分别用于保存数据、子Tensor、操作符、梯度,OP类有两个方法,分别是forward和backword,其中Add类继承OP,实现了具体的forward和backword过程,然后Tensor重载了加法运算,如果是两个Tensor相加,则调用Add内部的forward。

x1_val = 2 * np.ones(3)
x2_val = 3 * np.ones(3)
x1 = Tensor(x1_val)
x2 = Tensor(x2_val)
# x1+x2 调用了Add的forward方法,并用[5,5,5]、x1与x2、加法操作构造新的Tensor,然后赋值给y
y = x1 + x2
assert np.array_equal(y.data, x1_val + x2_val)

backward过程先是计算梯度,然后把梯度赋值给各个子Tensor

# 判断梯度是否存在,此时不存在则初始化为[1,1,1]
# 调用Add的backward计算得到梯度[[1,1,1],[1,1,1]]
# 把梯度累加给对应的子Tensor,并调用x1和x2的backward
# 由于此时梯度存在,则不需要初始化
# 由于x1和x2无op和from_tensors,停止并退出
y.backward()
assert np.array_equal(x1.grad, np.ones_like(x1_val))
assert np.array_equal(x2.grad, np.ones_like(x2_val))

add_with_const和其他运算符参见代码

利用现有的自动求导来训练一个线性回归模型,绝大部分代码来自于AutodiffEngine里面的lr_autodiff.py,其中gen_2d_data方法用于生成数据,每个样例有3维,其中第一维是bias,test_accuracy判断sigmoid(w*x)是否大于0.5来决定分类的类别,并与 y进行对比计算准确率。

我这里仅修改了auto_diff_lr方法,去掉了静态图里面的逻辑,并换成Tensor来封装。

下图为训练日志和训练结果

Rasa 入坑指南二:基于 Rasa 构建天气查询机器人

天气查询是聊天机器人里面常见和常用的功能之一,本文基于 Rasa 构建一个中文的天气查询机器人。幸运的是,这件事已经有同学操作过了:使用 Rasa 构建天气查询机器人,不仅有文章,还有训练数据和相关代码,以及Web UI查询界面,相当完备。而问题在于, Rasa的版本跳跃貌似比较大,我接触Rasa比较晚,第一篇文章《Rasa入坑指南一:初识Rasa》使用的Rasa版本是 1.2.3,貌似目前看到的很多实战文章都是0.x的 Rasa 相关版本,在一些操作方面好像有不小的区别,包括之前罗列的一些参考文章,以及这篇天气查询机器人实战教程。

学习一个项目最好是首先跑通它,从该项目的Github主页入手:https://github.com/howl-anderson/WeatherBot,一个使用 Rasa 技术栈 (Rasa NLU, Rasa Core, Rasa Core SDK)构建的简单的中文天气情况问询机器人(chatbot), 附带有基于 Web 的用户界面(UI) http://weather_bot.xiaoquankong.ai/ ,不过目前这个demo页面可以访问,但是chatbot demo无法使用,具体原因不详。该项目采用了组件相互隔离来构建整个系统:

整个系统分成 4 个 APP:

组件 仓库地址 说明
User Interface WeatherBot_UI 负责提供用户 UI ,方便用户使用,Rasa Core 支持和多种即时通讯软件(IM)的整合,Rasa Core 提供了一种称之为 Channel 的特性来方便接入 API。
Diaglog Manager WeatherBot_Core 负责管理整个对话的流程,它会主动调用 NLU 来解析用户的意图和提取相关的实体,在需要执行业务动作的时候会调用 Action Server 执行具体的业务动作。
NLU WeatherBot_NLU 负责理解用户的意图和提取相关的实体。
Action Server WeatherBot_Action 负责执行自定义 Action (通常都是具体的业务动作,在本项目中是请求远程服务器以查询天气情况)

继续阅读

AINLP-DBC GPU 云服务器租用平台建立,价格足够便宜

我用过不少深度学习服务器,也包括一些GPU云服务器,相对来说,GPU云服务器是比较贵的。最近深脑链的同学让我试用了通过DBC Token结算的GPU云服务器,感觉相当的便宜和好用,所以尝试推荐大家试用,我们和深脑链达成合作,建立了AINLP-DBC GPU云服务器租用平台https://gpu.ainlp.cn

需要提前说明的时候,基于深脑链技术提供的GPU服务平台是采用数字货币DBC Token结算的,对于这块儿我之前是比较犹豫的,不希望大家通过这个涉及“炒币”,只是希望大家可以通过一种比较便宜好用的方式尝试使用GPU云服务器。在完整的体验了整个使用流程之后,我觉得是可用推荐给大家使用的,特别是学习深度学习,又没有GPU机器的同学,或者打比赛的时候有临时GPU需求的同学。欢迎感兴趣的同学加入我们的种子用户交流群(群二维码见文末,或者添加微信id:AINLP2,注明GPU,邀请入群),深脑链的同学会给每位新用户提供2400DBC,约可以使用48小时的GPU云服务器,对于使用过程中的任何问题,深脑链的同学都会在群里进行及时的解答。
继续阅读

推荐两份NLP读书笔记和一份NLTK书籍代码中文注释版

推荐一下AINLP技术交流群里 zYx.tom 同学贡献给大家的两份NLP读书笔记和一份中文注释代码,包括:

《自然语言处理综论》中文版第二版学习笔记

《计算机自然语言处理》学习笔记

《Python自然语言处理》学习代码的中文注释版本:NLTK-Python-CN

作者博客:https://zhuyuanxiang.github.io/

由作者授权,我把2份pdf文件放到github上了,感兴趣的同学可以直接在github上下载:

https://github.com/panyang/AINLP-Resource/tree/master/zYx.Tom

自然语言处理综论》是NLP领域的经典著作,第一版、第二版国内都有中文翻译版,目前英文版第三版《Speech and Language Processing (3rd ed. draft)》正在撰写中,已完结的章节草稿可以直接从slp3官网下载:https://web.stanford.edu/~jurafsky/slp3/ ,加了很多深度学习自然语言处理的相关章节,这里引用李纪为博士《初入NLP领域的一些小建议》中的一段描述,供计划学习这本书的同学参考:

了解NLP的最基本知识:Jurafsky和Martin的Speech and Language Processing是领域内的经典教材,里面包含了NLP的基础知识、语言学扫盲知识、基本任务以及解决思路。阅读此书会接触到很多NLP的最基本任务和知识,比如tagging, 各种parsing,coreference, semantic role labeling等等等等。这对于全局地了解NLP领域有着极其重要的意义。书里面的知识并不需要烂熟于心,但是刷上一两遍,起码对于NLP任务有基本认识,下次遇到了知道去哪里找还是非常有意义的。

《计算机自然语言处理》是哈工大王晓龙、关毅两位老师的中文NLP著作,我在刚入门NLP的时候读过,但是已经很久了,这本书在我早期的博文里记述过:《几本自然语言处理入门书》,唯一的印象就是第一次了解到本科母校HIT在中文NLP领域是非常厉害的。这本书貌似已经无法在电商网站买到,感兴趣的同学可以看看zYx.Tom同学的学习笔记。

NLTK是经典的Python NLP工具包,配套的书籍《Natural Language Processing with Python》目前也有了中文翻译版本,感兴趣的同学可以参考zYx.Tom同学的这份《Python自然语言处理》学习代码的中文注释版本:NLTK-Python-CN

最后,欢迎大家关注AINLP公众号,加入AINLP技术交流群,一起维护一个NLP技术交流环境。

Clause,开源的语义理解服务

Clause

Chatopera Language Understanding Service,Chatopera 语义理解服务

https://github.com/chatopera/clause

Clause 是帮助中小型企业快速而低成本的获得好用的语义理解服务的系统。
Clause 是 Chatopera 团队自主研发及使用其他商业友好的开源软件的方式实现的,Clause 为实现企业聊天机器人提供强大的大脑,包括客服、智能问答和自动流程服务。Clause 利用深度学习,自然语言处理和搜索引擎技术,让机器更加理解人。

欢迎

认真推荐一份深度学习笔记:简约而不简单

认真推荐一份深度学习笔记:dl-notes ,作者是我的师兄朱鉴,很多年前,他也给过我一份《无约束最优化》的笔记,在这里发布过。这份文件虽然被他命名为:一份简短的深度学习笔记,但是我读完后的第一反应是:简约而不简单。师兄在工作上一直是我的偶像,他在腾讯深耕自然语言处理相关方向6年,之后又一直在小米打拼,作为技术专家,现在主要负责对话系统相关的工作。他在工作上兢兢业业,但是工作之余也一直在学习,前两天他把这份笔记给我,说这是工作之余学习的一个总结,希望分享给大家。这份深度学习笔记共有150多页,从基础的微积分、线性代数、概率论讲起,再到数值计算、神经网络、计算图、反向传播、激活函数、参数优化、损失函数、正则化等概念,最后落笔于网络架构,包含前向网络、卷积网络、递归网络以及Transformer和Bert等,涵盖的内容非常系统全面。强烈推荐给大家,个人觉得这是一份极好的深度学习中文材料,可用于深度学习入门或者平时工作参考,当然也可以基于这份笔记的任何一个章节做深度扩展阅读和学习。

以下是这份笔记的完整目录:


继续阅读

Rasa 入坑指南一:初识 Rasa

最近对 Rasa 产生了浓厚的兴趣,准备用Rasa打磨一下聊天机器人,所以做了一些调研和学习,准备记录一下,这是第一篇,感兴趣的同学可以参考。

Rasa是一套开源机器学习框架,用于构建基于上下文的AI小助手和聊天机器人。Rasa有两个主要模块:Rasa NLU 用于对用户消息内容的语义理解;Rasa Core 用于对话管理(Dialogue management)。Rasa官方还提供了一套交互工具 RasaX 帮助用户提升和部署由Rasa框架构建的AI小助手和聊天机器人。

学习一套东西最好的方法是从官方文档开始,Rasa官方文档相当贴心,我们从 Rasa User Guide 走起。

一、安装Rasa及RasaX

我是在Ubuntu16.04, Python3 的 virtualenv 环境下测试安装的:

virtualenv -p python3 venv
source venv/bin/activate
pip install rasa-x --extra-index-url https://pypi.rasa.com/simple

如果一切正常,rasa 及 rasa x 将同时被安装,如果你不希望使用 RasaX,那么安装时直接"pip install rasa"即可,当然还可以继续安装 Rasa NLU 文本分析时所需的一些依赖,此处暂时忽略。

二、运行官方示例

Rasa 官方 tutorial 示例相当贴心,即使你没有安装rasa,也可以在这个页面通过浏览器运行示例代码,如果已经安装了,可以在自己的电脑上通过命令行follow整个流程。

1. 创建默认的初始项目

在终端运行:

rasa init --no-prompt

这个过程将有一个很快速的 Rasa 相关模型训练过程展示,最终提示:

...
NLU model training completed.
Your Rasa model is trained and saved at '/home/textminer/rasa/default/models/20190821-205211.tar.gz'.
If you want to speak to the assistant, run 'rasa shell' at any time inside the project directory.

如果不加 --no-prompt,会有几个问题提示。你也可以直接通过浏览器在官方页面执行“run”按钮,结果是这样的:

这个命令将在当前目录下新建以下文件:

__init__.py 空文件
actions.py 可以自定义 actions 的代码文件
config.yml ‘*’ Rasa NLU 和 Rasa Core 的配置文件
credentials.yml 定义和其他服务连接的一些细节,例如rasa api接口
data/nlu.md ‘*’ Rasa NLU 的训练数据
data/stories.md ‘*’ Rasa stories 数据
domain.yml ‘*’ Rasa domain 文件
endpoints.yml 和外部消息服务对接的 endpoins 细则,例如 fb messenger
models/<timestamp>.tar.gz 初始训练的模型数据

其中标志有 ‘*’ 的文件是比较重要的文件,以下我们来详细的了解。
继续阅读