nltk no puede interpretar la salida de la categoría gtwigtical PRP $ por stanford parser

Quiero generar una oración de la gramática extraída del analizador de Stanford, pero NLTK no puede interpretar los PRP $.

from nltk.parse.stanford import StanfordParser from nltk.grammar import CFG from nltk.parse.generate import generate sp=StanfordParser(model_path='/home/aman/stanford_resource/stanford-parser-full-2014-06-16/stanford-parser-3.4-models/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz',path_to_jar='/home/aman/stanford_resource/stanford-parser-full-2014-06-16/stanford-parser.jar',path_to_models_jar='/home/aman/stanford_resource/stanford-postagger-full-2014-08-27/stanford-postagger-3.4.1.jar') sent1='He killed the tiger in his pants' parse_result=sp.raw_parse(sent1) grammar_list=[] for p in parse_result: l=p.productions() grammar_string='\n'.join(map(str,l)) grammar=CFG.fromstring(grammar_string) #grammar_list.append(grammar) #for s in generate(grammar,n=3): # print s ValueError: Unable to parse line 11: NP -> PRP$ NNS Expected a nonterminal, found: $ NNS 

cómo se puede trabajar. Debo dar instrucciones específicas a nltk para estas categorías de gramática.

ValueError: no se puede analizar la línea 11: NP -> PRP $ NNS
Se esperaba un no terminal, encontrado: $ NNS

No tengo idea de por qué está intentando combinar un CFG construido a mano con la salida del analizador de Stanford, pero aquí hay una solución a este problema:

La inspección rápida de nltk/grammar.py muestra que $ no es un carácter legal para un nombre que no sea de terminal. Esto se puede corregir fácilmente parcheando el módulo de esta manera:

 import nltk import re nltk.grammar._STANDARD_NONTERM_RE = re.compile('( [\w/][\w$/^<>-]* ) \s*', re.VERBOSE) 

En lo anterior acabo de agregar $ a la nltk/grammar.py que encontrará en nltk/grammar.py . A continuación, puede crear y usar gramáticas que tengan $ en sus producciones:

 grammar = nltk.grammar.CFG.fromstring("NP -> PRP$ NNS")