闲着无聊的时候,我就会问问自己,编程也有了五年经验了,除了增删改查,我还会什么,有一天我跳槽,去面试的时候,我能比那些年轻而且期望薪资待遇低的年轻毕业生,我有什么优势,而且我只是一个专科的机电系学生,居然来做软件编程,好戏剧的一切,渐渐的给自己洗脑,自己都忘记自己是培训机构出来的,说了这么多抱怨的话,没有说培训机构的不好,没有说我们专科生就一定比高学历人才的差,归根到底还是需要学习吧,自学了半年多python,现在报了一个假期培训班来学习NLP,英语是硬伤,自己表示很无奈。

  言归正传,我来给大家分享一下,我这这段时间学到了什么(2019-06-15至2019-07-01)。

  既然我们选择了人工智能,我们就应该知道什么是人工智能,什么是NLP,我们先来明确这个几个名词吧。

  人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。 [1]  2017年12月,人工智能入选“2017年度中国媒体十大流行语”。(百度摘取)

  在我这,我认为,人工智能就是希望让我们现有的设备(比如计算机,机器人)来帮助人们做更多的事,并且可以赋予人类的思想,人类的理性和人类的行为的机器。比如我们现在的智能停车场,语音客服,工厂的自动机器人等等。

  NLP是神经语言程序学(Neuro-Linguistic Programming)的英文缩写。一般被成为自然语言处理,在我这认为NLP主要是就是让机器可以赋予人类语言正常交流并且赋予人类思想的功能。比如聊天机器人,比如新闻分类,垃圾邮件处理。

  我们知道中文的语法比较多,我们先来一个最简单的,生成一句话。现有一个文本,大致为

  1. host = """
  2. host = 时间名词 主语名词 形容词 动词 事务名词
  3. 时间名词 = 上午、下午、昨天、晌午、半夜、去年、明天
  4. 主语名词 = 学生、群众、老头、妇女、同志、叔叔
  5. 形容词 = 很快地、迅速地、悄悄地、静静地
  6. 动词 = 打、追着、敲着、吆喝、盯着
  7. 事务名词 = 蜗牛、猎豹、奥托、棒球、战斗机、冥王星
  8. """

我们可以看到,文本的第一行为一个句子的元素都有什么,时间名词+主语+(形容词)+动词+(事务名词)可以构成一句话,比如,今晚我们要狠狠的加班。也可以为,明天领导请我们吃大餐。

所有我们在上述文本中按照时间名词+主语+(形容词)+动词+(事务名词)的格式可以组成任意的语句(别考虑有的通不通顺的问题),下面我们来看一下代码的实现。

思路,1-得到文本,2-按照行来切割,3-得到句子元素格式,4-随机从下面的元素集取值,5-按照格式来拼接成句子。

代码:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import random
  4.  
  5. host = """
  6. host = 时间名词 主语名词 形容词 动词 事务名词
  7. 时间名词 = 上午、下午、昨天、晌午、半夜、去年、明天
  8. 主语名词 = 学生、群众、老头、妇女、同志、叔叔
  9. 形容词 = 很快地、迅速地、悄悄地、静静地
  10. 动词 = 打、追着、敲着、吆喝、盯着
  11. 事务名词 = 蜗牛、猎豹、奥托、棒球、战斗机、冥王星
  12. """
  13.  
  14. # 该方法主要是将文本转换成字典类型的数据
  15. def create_grammar(grammar_str, split='=', line_split='\n', code_split='、'):
  16. grammar = {}
  17. for line in grammar_str.split(line_split):
  18. if line is '':
  19. continue
  20. k, v = line.split(split)
  21. grammar[k.strip()] = [s.split() for s in v.split(code_split)]
  22. return grammar
  23.  
  24. # 随机选择
  25. choice = random.choice
  26.  
  27. # 得到句子
  28. def generate(gram, target):
  29. if target not in gram:
  30. return target
  31. else:
  32. li = choice(gram[target])
  33. sentence = '' # 最终的句子
  34. aa = [generate(gram, t) for t in li]
  35. for s in aa:
  36. if s is not '/n':
  37. sentence += s
  38. return sentence
  39.  
  40. if __name__ == '__main__':
  41. for i in range(10):
  42. adj = generate(create_grammar(host, '='), target='host')
  43. print(adj)

