Natural Language Toolkit 简明教程
Natural Language Toolkit - Parsing
Parsing and its relevance in NLP
单词“Parsing”源自拉丁语单词 ‘pars’ (含义为 ‘part’ ),用于从文本中提取确切含义或字典含义。它也称为句法分析或语法分析。通过比较正式语法的规则,语法分析检查了文本的含义。例如,诸如“给我热冰淇淋”之类句子将被解析器或句法分析器所拒绝。
从这个意义上说,我们可以定义解析、句法分析或语法分析如下 −
可以将其定义为分析符号串的过程,该串是符合正式语法规则的自然语言。
我们可以借助以下几点理解解析在 NLP 中的相关性 −
-
解析器用于报告任何语法错误。
-
它有助于从常见错误中恢复,以便可以继续处理程序的其余部分。
-
解析树是在解析器的帮助下创建的。
-
解析器用于创建符号表,该表在 NLP 中起着重要作用。
-
解析器还用于生成中间表示 (IR)。
Deep Vs Shallow Parsing
Deep Parsing |
Shallow Parsing |
在深度解析中,搜索策略将为句子提供一个完整的句法结构。 |
解析从给定任务中解析一部分句法信息。 |
适用于复杂的 NLP 应用。 |
可用于不太复杂的 NLP 应用。 |
其中使用深度解析的 NLP 应用示例包括对话系统和摘要。 |
其中使用深度解析的 NLP 应用示例包括信息提取和文本挖掘。 |
也称为完全解析。 |
也称为块处理。 |
Various types of parsers
如讨论的那样,解析器基本上是对语法的程序解释。它在通过各种树的空间搜索后为给定的句子找到了最佳树。请参阅下方一些可用的解析器 –
Recursive descent parser
递归下降解析是最直接的解析形式之一。以下是有关递归下降解析器的一些重要要点 –
-
它遵循一个自顶向下的过程。
-
它尝试验证输入流的语法是否正确。
-
它从左到右读取输入句子。
-
递归下降解析器的一项必要操作是从输入流读取字符并将它们与语法中的终结符进行匹配。
Shift-reduce parser
以下是有关移-约解析器的一些重要要点 –
-
它遵循一个简单的自底向上的过程。
-
它尝试找到与语法产生的右侧对应的一系列单词和短语,并用产生的左侧替换它们。
-
找到一系列单词的上述尝试将一直持续到整个句子被约简为止。
-
换句话说,移-约解析器从输入符号开始,并尝试构建一直到开始符号的解析器树。
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()
NLTK Package
以下是使用 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())