¿Cómo hacer coincidir enteros en NLTK CFG?

Si quiero definir una gramática en la que una de las fichas coincidirá con un entero, ¿cómo puedo lograrlo utilizando la cadena CFG de nltk?

Por ejemplo –

S -> SK SO FK SK -> 'SELECT' SO -> '\d+' FK -> 'FROM' 

Crea una frase numérica como tal:

 import nltk groucho_grammar = nltk.CFG.fromstring(""" S -> NP VP PP -> P NP NP -> Det N | Det N PP | 'I' | NUM N VP -> V NP | VP PP Det -> 'an' | 'my' N -> 'elephant' | 'pajamas' | 'elephants' V -> 'shot' P -> 'in' NUM -> '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' """) sent = 'I shot 3 elephants'.split() parser = nltk.ChartParser(groucho_grammar) for tree in parser.parse(sent): print(tree) 

[afuera]:

 (S (NP I) (VP (V shot) (NP (NUM 3) (N elephants)))) 

Pero tenga en cuenta que eso solo puede manejar un número de un solo dígito. Así que intentemos comprimir los enteros en un solo tipo de token, por ejemplo, ‘# NUM #’:

 import nltk groucho_grammar = nltk.CFG.fromstring(""" S -> NP VP PP -> P NP NP -> Det N | Det N PP | 'I' | NUM N VP -> V NP | VP PP Det -> 'an' | 'my' N -> 'elephant' | 'pajamas' | 'elephants' V -> 'shot' P -> 'in' NUM -> '#NUM#' """) sent = 'I shot 333 elephants'.split() sent = ['#NUM#' if i.isdigit() else i for i in sent] parser = nltk.ChartParser(groucho_grammar) for tree in parser.parse(sent): print(tree) 

[afuera]:

 (S (NP I) (VP (V shot) (NP (NUM #NUM#) (N elephants)))) 

Para volver a poner los números, intente:

 import nltk groucho_grammar = nltk.CFG.fromstring(""" S -> NP VP PP -> P NP NP -> Det N | Det N PP | 'I' | NUM N VP -> V NP | VP PP Det -> 'an' | 'my' N -> 'elephant' | 'pajamas' | 'elephants' V -> 'shot' P -> 'in' NUM -> '#NUM#' """) original_sent = 'I shot 333 elephants'.split() sent = ['#NUM#' if i.isdigit() else i for i in original_sent] numbers = [i for i in original_sent if i.isdigit()] parser = nltk.ChartParser(groucho_grammar) for tree in parser.parse(sent): treestr = str(tree) for n in numbers: treestr = treestr.replace('#NUM#', n, 1) print(treestr) 

[afuera]:

 (S (NP I) (VP (V shot) (NP (NUM 333) (N elephants))))