《创世纪》有 44764 个词和标点符号或者叫“词符”。词符 表示一个我们想要整体对待的字符序列 —— 例如`hairy`,`his` 或 `:)`。当我们计数文本如 to be or not to be 这个短语中词符的个数时,我们计数这些序列出现的次数。因此,我们的例句中出现了 to 和 be 各两次,or 和 not 各一次。然而在例句中只有 4 个不同的词。《创世纪》中有多少不同的词?要用 Python 来回答这个问题,我们处理问题的方法将稍有改变。一个文本词汇表只是它用到的词符的 _ 集合 _,因为在集合中所有重复的元素都只算一个。Python 中我们可以使用命令:`set(text3)` 获得`text3` 的词汇表。当你这样做时,屏幕上的很多词会掠过。现在尝试以下操作:
总结一下,我们已经定义了一个任务:计算机对自然语言查询做出反应,返回有用的数据。我们通过将英语的一个小的子集翻译成 SQL 来实现这个任务们可以说,我们的 NLTK 代码已经“理解”SQL,只要 Python 能够对数据库执行 SQL 查询,通过扩展,它也“理解”如 What cities are located in China 这样的查询。这相当于自然语言理解的例子能够从荷兰语翻译成英语。假设你是一个英语为母语的人,已经开始学习荷兰语。你的老师问你是否理解[(3)](./ch10.html#ex-sem1)的意思:
我们将使用 XML 格式的莎士比亚戏剧集来说明 ElementTree 的使用方法。让我们加载 XML 文件并检查原始数据,首先在文件的顶部[![[1]](Images/346344c2e5a627acfdddf948fb69cb1d.jpg)](./ch11.html#top-of-file),在那里我们看到一些 XML 头和一个名为`play.dtd`的模式,接着是根元素 `PLAY`。我们从 Act 1[![[2]](Images/f9e1ba3246770e3ecb24f813f33f2075.jpg)](./ch11.html#start-act-one)再次获得数据。(输出中省略了一些空白行。)
我们将使用 XML 格式的莎士比亚戏剧集来说明 ElementTree 的使用方法。让我们加载 XML 文件并检查原始数据,首先在文件的顶部[❶](./ch11.html#top-of-file),在那里我们看到一些 XML 头和一个名为`play.dtd`的模式,接着是根元素 `PLAY`。我们从 Act 1[❷](./ch11.html#start-act-one)再次获得数据。(输出中省略了一些空白行。)
@@ -394,18 +394,18 @@ Python 的 ElementTree 模块提供了一种方便的方式访问存储在 XML
我们刚刚访问了作为一个字符串的 XML 数据。正如我们看到的,在 Act 1 开始处的字符串包含 XML 标记 title、scene、stage directions 等。
下一步是作为结构化的 XML 数据使用`ElementTree`处理文件的内容。我们正在处理一个文件(一个多行字符串),并建立一棵树,所以方法的名称是`parse`[![[1]](Images/346344c2e5a627acfdddf948fb69cb1d.jpg)](./ch11.html#xml-parse)并不奇怪。变量`merchant`包含一个 XML 元素`PLAY`[![[2]](Images/f9e1ba3246770e3ecb24f813f33f2075.jpg)](./ch11.html#element-play)。此元素有内部结构;我们可以使用一个索引来得到它的第一个孩子,一个`TITLE`元素[![[3]](Images/13f25b9eba42f74ad969a74cee78551e.jpg)](./ch11.html#element-title)。我们还可以看到该元素的文本内容:戏剧的标题[![[4]](Images/92cc2e7821d464cfbaaf651a360cd413.jpg)](./ch11.html#element-text)。要得到所有的子元素的列表,我们使用`getchildren()`方法[![[5]](Images/63a8e4c47e813ba9630363f9b203a19a.jpg)](./ch11.html#getchildren-method)。
下一步是作为结构化的 XML 数据使用`ElementTree`处理文件的内容。我们正在处理一个文件(一个多行字符串),并建立一棵树,所以方法的名称是`parse`[❶](./ch11.html#xml-parse)并不奇怪。变量`merchant`包含一个 XML 元素`PLAY`[❷](./ch11.html#element-play)。此元素有内部结构;我们可以使用一个索引来得到它的第一个孩子,一个`TITLE`元素[❸](./ch11.html#element-title)。我们还可以看到该元素的文本内容:戏剧的标题[❹](./ch11.html#element-text)。要得到所有的子元素的列表,我们使用`getchildren()`方法[❺](./ch11.html#getchildren-method)。
ó U+00f3 LATIN SMALL LETTER O WITH ACUTEś U+015b LATIN SMALL LETTER S WITH ACUTEŚ U+015a LATIN CAPITAL LETTER S WITH ACUTEą U+0105 LATIN SMALL LETTER A WITH OGONEKł U+0142 LATIN SMALL LETTER L WITH STROKE
...
...
@@ -963,20 +963,20 @@ v 93 27 105 48 49
### 搜索已分词文本
你可以使用一种特殊的正则表达式搜索一个文本中多个词(这里的文本是一个词符列表)。例如,`"<a> <man>"`找出文本中所有 a man 的实例。尖括号用于标记词符的边界,尖括号之间的所有空白都被忽略(这只对 NLTK 中的`findall()`方法处理文本有效)。在下面的例子中,我们使用`<.*>`[![[1]](Images/7e6ea96aad77f3e523494b3972b5a989.jpg)](./ch03.html#single-token-wildcard),它将匹配所有单个词符,将它括在括号里,于是只匹配词(例如 monied)而不匹配短语(例如,a monied man)会生成。第二个例子找出以词 bro 结尾的三个词组成的短语[![[2]](Images/be33958d0b44c88caac0dcf4d4ec84c6.jpg)](./ch03.html#three-word-phrases)。最后一个例子找出以字母 l 开始的三个或更多词组成的序列[![[3]](Images/7c20d0adbadb35031a28bfcd6dff9900.jpg)](./ch03.html#letter-l)。
你可以使用一种特殊的正则表达式搜索一个文本中多个词(这里的文本是一个词符列表)。例如,`"<a> <man>"`找出文本中所有 a man 的实例。尖括号用于标记词符的边界,尖括号之间的所有空白都被忽略(这只对 NLTK 中的`findall()`方法处理文本有效)。在下面的例子中,我们使用`<.*>`[❶](./ch03.html#single-token-wildcard),它将匹配所有单个词符,将它括在括号里,于是只匹配词(例如 monied)而不匹配短语(例如,a monied man)会生成。第二个例子找出以词 bro 结尾的三个词组成的短语[❷](./ch03.html#three-word-phrases)。最后一个例子找出以字母 l 开始的三个或更多词组成的序列[❸](./ch03.html#letter-l)。
接下来,让我们看一些较大范围的上下文,找出涉及特定标记和词序列的词(在这种情况下,`"<Verb> to <Verb>"`)。在 code-three-word-phrase 中,我们考虑句子中的每个三词窗口[![[1]](Images/7a979f968bd33428b02cde62eaf2b615.jpg)](./ch05.html#three-word),检查它们是否符合我们的标准[![[2]](Images/6ac827d2d00b6ebf8bbc704f430af896.jpg)](./ch05.html#verb-to-verb)。如果标记匹配,我们输出对应的词[![[3]](Images/934b688727805b37f2404f7497c52027.jpg)](./ch05.html#print-words)。
接下来,让我们看一些较大范围的上下文,找出涉及特定标记和词序列的词(在这种情况下,`"<Verb> to <Verb>"`)。在 code-three-word-phrase 中,我们考虑句子中的每个三词窗口[❶](./ch05.html#three-word),检查它们是否符合我们的标准[❷](./ch05.html#verb-to-verb)。如果标记匹配,我们输出对应的词[❸](./ch05.html#print-words)。
```py
from nltk.corpus import brown
def process(sentence):
for (w1,t1), (w2,t2), (w3,t3) in nltk.trigrams(sentence): ![[1]](Images/7a979f968bd33428b02cde62eaf2b615.jpg)
if (t1.startswith('V') and t2 == 'TO' and t3.startswith('V')): ![[2]](Images/6ac827d2d00b6ebf8bbc704f430af896.jpg)
在[![[3]](Images/f202bb6a4c773430e3d1340de573d0e5.jpg)](./ch06.html#document-classify-set)中我们计算文档的所有词的集合,而不仅仅检查是否`word in document`,因为检查一个词是否在一个集合中出现比检查它是否在一个列表中出现要快的多([4.7](./ch04.html#sec-algorithm-design))。
在[❸](./ch06.html#document-classify-set)中我们计算文档的所有词的集合,而不仅仅检查是否`word in document`,因为检查一个词是否在一个集合中出现比检查它是否在一个列表中出现要快的多([4.7](./ch04.html#sec-algorithm-design))。