Logloglog

[09/08] Hilo más fino, transformo el log online y veo qué sale



===========================================================================



[06/8]
Perdí un mes y medio. Increíble.
Voy a generar todo de nuevo, pero incluyendo la versión nueva de bioscope (donde cambian los id, nada menos).

Primero genero los tres corpus [devel, train,test], para la nueva versión del corpus

- Genero en el pendrive, en \bioscope_devel el nuevo abstracts_devl.xml, igual al anterior pero con los pmid
- Genero archivos .txt OK
- Genero archivos .bioscope OK
- Genero archivo temporal para genia OK
- Proceso con genia OK


===========================================================================


para leer xml: c:\python\...\corpus\reader\xmldocs.py

http://nltk.googlecode.com/svn/trunk/doc/howto/corpus.html#writing-new-corpus-readers
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.corpus.reader.xmldocs.XMLCorpusReader-class.html 
http://docs.python.org/library/xml.etree.elementtree.html

[nltk]
(Creé una carpeta bioscope bajo corpora, y metí ahí abstracts.xml y full_papers.xml

bioscope_dir=nltk.data.find('corpora/bioscope')
my_bioscope=nltk.corpus.XMLCorpusReader(bioscope_dir,'.\*\.xml')
print my_bioscope.xml('abstracts.xml')
print my_bioscope.words('abstracts.xml')
dir(my_bioscope) para saber los métodos
print my_bioscope.__doc__ para ver los comentarios

Hay declarado un words() en la documentación... pero no existe!
Tenía una versión antediluviana, actualicé y anda perfecto.

Ahora tengo que ver cómo leer xml.

import xml.etree

xmldocs=my_bioscope.xml('abstracts.xml')
xml.etree.ElementTree.dump(xmldocs)


xmldocs.getchildren()[0].getchildren()
xmldocs.getchildren()[0].getchildren()[0].getchildren()

18/2
[Notebook] [ambiente]
- Hice un script lexparser y lo agregué al PATH. Puse al stanford-parser en el classpath. Todo esto en el .bash_profile
- Cree una variable $ambiente apuntando al pendrive
- Moví todo a $ambiente/fing/work/bioscope
- Interesante: ver el tema de la tokenizacion del GENIA, puede dársele un texto ya tokenizado. Usa el tokenizer de upenn
- Agregué el geniatagger al path. Tuve que recompilar y cambiar los directorios a mano (una bestia) porque el tipo asume que el archivo a taggear
está en el mismo directorio que el tagger, y no levanta los diccionarios. Por las dudas, los archivos originales están respaldados en los .original

Por lo tanto, ahora haciendo lexparser archivo.txt o geniatagger archivo.txt hace lo que tiene que hacer

- Instalé nltk, versión nueva en el notebook
- Para bajar el corpus (de nuevo) use nltk.download. Quedo en ~guillermo/nltk_data, tal vez copie esa carpeta al pendrive
- En esa carpeta me cree una carpeta bioscope y copié los xml, como había hecho en windows

Reproduje sin problemas lo que hice en windows, aunque en el nb anda bastante más lento.


[22/2]
- Cree un test.parsed.txt salida de una ejecución del stanford parser sobre una oración del corpus. Mi idea es levantar eso con nltk y cargarlo en u
árbol de parsing.

http://nltk.googlecode.com/svn/trunk/doc/api/nltk.parse-module.html
http://nltk.googlecode.com/svn/trunk/doc/api/nltk-module.html


Opa!
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.corpus.reader.bracket_parse-module.html
tree = nltk.bracket_parse('(NP (Adj old) (NP (N men) (Conj and) (N women)))')
http://docs.huihoo.com/nltk/0.9.5/en/ch07.html

Entonces, voy a tener un plan_bioscope, que va a ser un corpus de las oraciones del bioscope, planas. La idea es irlas leyendo de a una y 
parseándolas, para luego leerlas con un bracket_parse reader, o algo así.

(ROOT (S (NP (DT These) (NNS results))(VP (VBP indicate) (SBAR (IN that) (S (PP (IN in) (NP (JJ monocytic) (NN cell) (NN lineage)))(, ,)(NP (NN HIV-1))(VP (MD could)(VP (VB mimic)(NP (DT some) (NN differentiation\/activation) (NNS stimuli))(S(VP (VBG allowing)(NP (JJ nuclear) (NN NF-KB) (NN expression)))))))))(. .)))

tree=nltk.tree.bracket_parse('(ROOT (S (NP (DT These) (NNS results))(VP (VBP indicate) (SBAR (IN that) (S (PP (IN in) (NP (JJ monocytic) (NN cell) (NN lineage)))(, ,)(NP (NN HIV-1))(VP (MD could)(VP (VB mimic)(NP (DT some) (NN differentiation\/activation) (NNS stimuli))(S(VP (VBG allowing)(NP (JJ nuclear) (NN NF-KB) (NN expression)))))))))(. .)))')
tree.draw()

-- Para levantar el corpus de mi directorio, modfico el data path de nlkt
nltk.data.path.append('/Volumes/AMBIENTE/fing/work')
plain_bioscope_dir=nltk.data.find('bioscope/bioscope')
plain_bioscope=nltk.corpus.BracketParseCorpusReader(plain_bioscope_dir,'.\*\.parsed')

[23/2]

-- Para levantar el corpus de mi directorio, modfico el data path de nlkt
nltk.data.path.append('/Volumes/AMBIENTE/fing/work')
plain_bioscope_dir=nltk.data.find('bioscope/bioscope')
plain_bioscope=nltk.corpus.BracketParseCorpusReader(plain_bioscope_dir,'.\*\.parsed')

--Leer esto
http://nltk.googlecode.com/svn/trunk/doc/howto/corpus.html


[24/2]

nltk.data.path.append('/Volumes/AMBIENTE/fing/work')
plain_bioscope_dir=nltk.data.find('bioscope/bioscope')
plain_bioscope=nltk.corpus.BracketParseCorpusReader(plain_bioscope_dir,'.\*\.parsed')
pb=plain_bioscope


# Bien, pruebo mostrar la lista de palabras y anda
words=pb.words('s1.7.parsed')
# Oraciones
sents=pb.sents('s1.7.parsed')
# Árboles de parsing (esto trae una lista)
t=pb.parsed_sents('s1.7.parsed')
t[0].draw()

>>> tr=t[0]
>>> tr
Tree('ROOT', [Tree('S', [Tree('NP', [Tree('DT', ['These']), Tree('NNS', ['results'])]), Tree('VP', [Tree('VBP', ['indicate']), Tree('SBAR', [Tree('IN', ['that']), Tree('S', [Tree('PP', [Tree('IN', ['in']), Tree('NP', [Tree('JJ', ['monocytic']), Tree('NN', ['cell']), Tree('NN', ['lineage'])])]), Tree(',', [',']), Tree('NP', [Tree('NN', ['HIV-1'])]), Tree('VP', [Tree('MD', ['could']), Tree('VP', [Tree('VB', ['mimic']), Tree('NP', [Tree('DT', ['some']), Tree('NN', ['differentiation\\/activation']), Tree('NNS', ['stimuli'])]), Tree('S', [Tree('VP', [Tree('VBG', ['allowing']), Tree('NP', [Tree('JJ', ['nuclear']), Tree('NN', ['NF-KB']), Tree('NN', ['expression'])])])])])])])])]), Tree('.', ['.'])])])

[03/03]
Voy a pasar al pc de casa todo.

Tuve que instalar python 2.6 para instalar pyyaml y creo que nltk también. Voy a actualizar todo a python 2.6

[04/03]
Quedó instalado en mi máquina. 
Ya tengo todas las herramientas, ahora tengo que armar el proceso para el corpus.

- Por cada documento del corpus, genero un txt con las oraciones, una oración por línea (se va a llamar 


[11/03]

- Por cada documento del corpus de abstracts, genero un txt con las oraciones, una oración por línea (se va a llamar absPMID.txt)


Reconozco el documento que me interesa
doc=docset[0].getchildren()[2]
o=doc.getchildren()[2].getchildren()[1]

Bueno, estoy generando a partir del corpus archivos de los documentos, con una oración por línea. El script es el gen_corpus.py. 
El problema que tengo ahora es que cuando escribe no sabe que está escribiendo unicode. Je: lo arreglé usando codecs (qué grande)

[15/03]

Mi idea de cómo tiene que quedar

Proceso doc XML de bioscope
Genero un archivo .bioscope que tiene la oración con las marcas de bioscope (formato IdOracion -> Texto con tags)
Genero un archivo .txt que tiene el texto de cada oración (formato solo Texto [el orden de las oraciones en el archivo es el mismo que en el bioscope])
Genero un archivo .genia que tiene las oraciones analizadas con Genia (formato IdOracion\nPalabra\nPalabra\n...\n\nIdOracion, etc)
Genero un archivo. parsed que tiene el análisis sintáctico con el parser de Stanford (formato IdOracion -> Análisis)


A partir de esos 4 archivos genero un .analyzed que tiene el formado
IdOracion
Texto (Lista python)
SentenceB (XML)
SentenceG (Lista python)
SentenceP (Tree)
\\
...

Sobre este archivo voy a sincronizar.

Mi primera prueba la hago con el abstracts.


Listo .txt y .bioscope

[16/03]
Buen dato. La tokenizacion del Genia Tagger y el Stanford Parser debería ser la misma (la del Penn Treebank).

[18/03]
El genia_preproc.py se encarga de preprocesar los archivos para que el tagger de genia los tome. 
La idea es simplemente pegarlos, con el nombre al principio y al final un "========="
genia_postproc.py los separa

La idea es
python genia_preproc.py > temp.txt
geniatagger temp.txt > temp.genia
python genia_postproc.py

(hay que configurar adentro los parámetros, pero es la idea).


Bueno, quedó pronto el .genia, también. Ahora tengo que correrle el parser al temp.txt, no?


[19/03]
lexparser.bat:
java -mx300m -cp "stanford-parser.jar;" edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "penn" englishPCFG.ser.gz %1

Bien, ya hice un script (el parse_files.py) que genera los parsed a partir de los txt, ejecutando el parser. 

Lo siguiente va a ser crear un python que ejecute el proceso completamente (excepto lo del genia tagger, que corre en cygwin). 
Después de eso, voy a recorrer las oraciones parseadas
y las voy a convertir en dibujitos con el parse. Finalmente, voy a armar el archivo para procesar por python.


[22/03]
Estandaricé los procesos.
Ahora voy a generar los dibujitos con el parse (debería ser una pavada con nltk)

Lo que voy a tratar de hacer es lo siguiente:

- abro el .bioscope y el .parse
- Leo una oración a la vez
- Genero jpg con iddoc+idoracion y la imagen del parse
- Armo un xsl para que muestre la oración bonita, y un link al parse

Antes voy a transformar el .bioscope en un xml válido... Listo.
Ya tengo bastante avanzado el que reconoce el parse tree, el problema es que no sé cómo generar una imagen.  Pero lo importante es que ya sé
recorrer (con la ayuda de nltk) los archivos generados, tanto xml como parsed. Digamos que ya estoy en condiciones de generar cualesquiera atributos
(siempre y cuando esto esté tokenizado).

Lo siguiente que voy a hacer, entonces, es pensar en generar un conjunto de atributos por cada palabra, con la idea de aprender con CRF++ o uno de esos.



[26/04]
Un mes después, retomo.
Los dibujos los voy a generar generando un graphviz y compilando a jpg. Un dibujo por oración.

[03/05]
Ya tengo generados los dibujos. Ahora tengo que determinar bien qué mostrar
Los archivos de imágenes van a ser <id_documento>.<id_oracion>.[dot | jpg]
Listo el pollo!
Ahora voy a generar un html que permita consultar los resultados, incluyendo las imágenes

[04/05]
Modifiqué el genia_postproc para que genere un .genia por oración, en lugar de por documento. Esto para facilitar el armado del documento
que muestra todo.

El documento que muestra todo va a ser un xml que tenga

S1.7 -> These results indicate that _link a genia_ _link a imagen stanford_

indicate that está marcado como cue

Lo que voy a hacer es generar un xml y procesarlo con css.

Para generar, recorro el .bioscope y genero todo (ahí tengo todo)

Bueno, quedó pronto. En realidad no generé un xml, sino que le agregué una transformación xsl y una hoja de estilo al corpus original, para
mostrar las oraciones con marcas, y agregando links al análisis Genia y Stanford de cada oración.


[05/05]
Vamos a terminar con todo, procesando todos los archivos de los abstracts. Cuando esté eso pronto, se lo mando a Dina y Jean-Luc.
Luego trabajo en generalizar al otro corpus, para tener todo prontito.

... gen_corpus.py OK
... genia_preproc.py OK
... genia_postproc.py OK


=======================================================================================================================================

[06/05]
Trato de levantar una versión en test para que dina vea el avance.
Intento corregir el bug que hacía que juntaa oraciones. Uso la opcion -sentences newline para decirle que tengo una oración por linea
Estudio la forma de que use el tagging del genia tagger (no el propio). Parece que habría que preprocesar el .genia


Bueno, subí el ejemplo de test para que Dina vea cómo queda. Voy a dejar esta noche generando todos los archivos de parsing y sus imágenes correspondientes.

[11/05]
Tengo todo generado, creo que hay algunos bugs. Tengo que empezar a analizar las oraciones.
Me voy a concentrar en los hedgings. 


[14/5]
Creo un ambiente para ver estudiar cómo se relaciona la uncertainty con los constituyentes del árbol sintáctico.

Ej: 
1. Tomo una oración y genero un patrón
2. ¿Cuántas veces se da el patrón en el corpus?
3. ¿Cuántas veces falla?
4. Mejoro si es trivial y vuelvo a 1.

Cada patrón es código python. Me pasan un árbol de pársing y devuelvo los subárboles correspondientes anotados además con marcas de hedging.
Por ejemplo: si (VBP indicate) es una rama, y la otra es (SBAR (IN that)), entonces el VP que los cubre es incierto.

1.Proceso una oración de lenguaje. Lo paso por cada patrón. Devuelvo la oración, con atributos H, BI, II, O por cada palabra (una palabra por línea).
2. Comparo con la posta y tomo nota.

[18/5]

- Decidí reorganizar un poco los scripts para seguir adelante.
- También voy a tratar de construir un array de árboles de parsing anotados, que tengan toda la información, para poder trabajar en memoria. De
esta forma, el análisis de los patrones va a ser más rápido y probable
- Nuevamente, voy a trabajar sobre el grupo test, hasta que tenga todo afinado, ahí recién empiezo a probar en serio con los patrones.


[19/5]
Sigo arreglando. Levanté un bug al generar los .genia
Bueno, pasé todo el proceso al main.
Solamente me queda revisar por qué algunos genia no lo tengo. PUta, sigue mal el proceso. trabajo para mañana

Lo siguiente: pensar un ratito cómo seguir.

[20/5]

Levanté el bug que tenían los .genia. Aumenté la memoria al lexparser para que procese todo bien.
OJO QUE TENGO QUE CAMBIAR EL LEXPARSER

Lo siguiente que voy a intentar es que el parser levante el pos-tagging de genia, y ver si queda bien. De esta forma, tenemos todo tokenizado igual
(bueno, excepto el bioscope). 
Si resuelvo eso, entonces lo siguiente es armar algo que levante todo el corpus en memoria, una lista de arbolitos anotados con toda la información.
Sobre eso voy a trabajar fácilmente los patrones


[21/5]
En http://www-tsujii.is.s.u-tokyo.ac.jp/GENIA/home/wiki.cgi?page=Part-of-Speech+Annotation dice que el corpus Genia utiliza los tags del PennTreeBank
En http://nlp.stanford.edu/software/parser-faq.shtml#c dice que el parser de Stanford usa los mismos tags, o sea que venimos bien.
Copie el stanford parser al pendrive, para tenerlo siempre presente


Expresión para simplificar
^([^\t]*)\t[^\t]*\t([^\t]*).*$

Cree el lexparser_txt.bat para procesar los .txt
El lexparser.bat queda para procesar los genia (postprocesados)

Tengo http://www.cis.upenn.edu/~treebank/tokenization.html para ver el tema de la tokenización


La cosa sería tomar el .genia y convertirlo al formato que me interesa, para luego parsearlo (utilizando el .genia en vez del txt). 


Opa. Logré que el parser tome la tokenización de genia. Estuve mirando algunos ejemplos... y parece estar funcionando mejor que antes

Perfecto, está resuelto. Me voy a dormir contento. El siguiente paso  es levantar el árbol de parsing y agregarle la información que proporciona
gennia como atributos. Y luego (un poco más difícil, porque no lo tengo tokenizado) incorporar las marcas de bioscope como atributos.
Después de eso, es cuestión de hacer patrones y ver qué valores dan. 


Tengo que verificar que quedó bien el armado del .genia (ya lo hice).

[24/5]
Tengo líos con los brackets para stanford. El tipo espera:

- Si es [ => -LRB-/-LRB-  => Genia lo hace bien para el tag, pero mal para el lemma, debería ser -LRB-
- Si es { => -LCB-/-LRB-  =>
- Si es ( => -LRB-/-LRB-

Bueno, ahora sí podemos decir que está pronto la coordinación genia/stanford. Ahora el archivo genia generado está corregido para ser aceptado
por el parser, y los árboles de parsing generados son utilizando los tags de genia (excepto cuando el parser tiene que reintentar porque lo 
que le sugiere genia es absurdo, y  por lo  tanto, a partir de ahora el tag que tenemos en el árbol de parsig es el posta, mientras que lo 
que dijo originalmente genia queda obsoleto).

Ahora voy a intentar levantar el árbol de parsing del archivo, y etiquetarlo con los demás atributos generados por genia (chunk, ner, lemma)

working_dir='i:\\fing\\work\\bioscope\\bioscope_test\\'
pc=nltk.corpus.BracketParseCorpusReader(working_dir,'\*\.parsed')
sent=pc.parsed_sents('a91079577.parsed')
a=sent[0][0][0]
b=sent[0][0][1] 
c=sent[0][0][2]

Con esto, lo que voy a hacer es tomar el árbol generado por el parsing y anotarlo con los atributos de la anotación de genia. Posteriormente voy
a agregar las anotaciones de modalidad partiendo de los tags de bioscope.

[27/5]
Hice una funcion get_decorated_tree que recibe un documento, lee el arbol de parsing y le agrega atributos a partir de las palabras que 
pude taggear con genia. Con esto, voy a modificar la salida graphviz para mostrarlos.

[30/5]
Estoy refactoreando.

[31/5]
Bueno, tengo pronto prolijito y dibujados los archivos. Ahora hago test de regresión antes de pasar al paso siguiente. Correcto.

[1/6]
Paso un resumen a Dina, Jean-Luc, con el plan a futuro

Bueno, se me ocurrió algo: no tengo que incorporar lo de bioscope, sino crear un nuevo arbol con la estructura de bioscope. Ojo! tiene
que tener la misma tokenización que tiene genia, para que sean comparables.
Y el aprendizaje tiene que ser por kernels, no por atributos, o sea que mis patrones tienen que ser por similitud entre los arboles de parsing anotados
y los árboles de bioscope.


nltk tiene el TreebankWordTokenizer() que debería tokenizar igual, porque usa el mismo algoritmo!
>>> wt=nltk.tokenize.TreebankWordTokenizer()
>>> words=wt.tokenize('The production of human immunodeficiency virus type 1 (HIV-1) progeny was followed in the U937 promonocytic cell line after stimulation either with retinoic acid or PMA, and in purified human monocytes and macrophages.')
>>> words
['The', 'production', 'of', 'human', 'immunodeficiency', 'virus', 'type', '1', '(', 'HIV-1', ')', 'progeny', 'was', 'followed', 'in', 'the', 'U937', 'promonocytic', 'cell', 'line', 'after', 'stimulation', 'either', 'with', 'retinoic', 'acid', 'or', 'PMA', ',', 'and', 'in', 'purified', 'human', 'monocytes', 'and', 'macrophages', '.']
>>> 


[3/6]
Creo que tengo todo. 
a) Agregar en cada token atributos indicando si es una marca de especulación o negación según bioscope
b) Agregar un atributo indicando si está dentro de un scope de especulación (FIRST, IN, LAST) y el id de comienzo de la marca
c) Agregar un atributo indicando si está dentro de un scope de negación (FIRST, IN, LAST) y el id de comienzo de la marca
d) Buscar patrones que indiquen si es una marca de especulación o negación, y su scope y evaluarlos
e) Poner un atributo que indique si cumple alguno de los patrones que identifique como relevantes para detectar marca o scope
f) Intentar aprender con SVM o CRF, o un metalearner 

