且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《NLTK基础教程——用NLTK和Python库构建机器学习应用》——1.2 先从Python开始吧

更新时间:2022-09-27 14:10:08

本节书摘来异步社区《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书中的第1章,第1.2节,作者:Nitin Hardeniya,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 先从Python开始吧

虽然,我们在这里并不打算对Python进行任何太过深入的探讨,但带你快速浏览一下Python的基础要点还是很有必要的。当然,为了观众着想,我们***将这次基础性的快速回顾之旅控制在5分钟之内。在此期间,我们将会讨论到数据结构的基本知识,一些常用函数,以及在接下来几节中将会用到的Python通用结构。  

我强烈推荐你花两个小时看一下题为《Google Python class》的参考资料:https://developers.google.com/edu/ python,那对我们来说应该算是个不错的开始。当然,你还可以通过Python的官方网站https://www.python.org/来获取更多的教程及其他相关资源。

1.2.1 列表

列表(list)是Python中最常用的数据结构之一。它们基本上相当于其他编程语言中的数组。下面,就让我们先从Python列表所提供的最重要的那些功能开始吧。

我们可以在Python控制台中进行如下尝试:

>>> lst=[1,2,3,4]
>>> # mostly like arrays in typical languages
>>>print lst
[1, 2, 3, 4]

当然,Python列表也可以用更为灵活的索引来进行访问。下面再来看一个例子:

>>>print 'First element' +lst[0]

在这里,你会得到如下所示的错误信息:

TypeError: cannot concatenate 'str' and 'int' objects```
这是因为Python是一种解释型编程语言,它会在对其表达式进行计算的同时检查其中的变量类型。我们在声明这些变量时无需对其进行初始化和类型声明。在这里,我们的列表中所包含的是一些整数对象,它们不能被直接关联到这里的print函数上,后者只能接受一个String对象。出于这个原因,我们需要将该列表元素转换成字符串。这个过程也称为类型转换。

print 'First element :' +str(lst[0])
print 'last element :' +str(lst[-1])
print 'first three elements :' +str(lst[0:2])
print 'last three elements :'+str(lst[-3:])
First element :1

last element :4
first three elements :[1, 2,3]
last three elements :[2, 3, 4]

####1.2.2 自助功能
如果你想要详细了解Python中各种数据类型和函数,***的方法就是调用其帮助函数,如help()和dir(lst)。

其中,我们可以通过dir(某Python对象)命令来列出指定Python对象中所有给定的属性。例如,如果我们像下面这样将一个列表对象传递给该函数,它就会列出所有我们可以用列表来做的很酷的事情:

dir(lst)
' , '.join(dir(lst))

'__add__ , class , contains , delattr , delitem , __
delslice__ , doc , eq , format , ge , getattribute
, getitem , getslice , gt , hash , iadd , imul
, init , iter , le , len , lt , mul , ne ,
new , reduce , reduce_ex , repr , reversed , rmul
, setattr , setitem , setslice , sizeof , str , __
subclasshook__ , append , count , extend , index , insert , pop , remove
, reverse , sort'

而通过help(某Python对象)命令,我们可以得到给定Python对象的详细文档,以及该对象的一些具体用例,如:

help(lst.index)

Help on built-in function index:
index(...)

L.index(value, [start, [stop]]) -> integer -- return first index of value.

This function raises a ValueError if the value is not present.

基本上来说,由于help和dir这两个函数可以运用在任何Python数据类型之上,因此它们是一个很好的学习函数和其他对象细节的方法。而且,它还提供了一些基本的使用范例,这在多数情况下都是非常有用的。

Python的字符串类型与其他语言非常类似,但字符串操作同时也是Python最主要的特性之一。即在Python中,处理字符串会是一件非常轻松的工作。即使是那些非常简单的操作,例如字符串的切割,你也会看到相较于Java和C的大费周章,它们在Python中是多么得简单明了。

通过之前用过的help函数,我们可以得到任何Python对象及函数的帮助信息。下面,我们就再来看一些对字符串这种数据类型来说最为常见的操作。

split():一个能基于某些分隔符来对字符串进行切割的方法。如果你没有为其提供具体参数,它就会默认空格为其分隔符。

mystring="Monty Python ! And the holy Grail ! n"
print mystring.split()
['Monty', 'Python', '!', 'and', 'the', 'holy', 'Grail', '!']

strip():一个可以从字符串中删除其尾随空白符(如'n'、'nr')的方法。

print mystring.strip()
Monty Python ! and the holy Grail !

你会注意到'\n'字符被剥离了。另外,你也可以通过rstrip()和lstrip()来选择是剥离字符串左边还是右边的尾部空白符。

upper()/lower():我们可以用这些方法来改变字符串中字母的大小写。

print mystring.upper()
MONTY PYTHON !AND THE HOLY GRAIL !

replace():该方法可用于替换目标字符串中的某个子串。

print mystring.replace('!','''''')
Monty Python and the holy Grail

当然,字符串类型的函数可远不止这些。这里只是讨论了其中最常用的一些而已。

注意 提示: 

你可以通过下面的链接了解更多字符串函数及其用例:

https://docs.python.org/2/library/string.html`

1.2.3 正则表达式

对NLP爱好者来说,正则表达式是另一个非常重要的技能。正则表达式(regular expression)是一种能对字符串进行有效匹配的模式。我们会大量使用这种模式,以求从大量凌乱的文本数据中提取出有意义的信息。下面,我们就来整体浏览一下你将会用到哪些正则表达式。其实,我这一生至今所用过的正则表达式无非也就是以下这些。

