天天看点

《Python自然语言处理》——1.2 近观Python:将文本当做词链表

本节书摘来自异步社区《python自然语言处理》一书中的第1章,第1.2节,作者[美]steven bird,ewan klein,edward loper, 陈涛,张旭,崔杨,刘海平 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

大家已经学习过python编程语言的一些重要元素。下面进行简单的系统复习。

链表

文本是什么?一方面,它是一页纸上的符号序列,就像这页纸一样。另一方面,它是章节的序列,每一章由小节序列组成,这些小节由段落序列组成,以此类推。然而,对于我们而言,认为文本不外乎是单词和标点符号的序列。下面是如何展示python中《白鲸记》的开篇句。

在提示符后面,输入自己命名的sent1,后跟一个等号,然后是一些引用的词汇,中间以逗号分割并用括号包围。方括号里的内容在python中叫做链表,是存储文本的方式。可以通过输入名字1来查阅文本。同样可以查询文本的长度2,甚至可以在自己的函数lexical_diversity()中使用3。

定义一些链表,将每个文本开始的句子定义为sent2…sent9。下面只检查其中的两个。你可以在python解释器中查看其余的(如果得到的是一个错误表达:sent2没有定义,你需要先输入from nltk.book import *)。

令人惊喜的是,可以对链表使用python加法运算。两个链表相加①能够创造出一个新的链表,包括第一个链表的全部,并附着第二个链表的全部。

不必逐字地输入链表,可以使用简短的名字来引用预先定义好的链表。

如果想要在链表中增加一个单独的元素该如何做?这种操作叫做追加。当对一个链表使用append()时,链表自身会随着操作而更新。

索引列表

正如已经看到的,python中的文本是一个词汇的链表,用括号和引号来表示。就像处理一页普通的文本,我们可以使用len(text1)来计算text1的全部词数,使用text1.count('heaven')来计算一个文本中特定词出现的次数,如heaven。

稍微耐心些,我们可以挑选出一篇文本中的第1个、第173个甚至第14278个词。类似的,也可以通过在链表中出现的次序找出python链表的元素。表示这个位置的数字叫做这个元素的索引。在文本名称后面的方括号里写下索引,python就会显示出文本中这个索引处——例如文本中第173个词。

也可以反过来做;找出一个词第一次出现时的索引。

索引是一种常见的用来获取文本中词汇的方式,或者,更通俗地讲,任何列表中的元素。通过python也可以获取子链表,从大文本中任意抽取语言片段,术语叫做切片。

索引还有一些微妙之处,我们将在下面的句子中体会这些。

需要注意的是,索引从零开始:第0个元素写作sent[0],其实是第1个词“word1”;而句子的第9个元素是“word10”。原因很简单:python从计算机内存中的链表获取内容的时候,需要告诉它向前多少个元素。因此,向前0个元素使它留在第一个元素上。

现在,如果我们不小心使用的索引量过大就会产生错误。

这不是语法错误,因为程序片段在语法上是正确的。相反,它是一个运行时错误,它会产生一个回溯消息显示错误的上下文,并标注错误的名称:indexerror,以及简要的解释说明。

再次使用构造的句子仔细看看切片,这里我们发现切片5:8包含索引5、6和7的句子元素。

按照惯例,m:n表示元素m…n-1。正如下一个例子所示,如果切片从链表第一个元素开始,可以省略第一个数字1;如果切片到链表最后一个元素处结尾,则可以省略第二个数字2:

可以通过改变它的索引值来修改链表中的元素。在接下来的例子中,把sent[0]放在等号左侧1。也可以用新内容替换掉整个片段2。最后一个报错的原因是这个链表只有4个元素而要获取4后面的元素,所以产生了错误3。

变量

从1.1节开始,已经查看过名为text1,text2等的文本。像这样通过只输入简短的名字来就能引用一本250000字的书的做法节省了很多打字时间。一般情况下,可以对任意的计算命名。在前面的小节中已经这样做了,如下所示,定义一个变量sent1。

语句形式是:变量 = 表达式。python通过计算右边的表达式把结果保存在变量中。这个过程被称为赋值。它并不产生任何输出,但只能在新的一行输入变量的名字才能够检查它的内容。等号可能会有些误解,因为信息是从右边流到左边的。你把它想象成一个左箭头可能会有帮助。变量的名字可以是任何你喜欢的名字,如:my_sent、sentence、xyzzy等。变量必须以字母开头,可以包含数字和下划线。下面是变量和赋值的一些例子。

请记住,排序表中大写字母出现在小写字母之前。

最好是选择有意义的变量名,它能提醒你代码的含义,也能帮助别人读懂你的python代码。python并不理解这些名称的意义。它只是盲目地服从你的指令,如果你输入一些令人困惑的代码,例如:one = 'two'或者two = 3,它也不会反对。唯一的限制是变量名不能是python的保留字,如def、if、not或import。如果你使用了保留字,python会产生语法错误。

我们经常使用变量来保存计算的中间步骤,尤其是在这样做能够使代码更容易被读懂时。因此,len(set(text1))也可以写作如下形式。

字符串

一些用来访问链表元素的方法也可以用在单独的词或字符串上。例如可以把一个字符串指定给一个变量1,索引一个字符串2,划分一个字符串3。

还可以对字符串执行乘法和加法。

可以把词用链表连接起来组成单个字符串,或者把字符串分割成一个链表,如下面所示。