La tesis describiría las técnicas de aprendizaje, las características de modalidda y como aplican al aprendizaje de modalidad

El siguiente paso es completar a) b) c)

[7/6]
Agrego los atributos

La idea es agregar los siguientes atributos:

NegCue: {O,B-NEGCUE,I-NEGCUE}
NegCueRef: number
NegXcope:{O,B-NEGXCOPE,I-NEGXCOPE}
NegXcopeRef: number

SpecCue: {O,B-SPECCUE, I-SPECCUE}
SpecCueRef: number
SpecXcope:{O,B-SPECXCOPE,I-SPECXCOPE}
SpecXcopeRef: number 

No pude terminar. La idea es recorrer el árbol e ir poniendo los tags que correspondan según el contexto 

[10/6]
Resolví el tema de los scopes de especulación. Ahora voy a agregar otros atributos para permitir scopes dentro de scopes (máximo 2,
después veo si hay algún caso con 3). Bueno, lo de especulación quedó. Ahora lo incorporo al arbolito y así puedo dibujarlo y ver cómo queda.

Bastante bien la generación, tengo algún caso en el que yo tokenizo diferente que Genia, lo que tengo que hacer es ignorar esos casos y reportarlos
Así puedo seguir para adelante.

[12/6]
Intento hoy terminar de procesar el bioscope_test (marcando los que no andan). Luego trato de armar 10 grupos con el corpus completo, y preprocesar
con lo hecho hasta ahora, detectando problemas. No voy a levantar las imágenes por defecto, porque sino va a pesar mucho. Si las necesito las veo.

Quedó bien identificado qué proceso y qué no.

[13/6]
Pasé las imágenes a un subdirectorio. Tengo que modificar los scripts para que genere bien.
Voy a tomar 400 documentos (el 80%) y voy a armar el corpus de entrenamiento. El de testeo por ahora no voy ni a mirarlo.

[14/6]
Empiezo a armar ambientes de testeo y train.
La primera decisión es no trabajar sobre el pendrive hasta que vea el tema del espacio. Lo que hago es copiarme el directorio work a un c:\guillermo\work
y editar ahí (respaldando solamente los fuentes en el pendrive).
Voy a tener tres directorios: bioscope_devel, bioscope_train, bioscope_test. El primero es lo que hoy tengo como bioscope_test, el segundo tiene el 80% de los documentos
y el tercero el 20% para probar.
Cada paso lo corro primero sobre bioscope_devel, y cuando está pronto lo paso a los otros. Cuando completo un paso, paso al siguiente. Para devel trabajo
sobre el pendrive, solamente paso el fuente para ejecutar al C:\ cuando quiero correr contra el posta (porque es muy grande).


1. Archivos .txt generados sin problemas.
2. Archivos .bioscope generados sin problemas.
3. Archivos .genia generados sin problemas
4. Dejo generando los parse


[14/6]

Todo bien.

- Reviso la salida de los parsers, y borro a mano los que no anduvieron (tengo que asegurarme de borrar también en bioscope, sino se me dessincronizan).

Oraciones eliminadas 
S914.3  - 8632999 - 
<sentence id="S914.3">Recently, a multivalent guanylhydrazone (CNI-1493) developed as an inhibitor of macrophage activation was shown to suppress TNF production and protect against tissue inflammation and endotoxin lethality [Bianchi, M., Ulrich, P., Bloom, O., Meistrell, M., Zimmerman, G.A., Schmidtmayerova, H., Bukrinsky, M., Donnelley, T., Bucala, R., Sherry, B., Manogue, K.R., Tortolani, A.J., Cerami, A.&amp; Tracey, K.J.(1995) Mol.Med.1, 254-266, and Bianchi, M., Bloom, O., Raabe, T., Cohen, P. S., Chesney, J., Sherry, B., Schmidtmayerova, H., Zhang, X., Bukrinsky, M., Ulrich, P., Cerami, A.&amp; Tracey, J.(1996) J.Exp.Med., in press].</sentence>

S 1005.5 - 9120310
<sentence id="S1005.5">We demonstrate that: 1) RANTES promoter activity is up-regulated by PMA plus ionomycin, coexpression of the p65 subunit of nuclear factor (NF)-kappa B, the proinflammatory cytokines TNF-alpha and IL-1 beta, and the CD28 costimulatory pathway; 2) the RANTES promoter region contains four NF-kappa B binding sites at positions -30, -44, -213, and -579 relative to the transcription start site; 3) one site (-213) is an NF-AT (nuclear factor of activated T cells) binding site that also has weak affinity to NF-kappa B, and the most distal site (-579) also serves as a CD28-responsive element; and 4) mutation on any of those NF-kappa B sites or coexpression of I kappa B alpha (cytoplasmic inhibitor of NF-kappa B) markedly reduced the promoter activity.</sentence>

S318.6 - 94151327
<sentence id="S318.6">Subsequent studies have revealed that ( i ) cytoplasmic RelA is stably associated not only with I kappa B alpha but also with other ankyrin motif-rich proteins including the products of the NF-kappa B2 (p100) and NF-kappa B1 (p105) genes; ( ii ) in contrast to RelA-I kappa B alpha, <xcope id="X318.6.2">RelA-p100 cytoplasmic complexes are <cue type="negation" ref="X318.6.2">not</cue> dissociated following tumor necrosis factor alpha activation</xcope>; ( iii ) p100 functions as a potent inhibitor of RelA-mediated transcription in vivo; ( iv ) the interaction of RelA and p100 involves the conserved Rel homology domain of both proteins but <xcope id="X318.6.1"><cue type="negation" ref="X318.6.1">not</cue> the nuclear localization signal of RelA</xcope>, which is required for I kappa B alpha binding; ( v ) p100 inhibition of RelA function requires the C-terminal ankyrin motif domain, which mediates cytoplasmic retention of RelA; and ( vi ) as observed with I kappa B alpha, nuclear RelA stimulates p100 mRNA and protein expression.</sentence>

S1068.4 - 9234742 (test)
<sentence id="S1068.4">We here report that (i) like PML-RAR alpha expression, PLZF-RAR alpha expression blocks terminal differentiation of hematopoietic precursor cell lines (U937 and HL-60) in response to different stimuli (vitamin D3, transforming growth factor beta1, and dimethyl sulfoxide); (ii) PML-RAR alpha, but <xcope id="X1068.4.2"><cue type="negation" ref="X1068.4.2">not</cue> PLZF-RAR alpha</xcope>, increases RA sensitivity of hematopoietic precursor cells and restores RA sensitivity of RA-resistant hematopoietic cells; (iii) PML-RAR alpha and PLZF-RAR alpha have similar RA binding affinities; and (iv) PML-RAR alpha enhances the RA response of RA target genes (those for RAR beta, RAR gamma, and transglutaminase type II [TGase]) in vivo, while PLZF-RAR alpha expression has either <xcope id="X1068.4.1"><cue type="negation" ref="X1068.4.1">no</cue> effect (RAR beta)</xcope> or an inhibitory activity (RAR gamma and type II TGase).</sentence>


