对比上述目标,我们有意回避了工具包三个非需求行的但可能有用的特征。首先,虽然工具包提供了广泛的工具,但它不是面面俱全的;它是一个工具包而不是一个系统,它将会随着 NLP 领域一起演化。第二,虽然这个工具包的效率足以支持实际的任务,但它运行时的性能还没有高度优化;这种优化往往涉及更复杂的算法或使用 C 或 C++ 等较低一级的编程语言来实现。这将影响工具包的可读性且更难以安装。第三,我们试图避开巧妙的编程技巧,因为我们相信清楚直白的实现比巧妙却可读性差的方法好。
网络上的文本大部分是 HTML 文件的形式。你可以使用网络浏览器将网页作为文本保存为本地文件,然后按照下面关于文件的小节描述的那样来访问它。不过,如果你要经常这样做,最简单的办法是直接让 Python 来做这份工作。第一步是像以前一样使用`urlopen`。为了好玩,我们将挑选一个被称为*Blondes to die out in 200 years*的 BBC 新闻故事,一个都市传奇被 BBC 作为确立的科学事实流传下来:
网络上的文本大部分是 HTML 文件的形式。你可以使用网络浏览器将网页作为文本保存为本地文件,然后按照下面关于文件的小节描述的那样来访问它。不过,如果你要经常这样做,最简单的办法是直接让 Python 来做这份工作。第一步是像以前一样使用`urlopen`。为了好玩,我们将挑选一个被称为《Blondes to die out in 200 years》的 BBC 新闻故事,一个都市传奇被 BBC 作为确立的科学事实流传下来:
表达式的第一部分«`^[ghi]`»匹配以 g, h 或 i 开始的词。表达式的下一部分,«`[mno]`»限制了第二个字符是 m, n 或 o。第三部分和第四部分同样被限制。只有 4 个单词满足这些限制。注意,方括号内的字符的顺序是没有关系的,所以我们可以写成«`^[hig][nom][ljk][fed]
表达式的第一部分`^[ghi]`匹配以`g, h, i`开始的词。表达式的下一部分,`[mno]`限制了第二个字符是`m, n, o`。第三部分和第四部分同样被限制。只有 4 个单词满足这些限制。注意,方括号内的字符的顺序是没有关系的,所以我们可以写成`^[hig][nom][ljk][fed]$`
**轮到你来**:在 W3C 日期时间格式中,日期像这样表示:2009-12-31。Replace the `?` in the following Python code with a regular expression, in order to convert the string `'2009-12-31'` to a list of integers `[2009, 12, 31]`:
考查 s 行和 t 行,我们看到它们是部分的“互补分布”,这个证据表明它们不是这种语言中的独特音素。从而我们可以令人信服的从罗托卡特语字母表中去除 s,简单加入一个发音规则:当字母 t 跟在 i 后面时发 s 的音。(注意单独的条目 *su* 即 *kasuari*,‘cassowary’是从英语中借来的)。
这段代码依次处理每个词`w`,对每一个词找出匹配正则表达式«`[ptksvr][aeiou]`»的所有子字符串。对于词 kasuari,它找到 ka, su 和 ri。因此,`cv_word_pairs`将包含`('ka', 'kasuari')`, `('su', 'kasuari')`和`('ri', 'kasuari')`。更进一步使用`nltk.Index()`转换成有用的索引。
你可以使用一种特殊的正则表达式搜索一个文本中多个词(这里的文本是一个词符列表)。例如,`"<a> <man>"`找出文本中所有 a man 的实例。尖括号用于标记词符的边界,尖括号之间的所有空白都被忽略(这只对 NLTK 中的`findall()`方法处理文本有效)。在下面的例子中,我们使用`<.*>`❶,它将匹配所有单个词符,将它括在括号里,于是只匹配词(例如 monied)而不匹配短语(例如,a monied man)会生成。第二个例子找出以词 bro 结尾的三个词组成的短语❷。最后一个例子找出以字母 l 开始的三个或更多词组成的序列❸。
当我们研究的语言现象与特定词语相关时建立搜索模式是很容易的。在某些情况下,一个小小的创意可能会花很大功夫。例如,在大型文本语料库中搜索 x and other ys 形式的表达式能让我们发现上位词(见 5):
当我们研究的语言现象与特定词语相关时建立搜索模式是很容易的。在某些情况下,一个小小的创意可能会花很大功夫。例如,在大型文本语料库中搜索`x and other ys`形式的表达式能让我们发现上位词(见 5):
```py
>>> from nltk.corpus import brown
...
...
@@ -998,7 +998,7 @@ objects; military and other areas; demands and other factors;
abstracts and other compilations; iron and other metals
```
只要有足够多的文本,这种做法会给我们一整套有用的分类标准信息,而不需要任何手工劳动。然而,我们的搜索结果中通常会包含误报,即我们想要排除的情况。例如,结果 demands and other factors 暗示 demand 是类型 factor 的一个实例,但是这句话实际上是关于要求增加工资的。尽管如此,我们仍可以通过手工纠正这些搜索的结果来构建自己的英语概念的本体。
只要有足够多的文本,这种做法会给我们一整套有用的分类标准信息,而不需要任何手工劳动。然而,我们的搜索结果中通常会包含误报,即我们想要排除的情况。例如,结果`demands and other factors`暗示`demand`是类型`factor`的一个实例,但是这句话实际上是关于要求增加工资的。尽管如此,我们仍可以通过手工纠正这些搜索的结果来构建自己的英语概念的本体。
注意
...
...
@@ -1008,11 +1008,11 @@ abstracts and other compilations; iron and other metals
注意
**轮到你来**:查找模式 as x as y 的实例以发现实体及其属性信息。
**轮到你来**:查找模式`as x as y`的实例以发现实体及其属性信息。
## 3.6 规范化文本
在前面的程序例子中,我们在处理文本词汇前经常要将文本转换为小写,即`set(w.lower() for w in text)`。通过使用`lower()`我们将文本规范化为小写,这样一来 The 与 the 的区别被忽略。我们常常想比这走得更远,去掉所有的词缀以及提取词干的任务等。更进一步的步骤是确保结果形式是字典中确定的词,即叫做词形归并的任务。我们依次讨论这些。首先,我们需要定义我们将在本节中使用的数据:
在前面的程序例子中,我们在处理文本词汇前经常要将文本转换为小写,即`set(w.lower() for w in text)`。通过使用`lower()`我们将文本规范化为小写,这样一来`The`与`the`的区别被忽略。我们常常想比这走得更远,去掉所有的词缀以及提取词干的任务等。更进一步的步骤是确保结果形式是字典中确定的词,即叫做词形归并的任务。我们依次讨论这些。首先,我们需要定义我们将在本节中使用的数据:
```py
>>> raw = """DENNIS: Listen, strange women lying in ponds distributing swords
...
...
@@ -1023,7 +1023,7 @@ abstracts and other compilations; iron and other metals
28. ◑ 考虑下面的摘自 MedLine 语料库的句子中的数字表达式:The corresponding free cortisol fractions in these sera were 4.53 +/- 0.15% and 8.16 +/- 0.23%, respectively.我们应该说数字表达式 4.53 +/- 0.15%是三个词吗?或者我们应该说它是一个单独的复合词?或者我们应该说它实际上是*九*个词,因为它读作“four point five three,plus or minus fifteen percent”?或者我们应该说这不是一个“真正的”词,因为它不会出现在任何词典中?讨论这些不同的可能性。你能想出产生这些答案中至少两个以上可能性的应用领域吗?
28. ◑ 考虑下面的摘自 MedLine 语料库的句子中的数字表达式:`The corresponding free cortisol fractions in these sera were 4.53 +/- 0.15% and 8.16 +/- 0.23%, respectively.`。我们应该说数字表达式`4.53 +/- 0.15%`是三个词吗?或者我们应该说它是一个单独的复合词?或者我们应该说它实际上是*九*个词,因为它读作`four point five three,plus or minus fifteen percent`?或者我们应该说这不是一个“真正的”词,因为它不会出现在任何词典中?讨论这些不同的可能性。你能想出产生这些答案中至少两个以上可能性的应用领域吗?
32. ◑ 定义一个变量`silly`包含字符串:`'newly formed bland ideas are inexpressible in an infuriating way'`。(这碰巧是合法的解释,讲英语西班牙语双语者可以适用于乔姆斯基著名的无意义短语,colorless green ideas sleep furiously,来自维基百科)。编写代码执行以下任务:
32. ◑ 定义一个变量`silly`包含字符串:`'newly formed bland ideas are inexpressible in an infuriating way'`。(这碰巧是合法的解释,讲英语西班牙语双语者可以适用于乔姆斯基著名的无意义短语,`colorless green ideas sleep furiously`,来自维基百科)。编写代码执行以下任务:
34. ◑ 编写代码,将国家的形容词转换为它们对应的名词形式,如将 Canadian 和 Australian 转换为 Canada 和 Australia(见`http://en.wikipedia.org/wiki/List_of_adjectival_forms_of_place_names`)。
35. ◑ 阅读 LanguageLog 中关于短语的 as best as p can 和 as best p can 形式的帖子,其中 p 是一个代名词。在一个语料库和 3.5 中描述的搜索已标注的文本的`findall()`方法的帮助下,调查这一现象。`http://itre.cis.upenn.edu/~myl/languagelog/archives/002733.html`
35. ◑ 阅读 LanguageLog 中关于短语的`as best as p can`和`as best p can`形式的帖子,其中`p`是一个代名词。在一个语料库和 3.5 中描述的搜索已标注的文本的`findall()`方法的帮助下,调查这一现象。`http://itre.cis.upenn.edu/~myl/languagelog/archives/002733.html`