Natural Language Toolkit 简明教程

Natural Language Toolkit - Parsing

Parsing and its relevance in NLP

单词“Parsing”源自拉丁语单词 ‘pars’ (含义为 ‘part’ ),用于从文本中提取确切含义或字典含义。它也称为句法分析或语法分析。通过比较正式语法的规则,语法分析检查了文本的含义。例如,诸如“给我热冰淇淋”之类句子将被解析器或句法分析器所拒绝。

从这个意义上说,我们可以定义解析、句法分析或语法分析如下 −

可以将其定义为分析符号串的过程,该串是符合正式语法规则的自然语言。

relevance

我们可以借助以下几点理解解析在 NLP 中的相关性 −

  1. 解析器用于报告任何语法错误。

  2. 它有助于从常见错误中恢复,以便可以继续处理程序的其余部分。

  3. 解析树是在解析器的帮助下创建的。

  4. 解析器用于创建符号表,该表在 NLP 中起着重要作用。

  5. 解析器还用于生成中间表示 (IR)。

Deep Vs Shallow Parsing

Deep Parsing

Shallow Parsing

在深度解析中,搜索策略将为句子提供一个完整的句法结构。

解析从给定任务中解析一部分句法信息。

适用于复杂的 NLP 应用。

可用于不太复杂的 NLP 应用。

其中使用深度解析的 NLP 应用示例包括对话系统和摘要。

其中使用深度解析的 NLP 应用示例包括信息提取和文本挖掘。

也称为完全解析。

也称为块处理。

Various types of parsers

如讨论的那样,解析器基本上是对语法的程序解释。它在通过各种树的空间搜索后为给定的句子找到了最佳树。请参阅下方一些可用的解析器 –

Recursive descent parser

递归下降解析是最直接的解析形式之一。以下是有关递归下降解析器的一些重要要点 –

  1. 它遵循一个自顶向下的过程。

  2. 它尝试验证输入流的语法是否正确。

  3. 它从左到右读取输入句子。

  4. 递归下降解析器的一项必要操作是从输入流读取字符并将它们与语法中的终结符进行匹配。

Shift-reduce parser

以下是有关移-约解析器的一些重要要点 –

  1. 它遵循一个简单的自底向上的过程。

  2. 它尝试找到与语法产生的右侧对应的一系列单词和短语,并用产生的左侧替换它们。

  3. 找到一系列单词的上述尝试将一直持续到整个句子被约简为止。

  4. 换句话说,移-约解析器从输入符号开始,并尝试构建一直到开始符号的解析器树。

Chart parser

以下是有关图表解析器的一些重要要点 –

  1. 主要适用于有歧义的语法,包括自然语言语法。

  2. 对解析问题应用动态规划。

  3. 由于动态规划,部分假设结果存储在称为“图表”的结构中。

  4. “图表”还可以重复使用。

Regexp parser

正则表达式解析是最常用的解析技术之一。以下是关于正则表达式解析器的一些重要要点 -

  1. 顾名思义,它使用在 POS 标记字符串上定义为语法形式的正则表达式。

  2. 它基本上使用这些正则表达式来解析输入句子,并从中生成解析树。

Example

以下是正则表达式解析器的实际示例 -

import nltk
sentence = [
   ("a", "DT"),
   ("clever", "JJ"),
   ("fox","NN"),
   ("was","VBP"),
   ("jumping","VBP"),
   ("over","IN"),
   ("the","DT"),
   ("wall","NN")
]
grammar = "NP:{<DT>?<JJ>*<NN>}"
Reg_parser = nltk.RegexpParser(grammar)
Reg_parser.parse(sentence)
Output = Reg_parser.parse(sentence)
Output.draw()

Output

regexp parser

Dependency Parsing

依存关系解析 (DP),一种现代解析机制,其主要概念是每个语言单元(即单词)通过直接链接相互关联。这些直接链接在语言学中实际上是 ‘dependencies’ 。例如,下图显示了句子 “John can hit the ball” 的依存关系语法。

dependency parsing

NLTK Package

以下是使用 NLTK 进行依存关系解析的两种方式 -

Probabilistic, projective dependency parser

这是我们可以使用 NLTK 进行依存关系解析的第一种方式。但此解析器对使用有限的训练数据进行训练有限制。

Stanford parser

这是我们可以使用 NLTK 执行依存关系解析的另一种方式。斯坦福解析器是一种最先进的依存关系解析器。NLTK 对此进行了包装。要使用它,我们需要下载以下两样东西 -

Language model ,适用于所需语言。例如,英语语言模型。

Example

下载模型后,我们可以通过 NLTK 使用它,如下所示 -

from nltk.parse.stanford import StanfordDependencyParser
path_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'
dep_parser = StanfordDependencyParser(
   path_to_jar = path_jar, path_to_models_jar = path_models_jar
)
result = dep_parser.raw_parse('I shot an elephant in my sleep')
depndency = result.next()
list(dependency.triples())

Output

[
   ((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
   ((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
   ((u'elephant', u'NN'), u'det', (u'an', u'DT')),
   ((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
   ((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
   ((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))
]