2017-03-01 85 views
1

我的問題是:如何使用NLTK Python爲任何句子生成CFG?

我有很多句子的文檔很多。對於每一個句子,我必須使用nltk python編寫一個CFG。

grammar1 = nltk.CFG.fromstring(""" 
    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" 
    """) 

而不是這樣做:

  • 我希望有一個普遍的CFG這是適用於任何一句

  • 我想CFG自動生成每個句子。

我很震驚。請幫我解決這個問題。

+0

回答「我想要一個適用於任何句子的通用CFG」=「不可能」。 – alvas

+0

回答「我想爲每個句子自動生成CFG」。 =「也許(如果你有訓練有素的解析器)」。 – alvas

+0

您可以從解析樹庫中獲取語法規則,也可以爲解析器以前未見過的新句子推斷新的語法結構。 – alvas

回答

1

如果您有一個或多個已解析的句子,則可以通過調用解析的句子對象(nltk.Tree)上的方法productions()來提取描述它們的CFG。下面是一個例子與第10個句子賓州樹庫語料:

>>> ruleset = set(rule for tree in nltk.corpus.treebank.parsed_sents()[:10] 
      for rule in tree.productions()) 
>>> for rule in ruleset: 
     print(rule) 

NP -> PRP 
NP -> DT JJ NN 
VP -> VBN S 
ADVP-TMP -> RB 
IN -> 'among' 
NNP -> 'Corp.' 
NP -> PRP$ NN NN NNS 
NP-SBJ -> DT 
RRC -> ADVP-TMP VP 
NNP -> 'Journal' 
VP -> VBN NP 
... 

上述會給你278條規則(包括詞彙項目)爲那些10句,但它得到你的樣品增長更好。你可以從那裏拿走它。

當然,如果你的句子還沒有被解析,你首先需要解析它們。