- 9 练习
9 练习
- ☼ IOB 格式分类标注标识符为
I
、O
和B
。三个标签为什么是必要的?如果我们只使用I
和O
标记会造成什么问题? - ☼ 写一个标记模式匹配包含复数中心名词在内的名词短语,如”many/JJ researchers/NNS”, “two/CD weeks/NNS”, “both/DT new/JJ positions/NNS”。通过泛化处理单数名词短语的标记模式,尝试做这个。
- ☼ 选择 CoNLL 语料库中三种词块类型之一。研究 CoNLL 语料库,并尝试观察组成这种类型词块的词性标记序列的任何模式。使用正则表达式词块划分器
nltk.RegexpParser
开发一个简单的词块划分器。讨论任何难以可靠划分词块的标记序列。 - ☼ 词块 的早期定义是出现在词缝之间的内容。开发一个词块划分器以将完整的句子作为一个单独的词块开始,然后其余的工作完全加塞词缝完成。在你自己的应用程序的帮助下,确定哪些标记(或标记序列)最有可能组成词缝。相对于完全基于词块规则的词块划分器,比较这种方法的表现和易用性。
- ◑ 写一个标记模式,涵盖包含动名词在内的名词短语,如”the/DT receiving/VBG end/NN”, “assistant/NN managing/VBG editor/NN”。将这些模式加入到语法,每行一个。用自己设计的一些已标注的句子,测试你的工作。
- ◑ 写一个或多个标记模式处理有连接词的名词短语,如”July/NNP and/CC August/NNP”, “all/DT your/PRP$ managers/NNS and/CC supervisors/NNS”, “company/NN courts/NNS and/CC adjudicators/NNS”。
- ◑ 用任何你之前已经开发的词块划分器执行下列评估任务。(请注意,大多数词块划分语料库包含一些内部的不一致,以至于任何合理的基于规则的方法都将产生错误。)
- 在来自词块划分语料库的 100 个句子上评估你的词块划分器,报告精度、召回率和 F-量度。
- 使用
chunkscore.missed()
和chunkscore.incorrect()
方法识别你的词块划分器的错误。讨论。 - 与本章的评估部分讨论的基准词块划分器比较你的词块划分器的表现。
- ◑ 使用基于正则表达式的词块语法
RegexpChunk
,为 CoNLL 语料库中词块类型中的一个开发一个词块划分器。使用词块、词缝、合并或拆分规则的任意组合。 - ◑ 有时一个词的标注不正确,例如”12/CD or/CC so/RB cases/VBZ”中的中心名词。不用要求手工校正标注器的输出,好的词块划分器使用标注器的错误输出也能运作。查找使用不正确的标记正确为名词短语划分词块的其他例子。
- ◑ 二元词块划分器的准确性得分约为 90%。研究它的错误,并试图找出它为什么不能获得 100%的准确率。实验三元词块划分。你能够再提高准确性吗?
- ★ 在 IOB 词块标注上应用 n-gram 和 Brill 标注方法。不是给词分配词性标记,在这里我们给词性标记分配 IOB 标记。例如如果标记
DT
(限定符)经常出现在一个词块的开头,它会被标注为B
(开始)。相对于本章中讲到的正则表达式词块划分方法,评估这些词块划分方法的表现。 - ★ 在5.中我们看到,通过查找有歧义的 n-grams 可以得到标注准确性的上限,即在训练数据中有多种可能的方式标注的 n-grams。应用同样的方法来确定一个 n-gram 词块划分器的上限。
- ★ 挑选 CoNLL 语料库中三种词块类型之一。编写函数为你选择的类型做以下任务:
- 列出与此词块类型的每个实例一起出现的所有标记序列。
- 计数每个标记序列的频率,并产生一个按频率减少的顺序排列的列表;每行要包含一个整数(频率)和一个标记序列。
- 检查高频标记序列。使用这些作为开发一个更好的词块划分器的基础。
- ★ 在评估一节中提到的基准词块划分器往往会产生比它应该产生的块更大的词块。例如,短语
[every/DT time/NN] [she/PRP] sees/VBZ [a/DT newspaper/NN]
包含两个连续的词块,我们的基准词块划分器不正确地将前两个结合:[every/DT time/NN she/PRP]
。写一个程序,找出这些通常出现在一个词块的开头的词块内部的标记有哪些,然后设计一个或多个规则分裂这些词块。将这些与现有的基准词块划分器组合,重新评估它,看看你是否已经发现了一个改进的基准。 - ★ 开发一个
NP
词块划分器,转换 POS 标注文本为元组的一个列表,其中每个元组由一个后面跟一个名词短语和介词的动词组成,如the little cat sat on the mat
变成('sat', 'on', 'NP')
… - ★ 宾州树库样例包含一部分已标注的《华尔街日报》文本,已经按名词短语划分词块。其格式使用方括号,我们已经在本章遇到它了几次。该语料可以使用
for sent in nltk.corpus.treebank_chunk.chunked_sents(fileid)
来访问。这些都是平坦的树,正如我们使用nltk.corpus.conll2000.chunked_sents()
得到的一样。- 函数
nltk.tree.pprint()
和nltk.chunk.tree2conllstr()
可以用来从一棵树创建树库和 IOB 字符串。编写函数chunk2brackets()
和chunk2iob()
,以一个单独的词块树为它们唯一的参数,返回所需的多行字符串表示。 - 写命令行转换工具
bracket2iob.py
和iob2bracket.py
,(分别)读取树库或 CoNLL 格式的一个文件,将它转换为其他格式。(从 NLTK 语料库获得一些原始的树库或 CoNLL 数据,保存到一个文件,然后使用for line in open(filename)
从 Python 访问它。)
- 函数
- ★ 一个 n-gram 词块划分器可以使用除当前词性标记和 n-1 个前面的词块的标记以外其他信息。调查其他的上下文模型,如 n-1 个前面的词性标记,或一个写前面词块标记连同前面和后面的词性标记的组合。
- ★ 思考一个 n-gram 标注器使用临近的标记的方式。现在观察一个词块划分器可能如何重新使用这个序列信息。例如:这两个任务将使用名词往往跟在形容词后面(英文中)的信息。这会出现相同的信息被保存在两个地方的情况。随着规则集规模增长,这会成为一个问题吗?如果是,推测可能会解决这个问题的任何方式。
关于本文档…
针对 NLTK 3.0 作出更新。本章来自于 Natural Language Processing with Python,Steven Bird, Ewan Klein 和Edward Loper,Copyright © 2014 作者所有。本章依据 Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License [http://creativecommons.org/licenses/by-nc-nd/3.0/us/] 条款,与 自然语言工具包 [http://nltk.org/
] 3.0 版一起发行。
本文档构建于星期三 2015 年 7 月 1 日 12:30:05 AEST