Usando Stanford Tregex en Python

Soy un novato en PNL y Python. Estoy tratando de extraer un subconjunto de frases nominales de los árboles analizados desde StanfordCoreNLP utilizando la herramienta Tregex y la biblioteca de subproceso Python. En particular, estoy tratando de encontrar y extraer frases nominales que coincidan con el siguiente patrón: ‘(NP [$ VP]> S) | (NP [$ VP]> S \ n) | (NP \ n [$ VP] > S) | (NP \ n [$ VP]> S \ n) ‘en la gramática de Tregex.

Por ejemplo, a continuación se muestra el texto original, guardado en una cadena llamada “texto”:

text = ('Pusheen and Smitha walked along the beach. "I want to surf", said Smitha, the CEO of Tesla. However, she fell off the surfboard') 

Después de ejecutar el analizador StanfordCoreNLP usando el envoltorio Python, obtuve los siguientes 3 árboles para las 3 oraciones:

 output1['sentences'][0]['parse'] Out[58]: '(ROOT\n (S\n (NP (NNP Pusheen)\n (CC and)\n (NNP Smitha))\n (VP (VBD walked)\n (PP (IN along)\n (NP (DT the) (NN beach))))\n (. .)))' output1['sentences'][1]['parse'] Out[59]: "(ROOT\n (SINV (`` ``)\n (S\n (NP (PRP I))\n (VP (VBP want)\n (PP (TO to)\n (NP (NN surf) ('' '')))))\n (, ,)\n (VP (VBD said))\n (NP\n (NP (NNP Smitha))\n (, ,)\n (NP\n (NP (DT the) (NNP CEO))\n (PP (IN of)\n (NP (NNP Tesla)))))\n (. .)))" output1['sentences'][2]['parse'] Out[60]: '(ROOT\n (S\n (ADVP (RB However))\n (, ,)\n (NP (PRP she))\n (VP (VBD fell)\n (PRT (RP off))\n (NP (DT the) (NN surfboard)))))' 

Me gustaría extraer las siguientes 3 frases nominales (una para cada oración) y guardarlas como variables (o listas de tokens) en Python:

  • (NP (NNP Pusheen) \ n (CC y) \ n (NNP Smitha))
  • (NP (PRP I))
  • (NP (PRP ella))

Para su información, he usado Tregex desde la línea de comandos con el siguiente código:

 cd stanford-tregex-2016-10-31 java -cp 'stanford-tregex.jar:' edu.stanford.nlp.trees.tregex.TregexPattern -f -s '(NP[$VP]>S)|(NP[$VP]>S\n)|(NP\n[$VP]>S)|(NP\n[$VP]>S\n)' /Users/AS/stanford-tregex-2016-10-31/exampletree.txt 

La salida fue:

 Pattern string: (NP[$VP]>S)|(NP[$VP]>S\n)|(NP\n[$VP]>S)|(NP\n[$VP]>S\n) Parsed representation: or Root NP and $ VP > S Root NP and $ VP > S\n Root NP\n and $ VP > S Root NP\n and $ VP > S\n Reading trees from file(s) file path \# /Users/AS/stanford-tregex-2016-10-31/exampletree.txt (NP (NNP Pusheen) \n (CC and) \n (NNP Smitha)) \# /Users/AS/stanford-tregex-2016-10-31/exampletree.txt (NP\n (NP (NNP Smitha)) \n (, ,) \n (NP\n (NP (DT the) (NN spokesperson)) \n (PP (IN of) \n (NP (DT the) (NNP CIA)))) \n (, ,)) \# /Users/AS/stanford-tregex-2016-10-31/exampletree.txt (NP (PRP They)) There were 3 matches in total. 

¿Cómo puedo replicar este resultado en Python?

Para su referencia, encontré la siguiente publicación a través de Google, que es relevante para mi pregunta pero que está desactualizada ( https://mailman.stanford.edu/pipermail/parser-user/2010-July/000606.html ):

[Parser-usuario] Entrada variable a Tregex

Christopher Manning atendiendo en stanford.edu Mié 07 de julio 17:41:32 PDT 2010 Hola Haiyang,

Lo siento, respuesta lenta, las cosas están demasiado ocupadas al final del año académico.

El 1 de junio de 2010, a las 8:56 pm, Haiyang AI escribió:

Queridos todos,

Espero que este sea el lugar adecuado para buscar ayuda.

Lo es, aunque solo podemos dar una ayuda muy limitada en cualquier cosa específica de Python …

Pero esto parece ser sencillo (creo).

Si lo que desea es que el patrón se ejecute en los árboles que se alimentan a través de la entrada estándar, debe agregar la marca “-filter” en la lista de argumentos antes de “NP”.

Si no se especifica ningún archivo después del patrón, y no se proporciona el indicador “-filter”, entonces se ejecuta el patrón en una oración predeterminada fija …

Chris

Estoy trabajando en un proyecto relacionado con Tregex. Estoy intentando llamar a Tregex desde python, pero no sé cómo enviar datos a Tregex, no desde un archivo convencional, sino desde una variable. Por ejemplo, estoy tratando de contar el número de “NP” de una variable dada (por ejemplo, texto, árbol ya analizado, usando Stanford Parser), con el siguiente código,

def tregex (texto):
tregex_dir = “/ root / nlp / stanford-tregex-2009-08-30 /” op = Popen ([“java”, “-mx900m”, “-cp”, “stanford-tregex.jar:”, “edu. stanford.nlp.trees.tregex.TregexPattern “,” NP “], cwd = tregex_dir, stdout = PIPE, stdin = PIPE, stderr = STDOUT) res = op.communicate (input = text) [0] return res

Los resultados son como los siguientes. No buscó el contenido de la variable, pero de alguna manera recurrió a “usar el árbol predeterminado”. ¿Alguien puede darme una mano? He estado atrapado aquí durante bastante tiempo. Realmente aprecio tu tiempo y ayuda. Cadena de patrón: NP Representación analizada: NP raíz utilizando el árbol predeterminado (NP (NP (DT este) (vino NN)) (CC y) (NP (DT estos) (caracoles NNS)))

(NP (DT esto) (NN vino))

(NP (DT estos) (caracoles NNS))

Hubo 3 partidos en total.

– Haiyang AI, Ph.D. estudiante Departamento de Lingüística Aplicada La Universidad Estatal de Pennsylvania


parser-user mailing list parser-user en lists.stanford.edu https://mailman.stanford.edu/mailman/listinfo/parser-user

¿Por qué no usar el servidor Stanford CoreNLP?

1.) ¡Poner en marcha el servidor!

 java -Xmx4g edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 - timeout 15000 

2.) Hacer una solicitud de python!

 import requests url = "http://localhost:9000/tregex" request_params = {"pattern": "(NP[$VP]>S)|(NP[$VP]>S\\n)|(NP\\n[$VP]>S)|(NP\\n[$VP]>S\\n)"} text = "Pusheen and Smitha walked along the beach." r = requests.post(url, data=text, params=request_params) print r.json() 

3.) ¡Aquí están los resultados!

 {u'sentences': [{u'0': {u'namedNodes': [], u'match': u'(NP (NNP Pusheen)\n (CC and)\n (NNP Smitha))\n'}}]}