运行后,我们会发现很多句子是错的,完全不符合我们的讲话习惯,所以我们这样的随机选择并不是明智的选择,我们接下来处理这个不明智选择问题,让他尽力做到可以按照人类讲话方式来输出‘固定格式’的话。

  下面我来做个小游戏,也是电视节目中常见的,给予提示,让你猜出词语,比如金罐、上火;我们大多数人会第一想到加多宝,比如,我们说教室、黑色,我们会想到黑板;再比如,下午,6点,我们会想到加班。还有等等,也是人类根据前面给予的词语,会立即给予一个反应。这个也就是我最近学到的N-gram

  N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。

  N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关(这也是隐马尔可夫当中的假设)。整个句子出现的概率就等于各个词出现的概率乘积。各个词的概率可以通过语料中统计计算得到。通常N-Gram取自文本或语料库。N=1时称为unigram,N=2称为bigram,N=3称为trigram,假设下一个词的出现依赖它前面的一个词,即 bigram,假设下一个词的出现依赖它前面的两个词,即 trigram,以此类推。理论上,n 越大越好,经验上,trigram 用的最多,尽管如此,原则上,能用 bigram 解决,绝不使用 trigram。

  我们先来看几个公式:

  1-gram: P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1)

  2-gram:P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)

  大概来解释一下是什么,P(w1)就是w1在语料库内出现的概率,也就是count(w1)/ total;P(w2|w1)是w2出现在w1后面的概率,也就是说 count(w1w2)/count(w2);我们再用2-gram来看一个实际的例子。

  我们喜欢看书,切词以后变为 我们、喜欢、看、书,这时变为P(我们,喜欢,看,书)=p(我们)p(喜欢|我们)p(看|我们,喜欢)p(书|喜欢,看)

  p(我们)表示“我们”这个词在语料库里面出现的概率;

  p(喜欢|我们)表示“喜欢”这个词出现在“大家”后面的概率;(出现《我们》词语的次数当作分母,出现《我们喜欢》词语的次数当作分子)

   p(看|我们,喜欢)表示“看”这个词出现在“我们喜欢”后面的概率;(出现《我们喜欢》的次数当作分母,出现《我们喜欢看》的次数当作分子)

   p(书|喜欢,看)表示“书”这个词出现在“我们喜欢看”后面的概率。(出现《喜欢看》的次数当作分母,出现《喜欢看书》当作分子)

  

  以此类推,我们用2-gram时,只考虑其前面两个词语就可以了。

  然后他们的乘积我们会得到一个0-1的数字,无限趋近于0表示这个语句很有可能是错的,无限趋近于1的时候表示这个语句很有可能是对的

 

  代码实现还没完成。最近工作烦心事比较多,代码写了一部分,还没有完全弄完的。过几天会补上。


NLP第一课(我也是才开始学)的更多相关文章

  1. Magento学习第一课——目录结构介绍

    Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...

  2. 【第一课】神奇的Context

    初学Android的困惑 初学Android跳转页面的时候,往往教程里是这么写的: Intent intent = new Intent(); //MyActivity就是当前的Activity,It ...

  3. NeHe OpenGL教程 第一课:OpenGL窗口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. 互联网金融爬虫怎么写-第一课 p2p网贷爬虫(XPath入门)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 相关教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 ...

  5. 【Linux探索之旅】第二部分第一课:终端Terminal,好戏上场

    内容简介 1.第二部分第一课:终端Terminal,好戏上场 2.第二部分第二课预告:命令行,世界尽在掌握 终端Terminal,好戏上场 随着第一部分的结束,我们进入了第二部分(小编你这好像是废话. ...

  6. 【C++探索之旅】开宗明义+第一部分第一课:什么是C++?

    内容简介 1.课程大纲 2.第一部分第一课:什么是C++? 3.第一部分第二课预告:C++编程的必要软件 开宗明义 亲爱的读者,您是否对C++感兴趣,但是C++看起来很难,或者别人对你说C++挺难的, ...

  7. 【Linux探索之旅】开宗明义+第一部分第一课:什么是Linux?

    内容简介 1.课程大纲 2.第一部分第一课:什么是Linux? 3.第一部分第二课预告:下载Linux,免费的噢!   开宗明义 我们总听到别人说:Linux挺复杂的,是给那些追求逼格的程序员用的.咱 ...

  8. 【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL

    内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会 ...

  9. 【C语言探索之旅】 第二部分第一课:模块化编程

    内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...

随机推荐

  1. php中搭建Web服务器和服务器配置

    1.搭建Web服务器     1.1目录结构 1.2访问服务器 访问规则:http://服务器ip地址/php页面 比如: http://localhost/demo.php http://127.0 ...

  2. vue学习笔记(一): 建立 vue-cli 初始网站

    在安装vue-cli之前,要先安装node.js这个大家百度一下就可以了 1.安装 vue-cli npm install -g @vue/cli-init 2.初始化一个项目,名为 hcmanage ...

  3. MD5 加密工具类MD5Util

    我们在使用MD5 在线加密的时候,会发现下面情况,大小写的区别就不说啦,那么16位和32位有啥区别呢,其实16 位实际上是从 32 位字符串中,取中间的第 9 位到第 24 位的部分,就是str.su ...

  4. Qt开源编辑器qsciscintilla的一些用法

    首先放一张自己做的软件中的编辑器的效果图 中间红色的框就是放在Qt的tabwidget控件中的qsciscintilla编辑器 先从官网下载qsciscintilla源码,在qtcreater中编译, ...

  5. yum工具及源码包

    目录 yum工具及源码包 yum yum源 yum实战案例 yum全局配置文件 制作本地yum仓库 构建企业级yum仓库 源码包 yum工具及源码包 yum yum是RedHat以及CentOS中的软 ...

  6. 学习:SpringCloud(一)

    微服务: 微服务是一种架构模式或者一种架构风格,提倡将单一应用程序划分成一组小的服务==独立部署==,服务之间相互配合.相互协调,每个服务运行于自己的==进程==中. 服务与服务间采用轻量级通讯,如H ...

  7. Python—实现ssl认证

    https://blog.csdn.net/vip97yigang/article/details/84721027 https://www.cnblogs.com/lsdb/p/9397530.ht ...

  8. 3. 海思Hi3519A MPP从入门到精通(三 视频输入)

    视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVDS 接口和 HISPI 接 口),SLVS-EC,BT.1120,BT.656,BT.601,DC 等接口接收视频数据. ...

  9. [视频教程] ubuntu系统下安装最新版PHP7.3.X环境

    视频地址: https://www.bilibili.com/video/av69088870/ 笔记: 先安装一下这个命令 add-apt-repositoryapt-get install sof ...

  10. 20.Java基础_对象的构造函数

    package pack1; public class Student { private String name; private int age; //构造方法 //如果没有任何构造函数,系统会自 ...