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")