用于 NLTK 解析的英语语法

有没有一种现成的英语语法,我可以直接加载到 NLTK 使用?我搜索了使用 NLTK 进行语法分析的示例,但似乎在分析一个句子之前必须手动指定语法。

非常感谢!

44962 次浏览

nltk_data发行版中有一些语法。

使用 MaltParser,你会得到一个预先训练好的英语语法,以及其他一些预先训练好的语言。 Maltparser 是一个依赖性解析器,而不是简单的自底向上或自顶向下的解析器。

只需从 http://www.maltparser.org/index.html下载 MaltParser 并像下面这样使用 NLTK:

import nltk
parser = nltk.parse.malt.MaltParser()

您可以看一下 PyStatParser,这是一个返回 NLTK 解析树的简单的 python 统计解析器。它附带了公共树库,并且只在您第一次实例化 Parser 对象时(大约8秒钟)生成语法模型。它使用一个 CKY 算法,它解析平均长度的句子(如下面的一个)在一秒之内。

>>> from stat_parser import Parser
>>> parser = Parser()
>>> print parser.parse("How can the net amount of entropy of the universe be massively decreased?")
(SBARQ
(WHADVP (WRB how))
(SQ
(MD can)
(NP
(NP (DT the) (JJ net) (NN amount))
(PP
(IN of)
(NP
(NP (NNS entropy))
(PP (IN of) (NP (DT the) (NN universe))))))
(VP (VB be) (ADJP (RB massively) (VBN decreased))))
(. ?))

有一个图书馆称为 模式。它是相当快速,易于使用。

>>> from pattern.en import parse
>>>
>>> s = 'The mobile web is more important than mobile apps.'
>>> s = parse(s, relations=True, lemmata=True)
>>> print s


'The/DT/B-NP/O/NP-SBJ-1/the mobile/JJ/I-NP/O/NP-SBJ-1/mobile' ...

我试过 NLTK,PyStatParser,Pattern。IMHO 模式是上面文章中介绍的最好的英语解析器。因为它支持 pip 安装,而且网站上有一个花哨的文档(http://www.clips.ua.ac.be/pages/pattern-en)。我无法为 NLTK 找到合理的文档(并且它默认为我提供了不准确的结果。我找不到调音的方法)。PyStatParser 比上面在我的环境中描述的要慢得多。(初始化大约需要一分钟,解析长句子需要几秒钟。也许我没有正确地使用它)。

我的库 空间提供了一个高性能的依赖性解析器。

安装:

pip install spacy
python -m spacy.en.download all

用法:

from spacy.en import English
nlp = English()
doc = nlp(u'A whole document.\nNo preprocessing require.   Robust to arbitrary formating.')
for sent in doc:
for token in sent:
if token.is_alpha:
print token.orth_, token.tag_, token.head.lemma_

Choi et al。(2015) 发现 space 是可用的最快的依赖解析器。它每秒处理超过13000个句子,在一个线程上。在《华尔街日报》的标准评估中,它得分为92.7% ,比 CoreNLP 的任何一个模型都要准确1% 以上。

你在 NLTK 试过 POS 标签吗?

text = word_tokenize("And now for something completely different")
nltk.pos_tag(text)

答案是这样的

[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'),('completely', 'RB'), ('different', 'JJ')]

从这里得到这个例子 NLTK _ chater03

我发现 nltk 能很好地处理由 Stanford 开发的解析器语法。

基于 Stanford CoreNLP 和 NLTK 的语法分析

开始使用 Stanford CoreNLP 和 NLTK 非常容易。你所需要的只是小小的准备,然后你就可以用下面的代码解析句子了:

from nltk.parse.corenlp import CoreNLPParser
parser = CoreNLPParser()
parse = next(parser.raw_parse("I put the book in the box on the table."))

准备:

  1. 下载 Java Stanford 模型
  2. 运行 CoreNLPServer

可以使用以下代码运行 CoreNLPServer:

import os
from nltk.parse.corenlp import CoreNLPServer
# The server needs to know the location of the following files:
#   - stanford-corenlp-X.X.X.jar
#   - stanford-corenlp-X.X.X-models.jar
STANFORD = os.path.join("models", "stanford-corenlp-full-2018-02-27")
# Create the server
server = CoreNLPServer(
os.path.join(STANFORD, "stanford-corenlp-3.9.1.jar"),
os.path.join(STANFORD, "stanford-corenlp-3.9.1-models.jar"),
)
# Start the server in the background
server.start()

不要忘记执行 server.stop ()的 stop server