(句点):该表达式用于匹配除换行符\n外的任意单字符。
\w:该表达式用于匹配某一字符或数字,相当于[a-z A-Z 0-9]。
\W(大写W):该表达式用于匹配任意非单词性字符。
\s(小写s):用于匹配任意单个空白字符,包括换行、返回、制表等,相当于[\n\r\t\f]。
\S:该表达式用于匹配单个任意非空白字符。
\t:该表达式用于匹配制表符。
\n:该表达式用于匹配换行符。
\r:该表达用于匹配返回符。
\d:该表达式用于匹配十进制数字,即[0-9]。
^:该表达式用于匹配相关字符串的开始位置。
$:该表达式用于匹配相关字符串的结尾位置。
\:该表达式用来抵消特殊字符的特殊性。如要匹配$符号,就在它前面加上\。

下面,我们来看一个用于查找东西的例子。在这里,myString是要进行相关模式查找的目标字符串对象。字符串的子串搜索是re模块中最常见的用例之一。我们可以来看看它是如何实现的:

>>># We have to import re module to use regular expression
>>>import re
>>>if re.search('Python',mystring):
>>>    print "We found python "
>>>else:
>>>    print "NO "

只要我们执行了以上代码,就会立即收到如下信息:

We found python
我们还可以使用更多正则表达式模式来进行查找。例如,findall()就是一个常被用于对字符串进行全部模式查找的函数。它会按照给定模式对字符串进行查找,并列出其中所有匹配的对象:

>>>import re
>>>print re.findall('!',mystring)
['!', '!']

如你所见,myString中存在着两个“!”实例,findall返回了这两个对象的列表。

1.2.4 字典

字典(dictionary)也是最常用到的一种数据结构。在其他编程语言中有时也被称为关联数组/存储。字典是一种键值索引型的数据结构,其索引键可以是任意一种不可变的类型,例如字符串和数字都经常被用来充当索引键。

字典是被多种编程语言广泛用于实现诸多算法的一种非常便利的数据结构。而且,Python的字典结构还是所有的这些编程语言中最为优雅的哈希表实现之一。哈希表是一种操作起来非常容易的字典结构,其优势在于,你只需通过寥寥几段代码就可以用它建立起一个非常复杂的数据结构,而同样的任务在其他语言中可能就需要花费更多的时间、写更多的代码。很显然,程序员们应该花更多时间在算法上,而不是数据结构本身。

下面,我打算用字典结构中常见的一个用例来获取某段既定文本中各单词的出现频率分布。你可以看到,只需短短几行代码,我们就取得了各单词在文本中的出现频率。如果你再用任意其他语言来尝试一下相同的任务,就会明白Python是何等得奇妙:

>>># declare a dictionary
>>>word_freq={}
>>>for tok in string.split():
>>>    if tok in word_freq:
>>>        word_freq [tok]+=1
>>>    else:
>>>        word_freq [tok]=1
>>>print word_freq
{'!': 2, 'and': 1, 'holy': 1, 'Python': 1, 'Grail': 1, 'the': 1, 'Monty':
1}

1.2.5 编写函数

和其他编程语言一样,Python也有自己的函数编写方式。在Python中,函数的定义通常会从关键字def开始,后面紧跟着相应的函数名和括号()。而所有类似于其他编程语言中的参数和参数类型的声明都会被放在该括号内。其实际代码部分将会从冒号(:)后面开始,代码的初始行通常会是一个文档字符串(注释),接着是代码的主体部分,最后我们会以一个return语句来结束整个函数。下面来看个实例,这个函数实例wordfreq的开头是关键字def,它没有参数,最后以一个return语句作为结束。[2]

>>>import sys
>>>def wordfreq (mystring):
>>>    '''
>>>    Function to generated the frequency distribution of the given text
>>>    '''
>>>    print mystring
>>>    word_freq={}
>>>    for tok in mystring.split():
>>>          if tok in word_freq:
>>>                 word_freq [tok]+=1
>>>          else:
>>>                 word_freq [tok]=1
>>>    print word_freq
>>>def main():
>>>    str="This is my fist python program"
>>>    wordfreq(str)
>>>if __name__ == '__main__':
>>>    main()

如你所见,其代码主体与上一节中所写的完全相同,只不过我们这回以函数的形式使这段代码具备了可重用性和可读性。当然,用解释器风格来编写Python代码的做法也很常见,但从大型程序的编写实践来说,使用函数/类和某种成熟的编程范式是一个更佳的做法。而且,我们也希望用户能早日编写并运行自己的第一个Python程序。对此,你需要按照以下步骤来进行。

1.用你喜欢的文本编辑器创建一个空的Python文件mywordfreq.py。

2.将上面的代码写入或复制到该文件中。

3.在操作系统中打开命令行终端。

4.在该终端中执行以下命令:

   $ python mywordfreq,py "This is my fist python program !!" 。```
5.最后,你应该会得到以下输出:

{'This': 1, 'is': 1, 'python': 1, 'fist': 1, 'program': 1, 'my':1}。`
现在,相信你对Python所提供的一些常见的数据结构有了一个非常基本的了解。你已经可以编写出一个完整的Python程序,并成功地执行了它。在我看来,这些Python引导知识已经足以让你面对本书最初这几章的挑战了。

注意 提示:  

你还可以通过下面网站中的一些Python教程了解更多相关的Python命令: