python - corenlp - Stanford Parser y NLTK
corenlp stanford (17)
EDITADO
Nota: la siguiente respuesta solo funcionará en:
- Versión NLTK> = 3.2.5
- Stanford Tools compilado desde 2016-10-31
- Python 2.7, 3.5 y 3.6
Como ambas herramientas cambian bastante rápido y la API puede verse muy diferente 3-6 meses después. Por favor, trate la siguiente respuesta como temporal y no como una solución eterna.
Siempre consulte https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software para obtener la última instrucción sobre cómo interconectar las herramientas de Stanford NLP usando NLTK.
TL; DR
El siguiente código proviene de https://github.com/nltk/nltk/pull/1735#issuecomment-306091826
En la terminal:
wget http://nlp.stanford.edu/software/stanford-corenlp-full-2016-10-31.zip
unzip stanford-corenlp-full-2016-10-31.zip && cd stanford-corenlp-full-2016-10-31
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer /
-preload tokenize,ssplit,pos,lemma,parse,depparse /
-status_port 9000 -port 9000 -timeout 15000
En Python:
>>> from nltk.tag.stanford import CoreNLPPOSTagger, CoreNLPNERTagger
>>> from nltk.parse.corenlp import CoreNLPParser
>>> stpos, stner = CoreNLPPOSTagger(), CoreNLPNERTagger()
>>> stpos.tag(''What is the airspeed of an unladen swallow ?''.split())
[(u''What'', u''WP''), (u''is'', u''VBZ''), (u''the'', u''DT''), (u''airspeed'', u''NN''), (u''of'', u''IN''), (u''an'', u''DT''), (u''unladen'', u''JJ''), (u''swallow'', u''VB''), (u''?'', u''.'')]
>>> stner.tag(''Rami Eid is studying at Stony Brook University in NY''.split())
[(u''Rami'', u''PERSON''), (u''Eid'', u''PERSON''), (u''is'', u''O''), (u''studying'', u''O''), (u''at'', u''O''), (u''Stony'', u''ORGANIZATION''), (u''Brook'', u''ORGANIZATION''), (u''University'', u''ORGANIZATION''), (u''in'', u''O''), (u''NY'', u''O'')]
>>> parser = CoreNLPParser(url=''http://localhost:9000'')
>>> next(
... parser.raw_parse(''The quick brown fox jumps over the lazy dog.'')
... ).pretty_print() # doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______________|__________________________
| VP |
| _________|___ |
| | PP |
| | ________|___ |
NP | | NP |
____|__________ | | _______|____ |
DT JJ JJ NN VBZ IN DT JJ NN .
| | | | | | | | | |
The quick brown fox jumps over the lazy dog .
>>> (parse_fox, ), (parse_wolf, ) = parser.raw_parse_sents(
... [
... ''The quick brown fox jumps over the lazy dog.'',
... ''The quick grey wolf jumps over the lazy fox.'',
... ]
... )
>>> parse_fox.pretty_print() # doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______________|__________________________
| VP |
| _________|___ |
| | PP |
| | ________|___ |
NP | | NP |
____|__________ | | _______|____ |
DT JJ JJ NN VBZ IN DT JJ NN .
| | | | | | | | | |
The quick brown fox jumps over the lazy dog .
>>> parse_wolf.pretty_print() # doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______________|__________________________
| VP |
| _________|___ |
| | PP |
| | ________|___ |
NP | | NP |
____|_________ | | _______|____ |
DT JJ JJ NN VBZ IN DT JJ NN .
| | | | | | | | | |
The quick grey wolf jumps over the lazy fox .
>>> (parse_dog, ), (parse_friends, ) = parser.parse_sents(
... [
... "I ''m a dog".split(),
... "This is my friends '' cat ( the tabby )".split(),
... ]
... )
>>> parse_dog.pretty_print() # doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______|____
| VP
| ________|___
NP | NP
| | ___|___
PRP VBP DT NN
| | | |
I ''m a dog
Por favor, eche un vistazo a http://www.nltk.org/_modules/nltk/parse/corenlp.html para obtener más información sobre la API de Stanford. Eche un vistazo a los documentos!
¿Es posible usar Stanford Parser en NLTK? (No estoy hablando de Stanford POS).
EDITADO
A partir de la versión 3.1 de NLTK, las instrucciones de esta respuesta ya no funcionarán. Siga las instrucciones en https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software
Esta respuesta se mantiene para fines heredados en . La respuesta sí funciona para NLTK v3.0.
Respuesta original
Aquí hay una adaptación del código de danger98 que funciona con nltk3.0.0 en windoze, y presumiblemente también en otras plataformas, ajusta los nombres de directorio según corresponda para tu configuración:
import os
from nltk.parse import stanford
os.environ[''STANFORD_PARSER''] = ''d:/stanford-parser''
os.environ[''STANFORD_MODELS''] = ''d:/stanford-parser''
os.environ[''JAVAHOME''] = ''c:/Program Files/java/jre7/bin''
parser = stanford.StanfordParser(model_path="d:/stanford-grammars/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))
print sentences
Tenga en cuenta que el comando de análisis ha cambiado (consulte el código fuente en www.nltk.org/_modules/nltk/parse/stanford.html) y que debe definir la variable JAVAHOME. Intenté que se lea el archivo de gramática in situ en el contenedor, pero hasta ahora no he podido hacerlo.
EDITADO
A partir de la versión 3.1 de NLTK, las instrucciones de esta respuesta ya no funcionarán. Siga las instrucciones en https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software
Esta respuesta se mantiene para fines heredados en . La respuesta sí funciona para NLTK v3.0.
Respuesta original
Una pequeña actualización (o simplemente alternativa) sobre la respuesta integral de danger89 sobre el uso de Stanford Parser en NLTK y Python
Con stanford-parser-full-2015-04-20, JRE 1.8 y nltk 3.0.4 (python 2.7.6), parece que ya no es necesario extraer el inglésPCFG.ser.gz de stanford-parser-xxx-models .jar o configurar cualquier os.environ
from nltk.parse.stanford import StanfordParser
english_parser = StanfordParser(''path/stanford-parser.jar'', ''path/stanford-parser-3.5.2-models.jar'')
s = "The real voyage of discovery consists not in seeking new landscapes, but in having new eyes."
sentences = english_parser.raw_parse_sents((s,))
print sentences #only print <listiterator object> for this version
#draw the tree
for line in sentences:
for sentence in line:
sentence.draw()
EDITADO
A partir de la versión 3.1 de NLTK, las instrucciones de esta respuesta ya no funcionarán. Siga las instrucciones en https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software
Esta respuesta se mantiene para fines heredados en . La respuesta sí funciona para NLTK v3.0.
Respuesta original
Claro, prueba lo siguiente en Python:
import os
from nltk.parse import stanford
os.environ[''STANFORD_PARSER''] = ''/path/to/standford/jars''
os.environ[''STANFORD_MODELS''] = ''/path/to/standford/jars''
parser = stanford.StanfordParser(model_path="/location/of/the/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))
print sentences
# GUI
for line in sentences:
for sentence in line:
sentence.draw()
Salida:
[Árbol (''ROOT'', [Árbol (''S'', [Árbol (''INTJ'', [Árbol (''UH'', [''Hello''])]), Árbol ('','', ['','']), Árbol (''NP'', [Árbol (''PRP $'', [''Mi'']), Árbol (''NN'', [''nombre''])]), Árbol (''VP'', [Árbol (''VBZ'', [ ''es'']), Árbol (''ADJP'', [Árbol (''JJ'', [''Melroy''])])]), Árbol (''.'', [''.''])])]), Árbol ('' ROOT '', [Árbol ('' SBARQ '', [Árbol ('' WHNP '', [Árbol ('' WP '', ['' Qué ''])]), Árbol ('' SQ '', [Árbol ('' VBZ '', ['' es '' ]), Árbol (''NP'', [Árbol (''PRP $'', [''tu'']), Árbol (''NN'', [''nombre''])])]), Árbol (''.'', [''? ''])])])]
Nota 1: en este ejemplo, tanto el analizador como los archivos jar están en la misma carpeta.
Nota 2:
- El nombre de archivo de stanford parser es: stanford-parser.jar
- El nombre de archivo de los modelos de stanford es: stanford-parser-xxx-models.jar
Nota 3: El archivo inglésPCFG.ser.gz se puede encontrar dentro del archivo models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Utilice come archive manager para ''descomprimir'' el archivo models.jar.
Nota 4: Asegúrese de estar utilizando Java JRE (Runtime Environment) 1.8 también conocido como Oracle JDK 8. De lo contrario, obtendrá: Major.minor versión 52.0 no admitida.
Instalación
Descargue NLTK v3 desde: https://github.com/nltk/nltk . E instala NLTK:
instalación de sudo python setup.py
Puede usar el descargador NLTK para obtener Stanford Parser, usando Python:
import nltk nltk.download()
Prueba mi ejemplo! (no olvide cambiar las rutas de jar y cambiar la ruta del modelo a la ubicación de ser.gz)
O:
Descargue e instale NLTK v3, igual que arriba.
Descargue la última versión de ( la versión actual del nombre del archivo es stanford-parser-full-2015-01-29.zip): http://nlp.stanford.edu/software/lex-parser.shtml#Download
Extraiga el standford-parser-full-20xx-xx-xx.zip.
Crea una nueva carpeta (''jarras'' en mi ejemplo). Coloque los archivos extraídos en esta carpeta jar: stanford-parser-3.xx-models.jar y stanford-parser.jar.
Como se muestra arriba, puede usar las variables de entorno (STANFORD_PARSER & STANFORD_MODELS) para apuntar a esta carpeta ''jars''. Estoy usando Linux, así que si usas Windows, usa algo como: C: // folder // jars.
Abra stanford-parser-3.xx-models.jar usando un administrador de archivos (7zip).
Navegue dentro del archivo jar; edu / stanford / nlp / models / lexparser. Nuevamente, extraiga el archivo llamado ''englishPCFG.ser.gz''. Recuerde la ubicación donde extrae este archivo ser.gz.
Al crear una instancia de StanfordParser, puede proporcionar la ruta del modelo como parámetro. Esta es la ruta completa al modelo, en nuestro caso /location/of/englishPCFG.ser.gz.
Prueba mi ejemplo! (no olvide cambiar las rutas de jar y cambiar la ruta del modelo a la ubicación de ser.gz)
EDITADO
A partir del 15 de octubre de 2015, la biblioteca de PyPi se ha actualizado con NLTK v3.1, que tiene una versión estabilizada de la API de herramientas de Stanford NLP. ( https://pypi.python.org/pypi/nltk )
Además, NLTK v3.1 se puede instalar usando el administrador de paquetes Ubuntu apt-get
con https://launchpad.net/ubuntu/+source/nltk (consulte https://github.com/nltk/nltk/issues/747 )
Respuesta original
El paquete PyPi (que se descarga usando pip y easy_install) está horriblemente desactualizado (desde 2012). Para acceder al SP, debe descargar la última compilación ( https://github.com/nltk/nltk ) e instalarlo. Eso le permitirá usar la solución dada por @ Danger89
EDITADO
Nota: la siguiente respuesta solo funcionará en:
- Versión NLTK> = 3.2.4
- Stanford Tools compilado desde 2015-04-20
- Python 2.7, 3.4 y 3.5 (Python 3.6 aún no es compatible oficialmente)
Como ambas herramientas cambian bastante rápido y la API puede verse muy diferente 3-6 meses después. Por favor, trate la siguiente respuesta como temporal y no como una solución eterna.
Siempre consulte https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software para obtener la última instrucción sobre cómo interconectar las herramientas de Stanford NLP usando NLTK.
TL; DR
cd $HOME
# Update / Install NLTK
pip install -U nltk
# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip
# Extract the zip file.
unzip stanford-ner-2015-04-20.zip
unzip stanford-parser-full-2015-04-20.zip
unzip stanford-postagger-full-2015-04-20.zip
export STANFORDTOOLSDIR=$HOME
export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers
Entonces:
>>> from nltk.tag.stanford import StanfordPOSTagger
>>> st = StanfordPOSTagger(''english-bidirectional-distsim.tagger'')
>>> st.tag(''What is the airspeed of an unladen swallow ?''.split())
[(u''What'', u''WP''), (u''is'', u''VBZ''), (u''the'', u''DT''), (u''airspeed'', u''NN''), (u''of'', u''IN''), (u''an'', u''DT''), (u''unladen'', u''JJ''), (u''swallow'', u''VB''), (u''?'', u''.'')]
>>> from nltk.tag import StanfordNERTagger
>>> st = StanfordNERTagger(''english.all.3class.distsim.crf.ser.gz'')
>>> st.tag(''Rami Eid is studying at Stony Brook University in NY''.split())
[(u''Rami'', u''PERSON''), (u''Eid'', u''PERSON''), (u''is'', u''O''), (u''studying'', u''O''), (u''at'', u''O''), (u''Stony'', u''ORGANIZATION''), (u''Brook'', u''ORGANIZATION''), (u''University'', u''ORGANIZATION''), (u''in'', u''O''), (u''NY'', u''O'')]
>>> from nltk.parse.stanford import StanfordParser
>>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog"))
[Tree(''ROOT'', [Tree(''NP'', [Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''quick'']), Tree(''JJ'', [''brown'']), Tree(''NN'', [''fox''])]), Tree(''NP'', [Tree(''NP'', [Tree(''NNS'', [''jumps''])]), Tree(''PP'', [Tree(''IN'', [''over'']), Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''lazy'']), Tree(''NN'', [''dog''])])])])])])]
>>> from nltk.parse.stanford import StanfordDependencyParser
>>> dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> print [parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]
[Tree(''jumps'', [Tree(''fox'', [''The'', ''quick'', ''brown'']), Tree(''dog'', [''over'', ''the'', ''lazy''])])]
En Long:
En primer lugar , debe tenerse en cuenta que las herramientas de Stanford NLP están escritas en Java y NLTK está escrita en Python . La forma en que NLTK está interactuando con la herramienta es a través de la llamada de la herramienta Java a través de la interfaz de línea de comando.
En segundo lugar , la API de NLTK
para las herramientas de Stanford NLP ha cambiado bastante desde la versión 3.1. Por lo tanto, es aconsejable actualizar su paquete NLTK a v3.1.
En tercer lugar , la API de NLTK
para las herramientas de Stanford NLP se ajusta a las herramientas de PNL individuales, por ejemplo, Stanford POS tagger , Stanford NER Tagger , Stanford Parser .
Para el etiquetador POS y NER, NO se ajusta al paquete Stanford Core NLP .
Para Stanford Parser, es un caso especial en el que se envuelve tanto el Stanford Parser como el Stanford Core NLP (personalmente, no he usado este último usando NLTK, preferiría seguir la demostración de @dimazest en http://www.eecs.qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )
Tenga en cuenta que a partir de NLTK v3.1, las variables STANFORD_JAR
y STANFORD_PARSER
están en desuso y NO SE UTILIZARON MÁS.
En más tiempo:
PASO 1
Suponiendo que ha instalado Java apropiadamente en su sistema operativo.
Ahora, instale / actualice su versión NLTK (vea http://www.nltk.org/install.html ):
- Usando pip :
sudo pip install -U nltk
- Distro de Debian (usando apt-get):
sudo apt-get install python-nltk
Para Windows (utilice la instalación binaria de 32 bits):
- Instale Python 3.4: http://www.python.org/downloads/ (evite las versiones de 64 bits)
- Instalar Numpy (opcional): http://sourceforge.net/projects/numpy/files/NumPy/ (la versión que especifica pythnon3.4)
- Instalar NLTK: http://pypi.python.org/pypi/nltk
- Instalación de prueba: Inicio> Python34, luego escriba importar nltk
( ¿Por qué no 64 bits? Consulte https://github.com/nltk/nltk/issues/1079 )
Luego, fuera de la paranoia, vuelva a nltk
su versión nltk
dentro de python:
from __future__ import print_function
import nltk
print(nltk.__version__)
O en la línea de comando:
python3 -c "import nltk; print(nltk.__version__)"
Asegúrese de ver 3.1
como salida.
Para aún más paranoia, verifique que todas sus herramientas favoritas de Stanford NLP estén disponibles:
from nltk.parse.stanford import StanfordParser
from nltk.parse.stanford import StanfordDependencyParser
from nltk.parse.stanford import StanfordNeuralDependencyParser
from nltk.tag.stanford import StanfordPOSTagger, StanfordNERTagger
from nltk.tokenize.stanford import StanfordTokenizer
( Nota : Las importaciones anteriores SÓLO se asegurarán de que esté utilizando una versión NLTK correcta que contenga estas API. No ver errores en la importación no significa que haya configurado correctamente la API NLTK para usar las Herramientas de Stanford)
PASO 2
Ahora que ha verificado que tiene la versión correcta de NLTK que contiene la interfaz necesaria de herramientas de Stanford NLP. Debe descargar y extraer todas las herramientas necesarias de Stanford NLP.
TL; DR , en Unix:
cd $HOME
# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip
# Extract the zip file.
unzip stanford-ner-2015-04-20.zip
unzip stanford-parser-full-2015-04-20.zip
unzip stanford-postagger-full-2015-04-20.zip
En Windows / Mac:
- Descargue y descomprima el analizador de http://nlp.stanford.edu/software/lex-parser.shtml#Download
- Descargue y desmarque el etiquetador FULL VERSION de http://nlp.stanford.edu/software/tagger.shtml#Download
- Descargue y desmarque el etiquetador NER de http://nlp.stanford.edu/software/CRF-NER.shtml#Download
PASO 3
Configure las variables de entorno de modo que NLTK pueda encontrar la ruta de archivo relevante automáticamente. Tienes que establecer las siguientes variables:
Agregue el archivo
.jar
NLP de Stanford adecuado a la variable de entornoCLASSPATH
.- por ejemplo, para el NER, será
stanford-ner-2015-04-20/stanford-ner.jar
- por ejemplo, para el POS, será
stanford-postagger-full-2015-04-20/stanford-postagger.jar
- por ejemplo, para el analizador sintáctico, será
stanford-parser-full-2015-04-20/stanford-parser.jar
y el archivo jar modelo de analizador,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
- por ejemplo, para el NER, será
Agregue el directorio de modelo apropiado a la variable
STANFORD_MODELS
(es decir, el directorio donde puede encontrar dónde se guardan los modelos pre-entrenados)- por ejemplo, para el NER, estará en
stanford-ner-2015-04-20/classifiers/
- por ejemplo, para el POS, estará en
stanford-postagger-full-2015-04-20/models/
- por ejemplo, para el Analizador, no habrá un directorio modelo.
- por ejemplo, para el NER, estará en
En el código, verifique que busque el directorio STANFORD_MODELS
antes de agregar el nombre del modelo. Además, vea que la API también intenta buscar automáticamente los entornos del SO para el `CLASSPATH
Tenga en cuenta que a partir de NLTK v3.1, las variables STANFORD_JAR
están en desuso y NO se utilizan MÁS . Los fragmentos de código encontrados en las siguientes preguntas de podrían no funcionar:
- Configuración de analizador de dependencias de Stanford y NLTK
- nltk interfaz para stanford analizador
- problemas para importar stanford pos tagger en nltk
- Stanford Entity Recognizer (sin carcasa) en Python Nltk
- Cómo mejorar la velocidad con Stanford NLP Tagger y NLTK
- ¿Cómo puedo obtener el módulo stanford NLTK python?
- Ventanas de Stanford Parser y NLTK
- La funcionalidad Nominal Recognition (NER) de Stanford fue nombrada con NLTK
- El analizador de Stanford con NLTK produce salida vacía
- Extraiga la lista de personas y organizaciones que utilizan Stanford NER Tagger en NLTK
- Error al utilizar Stanford POS Tagger en NLTK Python
TL; DR para STEP 3 en Ubuntu
export STANFORDTOOLSDIR=/home/path/to/stanford/tools/
export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers
( Para Windows : consulte https://.com/a/17176423/610569 para obtener instrucciones sobre cómo configurar variables de entorno)
DEBES establecer las variables como antes antes de iniciar Python, luego:
>>> from nltk.tag.stanford import StanfordPOSTagger
>>> st = StanfordPOSTagger(''english-bidirectional-distsim.tagger'')
>>> st.tag(''What is the airspeed of an unladen swallow ?''.split())
[(u''What'', u''WP''), (u''is'', u''VBZ''), (u''the'', u''DT''), (u''airspeed'', u''NN''), (u''of'', u''IN''), (u''an'', u''DT''), (u''unladen'', u''JJ''), (u''swallow'', u''VB''), (u''?'', u''.'')]
>>> from nltk.tag import StanfordNERTagger
>>> st = StanfordNERTagger(''english.all.3class.distsim.crf.ser.gz'')
>>> st.tag(''Rami Eid is studying at Stony Brook University in NY''.split())
[(u''Rami'', u''PERSON''), (u''Eid'', u''PERSON''), (u''is'', u''O''), (u''studying'', u''O''), (u''at'', u''O''), (u''Stony'', u''ORGANIZATION''), (u''Brook'', u''ORGANIZATION''), (u''University'', u''ORGANIZATION''), (u''in'', u''O''), (u''NY'', u''O'')]
>>> from nltk.parse.stanford import StanfordParser
>>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog"))
[Tree(''ROOT'', [Tree(''NP'', [Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''quick'']), Tree(''JJ'', [''brown'']), Tree(''NN'', [''fox''])]), Tree(''NP'', [Tree(''NP'', [Tree(''NNS'', [''jumps''])]), Tree(''PP'', [Tree(''IN'', [''over'']), Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''lazy'']), Tree(''NN'', [''dog''])])])])])])]
Alternativamente, podría intentar agregar las variables de entorno dentro de python, como lo sugirieron las respuestas anteriores, pero también puede decirle directamente al analizador / grabador que se inicialice en la ruta directa donde guardó el archivo .jar
y sus modelos.
NO es necesario configurar las variables de entorno si usa el siguiente método, PERO cuando la API cambie los nombres de los parámetros, deberá cambiar en consecuencia. Es por eso que es más aconsejable establecer las variables de entorno que modificar su código python para adaptarlo a la versión NLTK.
Por ejemplo ( sin establecer ninguna variable de entorno ):
# POS tagging:
from nltk.tag import StanfordPOSTagger
stanford_pos_dir = ''/home/alvas/stanford-postagger-full-2015-04-20/''
eng_model_filename= stanford_pos_dir + ''models/english-left3words-distsim.tagger''
my_path_to_jar= stanford_pos_dir + ''stanford-postagger.jar''
st = StanfordPOSTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar)
st.tag(''What is the airspeed of an unladen swallow ?''.split())
# NER Tagging:
from nltk.tag import StanfordNERTagger
stanford_ner_dir = ''/home/alvas/stanford-ner/''
eng_model_filename= stanford_ner_dir + ''classifiers/english.all.3class.distsim.crf.ser.gz''
my_path_to_jar= stanford_ner_dir + ''stanford-ner.jar''
st = StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar)
st.tag(''Rami Eid is studying at Stony Brook University in NY''.split())
# Parsing:
from nltk.parse.stanford import StanfordParser
stanford_parser_dir = ''/home/alvas/stanford-parser/''
eng_model_path = stanford_parser_dir + "edu/stanford/nlp/models/lexparser/englishRNN.ser.gz"
my_path_to_models_jar = stanford_parser_dir + "stanford-parser-3.5.2-models.jar"
my_path_to_jar = stanford_parser_dir + "stanford-parser.jar"
parser=StanfordParser(model_path=eng_model_path, path_to_models_jar=my_path_to_models_jar, path_to_jar=my_path_to_jar)
Editado
A partir del analizador de Stanford actual (2015-04-20), la salida predeterminada para lexparser.sh
ha cambiado, por lo que el siguiente script no funcionará.
Pero esta respuesta se mantiene por herencia, aún funcionará con http://nlp.stanford.edu/software/stanford-parser-2010-08-20.zip .
Respuesta original
Aquí está la versión de Windows de la respuesta de alvas
sentences = (''. ''.join([''this is sentence one without a period'',''this is another foo bar sentence ''])+''.'').encode(''ascii'',errors = ''ignore'')
catpath =r"YOUR CURRENT FILE PATH"
f = open(''stanfordtemp.txt'',''w'')
f.write(sentences)
f.close()
parse_out = os.popen(catpath+r"/nlp_tools/stanford-parser-2010-08-20/lexparser.bat "+catpath+r"/stanfordtemp.txt").readlines()
bracketed_parse = " ".join( [i.strip() for i in parse_out if i.strip() if i.strip()[0] == "("] )
bracketed_parse = "/n(ROOT".join(bracketed_parse.split(" (ROOT")).split(''/n'')
aa = map(lambda x :ParentedTree.fromstring(x),bracketed_parse)
NOTAS:
En
lexparser.bat
necesita cambiar todas las rutas en ruta absoluta para evitar errores de Java como "clase no encontrada"Recomiendo encarecidamente que aplique este método en Windows, ya que intenté varias respuestas en la página y todos los métodos comunican que python con Java falla.
Deseo saber de usted si tiene éxito en Windows y desearía poder decirme cómo supera todos estos problemas.
busque python wrapper para stanford coreNLP para obtener la versión python
Editado
A partir del analizador de Stanford actual (2015-04-20), la salida predeterminada para lexparser.sh
ha cambiado, por lo que el siguiente script no funcionará.
Pero esta respuesta se mantiene por herencia, aún funcionará con http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip .
Respuesta original
Sugiero que no te metas con Jython, JPype. Deje que Python haga cosas de pitón y deje que java haga cosas java, obtenga la salida de Stanford Parser a través de la consola.
Después de haber instalado http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip en su directorio de inicio ~/
, simplemente use esta receta de Python para obtener el análisis de paréntesis plano:
import os
sentence = "this is a foo bar i want to parse."
os.popen("echo ''"+sentence+"'' > ~/stanfordtemp.txt")
parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines()
bracketed_parse = " ".join( [i.strip() for i in parser_out if i.strip()[0] == "("] )
print bracketed_parse
Como nadie mencionó realmente y de alguna manera me ha preocupado mucho, aquí hay una forma alternativa de usar el analizador de Stanford en python:
stanford_parser_jar = ''../lib/stanford-parser-full-2015-04-20/stanford-parser.jar''
stanford_model_jar = ''../lib/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar''
parser = StanfordParser(path_to_jar=stanford_parser_jar,
path_to_models_jar=stanford_model_jar)
de esta manera, ya no tienes que preocuparte por el camino.
Para aquellos que no pueden usarlo correctamente en Ubuntu o ejecutar el código en Eclipse.
Estoy en una máquina con Windows y simplemente puede ejecutar el analizador normalmente como lo hace desde el comando como pero como en un directorio diferente para que no necesite editar el archivo lexparser.bat. Solo ponte en el camino completo.
cmd = r''java -cp /Documents/stanford_nlp/stanford-parser-full-2015-01-30 edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "typedDependencies" /Documents/stanford_nlp/stanford-parser-full-2015-01-30/stanford-parser-3.5.1-models/edu/stanford/nlp/models/lexparser/englishFactored.ser.gz stanfordtemp.txt''
parse_out = os.popen(cmd).readlines()
La parte más difícil para mí fue darme cuenta de cómo ejecutar un programa Java desde una ruta diferente. Debe haber una mejor manera, pero esto funciona.
Estoy usando la versión nltk 3.2.4. Y el siguiente código funcionó para mí.
from nltk.internals import find_jars_within_path
from nltk.tag import StanfordPOSTagger
from nltk import word_tokenize
# Alternatively to setting the CLASSPATH add the jar and model via their
path:
jar = ''/home/ubuntu/stanford-postagger-full-2017-06-09/stanford-postagger.jar''
model = ''/home/ubuntu/stanford-postagger-full-2017-06-09/models/english-left3words-distsim.tagger''
pos_tagger = StanfordPOSTagger(model, jar)
# Add other jars from Stanford directory
stanford_dir = pos_tagger._stanford_jar.rpartition(''/'')[0]
stanford_jars = find_jars_within_path(stanford_dir)
pos_tagger._stanford_jar = '':''.join(stanford_jars)
text = pos_tagger.tag(word_tokenize("Open app and play movie"))
print(text)
Salida:
[(''Open'', ''VB''), (''app'', ''NN''), (''and'', ''CC''), (''play'', ''VB''), (''movie'', ''NN'')]
Hay una interfaz de python para el analizador de stanford
La página del software Stanford Core NLP tiene una lista de envoltorios de Python:
Me tomó muchas horas y finalmente encontré una solución simple para los usuarios de Windows. Básicamente es una versión resumida de una respuesta existente de alvas, pero fácil de seguir (con suerte) para aquellos que son nuevos en stanford NLP y que son usuarios de Windows.
1) Descargue el módulo que desea usar, como NER, POS, etc. En mi caso, quería usar NER, así que descargué el módulo de http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
2) Descomprime el archivo.
3) Establezca las variables de entorno (classpath y stanford_modules) de la carpeta descomprimida.
import os
os.environ[''CLASSPATH''] = "C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar"
os.environ[''STANFORD_MODELS''] = "C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"
4) configure las variables de entorno para JAVA, como en donde tiene instalado JAVA. para mí estaba debajo
os.environ[''JAVAHOME''] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"
5) importa el módulo que quieras
from nltk.tag import StanfordNERTagger
6) llame al modelo preestablecido que está presente en la carpeta del clasificador en la carpeta descomprimida. agregue ".gz" al final para la extensión de archivo. para mí, el modelo que quería usar era english.all.3class.distsim.crf.ser
st = StanfordNERTagger(''english.all.3class.distsim.crf.ser.gz'')
7) Ahora ejecuta el analizador! y hemos terminado!
st.tag(''Rami Eid is studying at Stony Brook University in NY''.split())
No puedo dejar esto como un comentario debido a la reputación, pero dado que gasté (¿desperdiciado?) Algún tiempo resolviendo esto, preferiría compartir mi problema / solución para que este analizador funcione en NLTK.
En la excelente respuesta de alvas , se menciona que:
por ejemplo, para el Analizador, no habrá un directorio modelo.
Esto me llevó erróneamente a:
- No tenga cuidado con el valor que pongo a
STANFORD_MODELS
(y solo me importa miCLASSPATH
) - dejar
../path/tostanford-parser-full-2015-2012-09/models directory
* virtualmente vacío * (o con un archivo jar cuyo nombre no coincide con nltk regex)!
Si el OP, como yo, solo quería usar el analizador sintáctico, puede ser confuso que, al no descargar nada más (sin POStagger, sin NER, ...) y al seguir todas estas instrucciones, sigamos recibiendo un error.
Eventualmente, para cualquier CLASSPATH
dado (siguientes ejemplos y explicaciones en las respuestas de este hilo) aún obtendría el error:
NLTK no pudo encontrar stanford-parser - (/ d +) (. (/ D +)) + - models.jar! Establezca la variable de entorno CLASSPATH. Para obtener más información, en stanford-parser - (/ d +) (. (/ D +)) + - models.jar,
ver: http://nlp.stanford.edu/software/lex-parser.shtml
O:
NLTK no pudo encontrar stanford-parser.jar! Establezca la variable de entorno CLASSPATH. Para obtener más información, en stanford-parser.jar, consulte: http://nlp.stanford.edu/software/lex-parser.shtml
Aunque , lo que es más importante, podría cargar y usar correctamente el analizador si llamara a la función con todos los argumentos y la ruta especificados por completo, como en:
stanford_parser_jar = ''../lib/stanford-parser-full-2015-04-20/stanford-parser.jar''
stanford_model_jar = ''../lib/stanford-parser-full-2015-04-20/stanfor-parser-3.5.2-models.jar''
parser = StanfordParser(path_to_jar=stanford_parser_jar,
path_to_models_jar=stanford_model_jar)
Solución para el analizador solo:
Por lo tanto, el error provino de NLTK
y de cómo está buscando los jars utilizando las variables de entorno STANFORD_MODELS
y CLASSPATH
suministradas. Para resolver esto, el *-models.jar
, con el formato correcto (para que coincida con la expresión regular en el código NLTK, por lo que no -corenlp -.... jar) debe estar ubicado en la carpeta designada por STANFORD_MODELS
.
A saber, primero creé:
mkdir stanford-parser-full-2015-12-09/models
Luego se agregó en .bashrc
:
export STANFORD_MODELS=/path/to/stanford-parser-full-2015-12-09/models
Y finalmente, copiando stanford-parser-3.6.0-models.jar
(o la versión correspondiente), en:
path/to/stanford-parser-full-2015-12-09/models/
Podría hacer que StanfordParser
cargue sin problemas en python con el clásico CLASSPATH
que apunta a stanford-parser.jar
. En realidad, como tal, puede llamar a StanfordParser
sin parámetros, el valor predeterminado simplemente funcionará.
Puede usar la salida de Stanford Parsers para crear un árbol en nltk (nltk.tree.Tree).
Suponiendo que el analizador stanford le proporciona un archivo en el que hay exactamente un árbol de análisis sintáctico para cada oración. Entonces este ejemplo funciona, aunque podría no parecer muy pitónico:
f = open(sys.argv[1]+".output"+".30"+".stp", "r")
parse_trees_text=[]
tree = ""
for line in f:
if line.isspace():
parse_trees_text.append(tree)
tree = ""
elif "(. ...))" in line:
#print "YES"
tree = tree+'')''
parse_trees_text.append(tree)
tree = ""
else:
tree = tree + line
parse_trees=[]
for t in parse_trees_text:
tree = nltk.Tree(t)
tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don''t need that)
s = traverse(tree)
parse_trees.append(tree)
Si recuerdo bien, el analizador de Stanford es una biblioteca de Java, por lo tanto, debe tener un intérprete de Java ejecutándose en su servidor / computadora.
Lo usé una vez como servidor, combinado con un script php. El script usaba la función exec () de php para hacer una llamada de línea de comandos al analizador de esta manera:
<?php
exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" );
?>
No recuerdo todos los detalles de este comando, básicamente abrió el archivo ToParse, lo analizó y escribió el resultado en el archivo de resultados. PHP luego abriría el archivo de resultados para un uso posterior.
El final del comando dirige el detallado del analizador a NULL, para evitar que la información innecesaria de la línea de comando perturbe el script.
No sé mucho sobre Python, pero podría haber una manera de hacer llamadas de línea de comando.
Puede que no sea la ruta exacta que estabas esperando, pero con suerte te dará algo de inspiración. La mejor de las suertes.