Corrí el proceso y dieron algunos errores. Voy a intentar corregir la tokenización de bioscope cuando es diferente a la de los otros dos


Estoy corriendo en directorios locales c:\guillermo\work\bioscope porque son muchos archivitos chicos.

[16/6]
Arreglé algunos temas de tokenización y di por terminado el tema. Ahora tengo que persistir el árbol. 
Lo solucioné con pickle, y algún cambito. Mañana genero en la IM los pickle definitivos, y arranco a trabajar con las estadísticas. Ahora voy a armar
los archivos para subir a dina y jean-luc

[18/6]
Voy a escribir un capítulo con el proceso.
También voy a generar en casa todo el proceso, incluyendo la generación del .pickle para poder levantar todo el árbol a memoria, y generar los .jpg y los .html para consultar.


===============================================================================================================================

[Hasta ahora, procedimiento]
# Ojo si hay que cambiar el lexparser.bat
python main.py

Copiar el archivo original (abstracts.xml) al directorio de trabajo y agregarle para que lea el xslt: 
<?xml-stylesheet type="text/xsl" href="bioscope.xsl"?>


[TODO]
Usar las primitivas de path para que me quede independiente del sistema operativo
Agregar manejo de excepciones
Pasar la parte de los scripts a modulos
El add_extra_info tendría que tener parte en el documento y parte en la oración
Mandar los mensajes a standard error


