NLTK Context Free Grammar Genaration

Cha*_*gaD 9 python parsing nlp nltk context-free-grammar

我正在研究一个带有Unicode字符的非英语解析器.为此,我决定使用NLTK.

但它需要一个预定义的无上下文语法,如下所示:

  S -> NP VP
  VP -> V NP | V NP PP
  PP -> P NP
  V -> "saw" | "ate" | "walked"
  NP -> "John" | "Mary" | "Bob" | Det N | Det N PP
  Det -> "a" | "an" | "the" | "my"
  N -> "man" | "dog" | "cat" | "telescope" | "park"
  P -> "in" | "on" | "by" | "with" 
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我应该使用基于规则的语法来最小化硬编码.例如,我可以假设以-ed-ing结尾的任何单词作为动词.所以它应该适用于任何给定的上下文.

如何将这些语法规则提供给NLTK?或者使用有限状态机动态生成它们?

dka*_*kar 7

如果要创建解析器,则必须在实际解析之前添加pos-tagging步骤 - 无法成功确定单词脱离上下文的POS标记.例如,'封闭'可以是形容词或动词; POS标签可以从单词的上下文中找到适合您的标签.然后,您可以使用POS标记器的输出来创建CFG.

您可以使用众多现有POS标签之一.在NLTK中,您可以简单地执行以下操作:

import nltk
input_sentence = "Dogs chase cats"
text = nltk.word_tokenize(input_sentence)
list_of_tokens = nltk.pos_tag(text)
print list_of_tokens
Run Code Online (Sandbox Code Playgroud)

输出将是:

[('Dogs', 'NN'), ('chase', 'VB'), ('cats', 'NN')]
Run Code Online (Sandbox Code Playgroud)

您可以使用它来创建语法字符串并将其提供给nltk.parse_cfg().


art*_*omp 3

也许您正在寻找CFG.fromstring()(以前parse_cfg())?

来自NLTK 书第 7 章(更新为 NLTK 3.0):

> grammar = nltk.CFG.fromstring("""
 S -> NP VP
 VP -> V NP | V NP PP
 V -> "saw" | "ate"
 NP -> "John" | "Mary" | "Bob" | Det N | Det N PP
 Det -> "a" | "an" | "the" | "my"
 N -> "dog" | "cat" | "cookie" | "park"
 PP -> P NP
 P -> "in" | "on" | "by" | "with"
 """)

> sent = "Mary saw Bob".split()
> rd_parser = nltk.RecursiveDescentParser(grammar)
> for p in rd_parser.parse(sent):
      print p
(S (NP Mary) (VP (V saw) (NP Bob)))
Run Code Online (Sandbox Code Playgroud)