NLP实战:利用Python理解、分析和生成文本 | 赠书( 二 )


NLP实战:利用Python理解、分析和生成文本 | 赠书
本文插图
入门NLP的几个基础知识
1.正则表达式
正则表达式使用了一类特殊的称为正则语法(regular grammar)的形式语言语法 。 正则语法的行为可预测也可证明 , 而且足够灵活 , 可以支持市面上一些最复杂的对话引擎和聊天机器人 。 Amazon Alexa和Google Now都是依赖正则语法的主要基于模式的对话引擎 。 深奥、复杂的正则语法规则通常可以用一行称为正则表达式的代码来表示 。 Python中有一些成功的聊天机器人框架 , 如Will , 它们完全依赖这种语言来产生一些有用的和有趣的行为 。 Amazon Echo、Google Home和类似的复杂而又有用的助手也都使用了这种语言 , 为大部分用户交互提供编码逻辑 。
2.词序和语法
词的顺序很重要 。 那些在词序列(如句子)中控制词序的规则被称为语言的语法(grammar , 也称文法) 。 这是之前的词袋或词向量例子中所丢弃的信息 。 幸运的是 , 在大多数简短的短语甚至许多完整的句子中 , 上述词向量近似方法都可以奏效 。 如果只是想对一个短句的一般意义和情感进行编码的话 , 那么词序并不十分重要 。 看一下“Good morning Rosa”这个例子中的所有词序结果:
>>> from itertools import permutations>>> ['' ''.join(combo) for combo in... permutations(''Good morning Rosa!''.split(), 3)]['Good morning Rosa!','Good Rosa! morning','morning Good Rosa!','morning Rosa! Good','Rosa! Good morning','Rosa! morning Good']现在 , 如果试图孤立地解释这些字符串中的每一个(不看其他字符串) , 那么可能会得出结论 , 即这些字符串可能都有相似的意图或含义 。 我们甚至可能注意到Good这个词的大写形式 , 并把它放在脑海中短语的最前面 。 但是我们也可能认为Good Rosa是某种专有名词 , 如餐馆或花店的名字 。 尽管如此 , 一个聪明的聊天机器人或者布莱切利公园20世纪40年代的聪明女士可能会用同样无伤大雅的问候语来回应这6种情况中的任何一种:“Good morning my dear General.”
我们(在脑海中)再用一个更长、更复杂的短语来尝试一下 , 这是一条逻辑语句 , 其中词的顺序非常重要:
>>> s = ''''''Find textbooks with titles containing 'NLP',...or 'natural' and 'language', or...'computational' and 'linguistics'.''''''>>> len(set(s.split))12>>> import numpy as np>>> np.arange(1, 12 + 1).prod # factorial(12) = arange(1, 13).prod479001600词排列的数量从简单的问候语factorial(3) == 6激增到更长的语句factorial(12)== 479001600很明显 , 词序所包含的逻辑对任何希望正确回复的机器而言都很重要 。 尽管普通的问候语通常不会因为词袋处理而造成混淆 , 但如果把更复杂的语句放入词袋中 , 就会丢失大部分意思 。 就像前面示例中的自然语言查询一样 , 词袋并不是处理数据库查询的最佳方式 。
3.词向量
2012年 , 微软实习生Thomas Mikolov发现了一种用一定维度的向量表示词的含义的方法 。 Mikolov训练了一个神经网络来预测每个目标词附近的共现词 。 2013年 , Mikolov和他的队友在谷歌发布了创建这些词向量的软件 , 称为Word2vec 。
Word2vec仅仅基于大型未标记文本语料库来学习词的含义 , 而不需要标记Word2vec词汇表中的词 。 我们不需要告诉Word2vec算法玛丽·居里是一个科学家、伐木者是一个足球队、西雅图是一个城市、波特兰是俄勒冈州和缅因州的一个城市 , 也不需要告诉Word2vec足球是一项运动、一个团队是一群人 , 或者城市既是地点也是社区 。 Word2vec完全可以靠自己学到更多的知识!大家需要做的只是准备一个足够大的语料库 , 其中在科学、足球或城市相关的词附近提到玛丽·居里、伐木者队和波特兰 。


推荐阅读