[IDEAS]
Sería interesante estudiar cómo el parsing mejora el tagging, y como usar el tagger genia mejora la precisión del parser. Posibilidad=tarea para el curso.

[TIPS]
type(pb) <class 'nltk.corpus.reader.bracket_parse.BracketParseCorpusReader'>
pb.__doc__ para mostrar la documentación
dir(t) para mostrar los atributos


[LINKS]

Python Quick reference http://rgruet.free.fr/PQR25/PQR2.5.html
CSS Quick reference http://www.design215.com/toolbox/css_guide.php
API nltk http://nltk.googlecode.com/svn/trunk/doc/api/index.html
Introspection http://www.ibm.com/developerworks/library/l-pyint.html#h5
XML http://docs.python.org/library/xml.etree.elementtree.html
FAQ del Stanford parser http://nlp.stanford.edu/software/parser-faq.shtml#c
GENIA Tagger http://www-tsujii.is.s.u-tokyo.ac.jp/GENIA/tagger/
Tokenizador que usa el GENIA Tagger (precioso) http://www.cis.upenn.edu/~treebank/tokenizer.sed
String Methods de python http://docs.python.org/library/stdtypes.html#string-methods
package os http://docs.python.org/library/os.html?highlight=popen#os-file-dir
Penn Treebank tags http://bulba.sdsu.edu/jeanette/thesis/PennTags.html
La clase Tree http://nltk.googlecode.com/svn/trunk/doc/api/nltk.tree.Tree-class.html


[INSTALACION]
- Instalar python 2.6
- Agregar el directorio de python al path
- Instalar pyyaml
- Instalar nltk
- Instalar ipython
- Bajar los datos (nltk.download()). El directorio debería ser siempre i:\fing\corpus\nltk_data
- Definir la variable de ambiente NLTK_DATA en i:\fing\corpus\nltk_data
- Instalar XMLView #Windows
- Cambiando PYTHONPATH puedo agregar mi directorio de trabajo al path de python

- Verificar:

import nltk,xml.etree
bioscope_dir=nltk.data.find('corpora/bioscope')
my_bioscope=nltk.corpus.XMLCorpusReader(bioscope_dir,'.\*\.xml')
xmldocs=my_bioscope.xml('abstracts.xml')
xmldocs.getchildren()[0].getchildren()[0].getchildren()
# nltk.data.path.append('/Volumes/AMBIENTE/fing/work') # Mac
nltk.data.path.append("e:\\fing\\work") # Windows
plain_bioscope_dir=nltk.data.find('bioscope/bioscope')
pb=nltk.corpus.BracketParseCorpusReader(plain_bioscope_dir,'.\*\.parsed')
t=pb.parsed_sents('s1.7.parsed')
t[0].draw()