自信人生两百年,会当击水三千里。
第一章 NLP基础
1、NLP的概念
NLP(natural language processing,自然语言处理)是计算机科学领域以及人工智能领域的一个重要的研究方向,它研究用计算机来处理、理解以及运用人类语言,达到人与计算机之间进行有效通讯。
2、NLP的研究任务
NLP可以被应用与很多领域,这里大概总结出以下几种通用的应用:
3、NLP的发展历程
NLP的发展大致经历了3个阶段:
4、NLP的基本术语
5、NLP知识体系结构
6、NLP的三个层面
第二章 NLP前置技术解析
1、正则表达式
2、匹配字符串
在python中,我们会使用re模块来实现正则表达式。
案例中,我们会提到re的一个方法——re.search
import re
text_string = "文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,怕中可以有主题爬虫和通用爬虫之分"
regex = "爬虫"
p_string = text_string.split("。") #以句号为分隔符通过split切分
for line in p_string:
if re.search(regex,line) is not None: #search方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
print(line) #如果匹配到,打印这行信息
例2 匹配任意一个字符
正则表达式中,有一些保留的特殊符号可以帮助我们处理一些常用逻辑。
符号 | 含义 |
---|---|
. | 匹配任意一个字符 |
“ . ”代替任何单个字符(换行除外)
正则表达式 | 可以匹配的例子 |
---|---|
a.c | abc 、 branch |
import re
text_string = "文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,怕中可以有主题爬虫和通用爬虫之分"
regex = "爬."
p_string = text_string.split("。") #以句号为分隔符通过split切分
for line in p_string:
if re.search(regex,line) is not None: #search方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
print(line) #如果匹配到,打印这行信息
例3 匹配起始和结尾字符串
符号 | 含义 |
---|---|
^ | 匹配开始的字符串 |
$ | 匹配结束的字符串 |
“^a”代表的是匹配所有以字母a开头的字符串
“a$”代表的是匹配所有以字母a结尾的字符串
import re
text_string = "文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。"
regex = "^文本"
p_string = text_string.split("。")
for line in p_string:
if re.search(regex,line) is not None:
print(line)
例4 使用中括号匹配多个字符
符号 | 含义 |
---|---|
[ ] | 匹配多个字符 |
“[bcr]at”代表的是匹配“bat”、“cat”以及“rat”
import re
text_string = ["[重要的]今年第七号台风23日登陆广东东部沿海地区","上海发布车库销售监管通知:违规者暂停网签资格","[紧要的]中国对印连发强硬信息,印度急切需要结束对峙"]
regex = "^\[[重紧]..\]"
for line in text_string:
if re.search(regex,line) is not None:
print(line)
else:
print("not match")
3、转义符——正则表达式里使用" \ “作为转义字符
这可能造成反斜杠困扰。如果需要匹配文本中的字符" \ ",那么使用编程语言表示的正则表达式里需要4个反斜杠“ \ \ \ \”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
python里的原生字符串很好的解决了这个问题,这个例子中的正则表达式可以使用r” \ \ “表示。同样,匹配一个数字的” \ \ d"可以写成r" \ d"。
import re
strings = ["War of 1812","There are 5280 feet to a mile","Happy New Year 2016!"]
for string in strings:
if re.search("[1-2][0-9]{3}",string): #字符串有英文有数字,匹配其中的数字部分,并且是在1000-2999之间,{3}代表的是重复之前的[0-9]三次,是[0-9][0-9][0-9]的简化写法。
year_strings.append(string)
print(year_strings)
5、Numpy——(Numerical Python)是高性能科学计算和数据分析的基础包,提供了矩阵运算的功能。
import numpy as np
通过import关键字将Numpy库引入,然后通过as为其取一个别名np,别名的作用是为了之后写代码的时候方便引用。
通过Numpy中的array(),可以将向量直接导入:
vector = np.array([1,2,3,4])
通过numpy.array()方法,也可以将矩阵导入:
matrix = np.array([[1,"Tim"],[2,"Joey"],[3,"Johnny"],[4,"Frank"]])
我们通过Numpy中的一个方法arange(n),生成0到n-1的数组。
再通过Numpy中的reshape(row,column)方法,自动构架一个多行多列的array对象。
我们有了基本数据以后,可以通过Numpy提供的shape属性获取Numpy数组的维度。
返回的结果是一个元组(tuple),第一个3代表的是3行,第二个5代表的是5列。
我们可以通过Numpy中的genfromtxt()方法来读取本地的数据集。
Numpy支持list一样的定位操作
import numpy as np
matrix = np.array([[1,2,3],[20,30,40]])
print(matrix[0,1])
上述代码中的matrix[0,1],其中0代表的是行,在Numpy中0代表其实第一个,所以取得是第一行,之后的1代表的是列,所以取得是第二列。
Numpy支持list一样的切片操作
import numpy as np
matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
print(matrix[:,1])
print(matrix[:,0:2])
print(matrix[1:3,:])
print(matrix[1:3,0:2])
上述的print(matrix[:,1])语法代表选择所有的行,都是列的索引是1的数据。那么就返回10,25,40。
print(matrix[:,0:2])代表的是选取所有的行,列的索引是0和1。
print(matrix[1:3,:])代表的是选取行的索引值1和2以及所有的列。
print(matrix[1:3,0:2])代表的是选取行的索引1和2以及列的索引是0和1的所有数据。
Numpy强大的地方是数组或者矩阵的比较,数据比较之后会产生boolean值。
import numpy as np
matrix = np.array([[5,10,15],
[20,25,30],
[35,40,45]])
m = (matrix == 25)
print(m)
import numpy as np
matrix = np.array([[5,10,15],
[20,25,30],
[35,40,45]])
second_column_25 = (matrix[:,1] == 25)
print(second_column_25)
print(matrix[second_column_25,:])
上述的print(second_column_25)输出的是[False True False],首先matrix[:,1]代表的是所有的行,以及索引为1的列->[10,25,40],最后和25进行比较,得到的就是False True False。
print(matrix[second_column_25,:])代表的是返回true值的那一行数据->[20,25,30]。
Numpy ndarray数据类型可以通过参数dtype设定,而且可以使用astype转换类型。
vector = numpy.array(["1","2","3"])
vector = vector.astype(float)
上述例子中,如果字符串中包含非数字类型的时候,从string转float就会报错。
sum():计算数组元素的和;对于矩阵计算结果为一个一维数组,需要指定行或者列。
mean():计算数组元素的平均值;对于矩阵计算结果为一个一维数组,需要只当行或者列。
max():计算数组元素的最大值;对于矩阵计算结果为一个一维数组,需要只当行或者列。
需要注意的是,用这些统计方法计算的数值类型必须是int或者float。