¿Redes de coexistencia de palabras clave en JMP?¡Hola comunidad! ¿Alguien ha descubierto cómo crear un gráfico de red de coocurrencia de palabras clave en JMP que se pueda guardar como un script en la tabla de datos con interactividad con otros gráficos? Puedo llamar a R para que haga el gráfico, pero es estático cuando lo vuelvo a JMP. Soy un usuario estándar de JMP y me encantaría encontrar una solución que no incluya las palabras "disponible solo en JMP Pro", ya que una licencia de JMP Pro está muy por encima de mi presupuesto. Gracias de antemano por los consejos que cualquiera puede dar.Automatización y secuencias de comandosRe: ¿Redes de coocurrencia de palabras clave en JMP?Hola Craige, ¡funcionó de maravilla! Gracias. Adjunto mi gráfico a continuación. Como guardé todos los pasos de curación de mi corpus como propiedades de columna (recodificaciones, frases, palabras vacías, excepciones de raíz), se aplican automáticamente cuando se ejecuta el script. Comenzaré a experimentar con algunos de los parámetros para ver cómo afectan el gráfico resultante. Tengo muchas aplicaciones en las que este tipo de gráfico resulta útil, al menos durante la fase de exploración de datos, por lo que usaré este script una y otra vez. ¡Gracias de nuevo por toda su ayuda!
casey
Re: ¿Redes de coocurrencia de palabras clave en JMP?¡Muy lindo!
Stemming might help combine some of the near-duplicatesStemming might help combine some of the near-duplicatesLa derivación podría ayudar a combinar algunos de los casi duplicados
El problema parece ser JMP 15 vs 16; puedes crear tu propia columna de etiqueta:
// load some documents that might separate into some categories
dt1 = Open( "z:/Fully Screened Subset With Abstracts and LatLongs.jmp" ); // 5000 is too many, subset 36...
originalnames = dt1 << getColumnNames();
te = dt1 << Text Explorer(
Text Columns( :AbstractProofed ), // the entire document is in one cell of the row
Add Stop Words(
{"agreement", "almost", "another", "company", "copyright holder", "electronic", "foundation", "gutenberg", "literary archive", "little",
"person or entity", "project", "public domain", "research", "without", "ebooks", "enough", "though", "rather", "better", "common", "possible",
"weight", "present", "series", "necessary", "placed", "therefore", "towards", "footnote", "something","slowly","around","behind","looking","seemed","nothing",
"probably","called","easily","distributing","paragraph"
}
),
Minimum Characters per Word( 6 ),
Stemming( "no stemming" ), //"Stem for Combining"
Language( "English" )
);
//te << savedocumenttermmatrix( Maximum Number of Terms( 300 ), Minimum Term Frequency( 25 ), Weighting( "TF IDF" ) );//BINARY would use ALL rather than !any, below
te << savedocumenttermmatrix( Maximum Number of Terms( 100 ), Minimum Term Frequency( 25 ), Weighting( "BINARY" ) ); // 0 or 1 if it occurs
te << closewindow;
// remove all-connected columns
allnames = dt1 << getColumnNames();
For( iname = N Items( allnames ), iname > N Items( originalnames ), iname -= 1,
// If( !Any( dt1[0, iname] ),
If( All( dt1[0, iname] ),
dt1 << deletecolumns( iname )
)
);
allnames = dt1 << getColumnNames();
cols = (N Items( originalnames ) + 1) :: N Items( allnames );
//
//dt1 << Hierarchical Cluster( Y( allnames[cols] ),
// Label( Transform Column( "Label", Character, Formula( Left( left(LoC Class,4)||:Subject||:Title, 20 ) ) ) ), // build your own identifier here
// Method( "Ward" ), Standardize Data( 1 ), Dendrogram Scale( "Distance Scale" ),
// Number of Clusters( 4 ), Constellation Plot( 1 ), Show Dendrogram( 0 ),
// SendToReport(Dispatch({"Constellation Plot"},"Clust Hier",FrameBox,{Frame Size( 1056, 716 )}))
//);
dt2 = dt1 << Data Table( "Fully Screened Subset With Abstracts and LatLongs" ) << Transpose(
columns( allnames[cols] ),
Label( :Title),
Label column name( "Title" ),
Output Table( "Transpose of Fully Screened Subset With Abstracts and LatLongs" )
);
dt2<<NEWCOLUMN></NEWCOLUMN>
Como agregué una columna de etiqueta, tuve que tenerla en cuenta en la lista de columnas.
No existe una diferencia real entre esta visualización y la visualización normal del dendograma de conglomerados; El nodo circular en este diagrama es la raíz del dendograma y todo lo demás está desplegado en forma de abanico en un patrón circular. Este es más fácil de leer. Es posible que tengas que decirle a tu audiencia que utilice la longitud del camino de conexión entre las palabras (no sólo la proximidad) como medida de conexión.
También querrás jugar con la parte del explorador de texto; Las palabras vacías que utilicé fueron específicas del documento estándar del Proyecto Gutenberg en cada libro, y la longitud de palabra de 6, y la elección de la raíz podrían no ser óptimas para sus documentos.
Editar: y combinar algunas palabras tal vez: norte, sur, oeste, este podrían significar lo mismo para su propósito.
Re: ¿Redes de coocurrencia de palabras clave en JMP?Hola Craige,
¡Eso es todo! Modifiqué el script que enviaste para mi tabla de datos (ver el script y el archivo de tabla adjuntos). Todo funcionó muy bien, pero no pude hacer funcionar la función de etiqueta. Lo miré 3 veces y te juro que estoy copiando tu código exactamente. ¿Ves algo que pueda impedir que funcione? La imagen de la trama que obtengo está a continuación. Como puede ver, las etiquetas de términos se muestran solo como puntos. Gracias de nuevo. ¡Realmente lo aprecio!

Re: ¿Redes de coocurrencia de palabras clave en JMP?Esto tampoco lo es, pero tal vez esté más cerca. Los coloreé seleccionando un nodo raíz en la rama y luego coloreando las filas seleccionadas en la tabla de datos. Fue necesario seleccionar un poco las palabras vacías para crear una imagen bonita.
TransposedTransposedTranspuesto
// load some documents that might separate into some categories
dt1 = Open( "f:/gutenberg/books5000.jmp" ); // 5000 is too many, subset 36...
dt1 << selectwhere(
Starts With( Loc Class, "D501" ) | Starts With( Loc Class, "TX:" ) | Starts With( Loc Class, "Q" ) | Starts With( Loc Class, "P" )
);
dt2 = dt1 << subset( selected rows( 1 ) );
Close( dt1, nosave );
originalnames = dt2 << getColumnNames();
te = dt2 << Text Explorer(
Text Columns( :text ), // the entire document is in one cell of the row
Add Stop Words(
{"agreement", "almost", "another", "company", "copyright holder", "electronic", "foundation", "gutenberg", "literary archive", "little",
"person or entity", "project", "public domain", "research", "without", "ebooks", "enough", "though", "rather", "better", "common", "possible",
"weight", "present", "series", "necessary", "placed", "therefore", "towards", "footnote", "something","slowly","around","behind","looking","seemed","nothing",
"probably","called","easily","distributing","paragraph"
}
),
Minimum Characters per Word( 6 ),
Stemming( "no stemming" ), //"Stem for Combining"
Language( "English" )
);
//te << savedocumenttermmatrix( Maximum Number of Terms( 300 ), Minimum Term Frequency( 25 ), Weighting( "TF IDF" ) );//BINARY would use ALL rather than !any, below
te << savedocumenttermmatrix( Maximum Number of Terms( 100 ), Minimum Term Frequency( 25 ), Weighting( "BINARY" ) ); // 0 or 1 if it occurs
te << closewindow;
// remove all-connected columns
allnames = dt2 << getColumnNames();
For( iname = N Items( allnames ), iname > N Items( originalnames ), iname -= 1,
// If( !Any( dt2[0, iname] ),
If( All( dt2[0, iname] ),
dt2 << deletecolumns( iname )
)
);
allnames = dt2 << getColumnNames();
cols = (N Items( originalnames ) + 1) :: N Items( allnames );
//
//dt2 << Hierarchical Cluster( Y( allnames[cols] ),
// Label( Transform Column( "Label", Character, Formula( Left( left(LoC Class,4)||:Subject||:Title, 20 ) ) ) ), // build your own identifier here
// Method( "Ward" ), Standardize Data( 1 ), Dendrogram Scale( "Distance Scale" ),
// Number of Clusters( 4 ), Constellation Plot( 1 ), Show Dendrogram( 0 ),
// SendToReport(Dispatch({"Constellation Plot"},"Clust Hier",FrameBox,{Frame Size( 1056, 716 )}))
//);
dt3 = dt2 << Data Table( "Subset of books5000" ) << Transpose(
columns( allnames[cols] ),
Label( :Title ),
Label column name( "Title" ),
Output Table( "Transpose of Subset of books5000" )
);
dt3 << Hierarchical Cluster(
Y( (dt3 << getColumnNames)[2 :: N Cols( dt3 )] ),
Label( Transform Column( "Transform[Title]", Nominal, Formula( Left( :Title, Length( :Title ) - 7 ) ) ) ),
Method( "Ward" ),
Standardize Data( 1 ),
Show Dendrogram( 0 ),
Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 13 ),
Constellation Plot( 1 ),
SendToReport( Dispatch( {"Constellation Plot"}, "Clust Hier", FrameBox, {Frame Size( 948, 827 )} ) )
);Re: ¿Redes de coocurrencia de palabras clave en JMP?He sido leal a JMP desde 1994, por lo que soy consciente de sus muchas fortalezas y de cómo se pueden resolver diferentes problemas a través de diferentes caminos (esa es solo una de las cosas que me encantan). Siempre empiezo con JMP. Mi comunidad profesional está dominada por usuarios de R. Pueden hacer todo tipo de análisis, pero la capacidad de R para crear visualizaciones de datos interactivas (lo mío) ni siquiera está en la misma liga que JMP. Así que me quedo con JMP. Sin embargo, a medida que evolucionan los métodos estadísticos, una fracción mayor de los análisis más nuevos solo son posibles a través de R o JMP Pro, pero sin utilizar una licencia JMP estándar (por ejemplo, varias plataformas de análisis de texto, procedimientos básicos de selección de modelos que son una práctica estándar en mi campo). ). Esto me dificulta realizar análisis holísticos, de principio a fin, en JMP. A medida que JMP Pro y JMP estándar se alejan cada vez más, me encuentro consultando a la comunidad sobre posibles soluciones a mis problemas que puedo lograr con una licencia JMP estándar.La publicación de Craige fue un gran ejemplo de cómo la comunidad me ayudó a encontrar una manera de agrupar documentos usando un DTM en JMP estándar. Mi publicación más reciente preguntó si existe una solución similar que pueda ser posible para agrupar términos usando un DTM en JMP estándar.
En este caso específico, estoy intentando incorporar un gráfico de red de co-ocurrencia de palabras clave en una visualización interactiva existente que he creado en JMP estándar.No creo que esté intentando reinventar la rueda. Creo que me estoy topando con un muro de funcionalidad en la licencia JMP estándar (tal vez) o con una falta de conocimiento/creatividad de mi parte sobre cómo lograr esto (más probablemente).No puedo permitirme el lujo de JMP Pro. Esta es mi realidad y no veo que cambie pronto. Tanto la plataforma de análisis de clases latentes como la de análisis semántico latente que mencionó solo están disponibles en JMP Pro. Cuando hago preguntas sobre las capacidades de la licencia JMP estándar y recibo respuestas que me dicen que sólo puedo hacer algo en JMP Pro, realmente no me ayuda. Me alegra que mis preguntas ayuden a resolver problemas para los usuarios de JMP Pro, pero todavía me queda el enigma original de intentar hacer algo en JMP estándar que requiera más creatividad y conocimiento (dos cualidades sorprendentes de la comunidad de usuarios de JMP) que Poseo por mi cuenta.
Estoy agradecido por JMP, por el personal de soporte técnico de JMP (que es increíble) y por esta comunidad de usuarios. Hasta que mi presupuesto sea mucho mayor que nunca, probablemente seguiré haciendo preguntas aquí sobre formas creativas de hacer las cosas usando una licencia JMP estándar (que a veces puede ser exagerada). Estoy de acuerdo con Mark en que primero es necesario aprender JMP (lo que he disfrutado haciendo durante más de 25 años). Aún así, a veces me cuesta entender cómo satisfacer mis crecientes necesidades de análisis y visualización con una licencia JMP estándar. Todavía espero que haya una manera legítima de usar un JMP estándar para crear un diagrama de red de co-ocurrencia de palabras clave para agrupar términos que tenga total interactividad y pueda guardarse como un script de tabla JMP. No se como hacer esto. Dado mi proceso normal de leer la documentación de JMP, buscar publicaciones de la comunidad de JMP y simplemente experimentar por mi cuenta, no he podido descubrir cómo hacer esto. Si simplemente no se puede hacer sin una licencia JMP Pro, lo dejaré a la deriva y dejaré este tipo de gráfico fuera de mi visualización.
Perdón por la larga respuesta. Si alguien de JMP quiere opinar sobre algunas estrategias sobre cómo arreglárselas con JMP estándar cuando no puede pagar JMP Pro, me encantaría recibir algunos consejos (parece un buen tema de blog). Quizás no sea un tema para este foro de discusión. Pido disculpas si no lo es. No dude en ponerse en contacto conmigo sin conexión en caseylott@ymail.com si alguien tiene sugerencias para esto.
Re: ¿Redes de coocurrencia de palabras clave en JMP?Sólo añadiendo a @Craige_Hales 'ayuda de que puede utilizar el Análisis de clases latentes para agrupar filas (documentos) y el Análisis semántico latente para agrupar columnas (términos). Estas plataformas están disponibles en Analizar > Métodos multivariados. (También están integrados y especializados para Text Explorer en JMP Pro). Consulte la documentación de JMP...
La idea es que JMP tenga muchas plataformas potentes que funcionen juntas. Mi analogía es una calculadora gráfica. Hay muchos botones y, a menudo, se necesita más de uno para realizar el trabajo. Es decir que no existe un botón que 'lo haga todo', pero se puede llegar allí. Debe aprender JMP como primer enfoque en lugar de intentar recrear una aplicación personalizada. ¿Por qué reinventar la rueda?
Re: ¿Redes de coocurrencia de palabras clave en JMP?Hola Craige,
Me acabo de dar cuenta de que el script que envió usa valores en un DTM para crear grupos de documentos basados en usos similares de términos entre documentos. En este caso, cada nodo representa un documento y cada enlace se basa en un valor de distancia del análisis de conglomerados. Estoy intentando hacer algo ligeramente diferente.
Me gustaría crear un gráfico de constelación como este donde cada nodo represente un TÉRMINO en el DTM y cada enlace se base en algún tipo de estadística que describa la coexistencia de palabras clave. Esto está muy fuera de mi experiencia. Me encanta la idea de un diagrama de este tipo, pero no estoy seguro de si sería apropiado reformatear el DTM de alguna manera para que se pueda realizar un análisis de conglomerados donde los términos terminan como nodos (o cómo haría esto). Esto lograría mi objetivo de tener un gráfico en JMP basado en la relación de términos que pueda usar como filtro global en una visualización de datos interactiva. Sin embargo, ¿este tipo de conclusión crearía un gráfico que no se basa en las mejores prácticas de análisis de texto? Para aquellos de ustedes que entienden este campo, ¿sería inapropiado este uso del análisis de conglomerados para ilustrar la coexistencia de palabras clave? Si es así, ¿alguien ha creado algo que pueda realizar análisis de coocurrencia de palabras clave (utilizando métodos estadísticos adecuados para este tipo de análisis) en JMP?Me interesa escuchar comentarios de la comunidad sobre esto. Pido disculpas porque mi publicación original no fue más clara. Craige, definitivamente usaré el script que enviaste en tu primera respuesta cuando necesite agrupar documentos. Gracias.
Re: ¿Redes de coocurrencia de palabras clave en JMP?Usar una fila a la vez puede no ser la respuesta correcta; No es necesario que sean palabras comunes con vecinos en el diagrama. A menos que dos vecinos espaciales compartan algunas palabras.
Re: ¿Redes de coocurrencia de palabras clave en JMP?No estoy seguro; Creo que para cada fila querrás las 3 o 4 palabras más importantes (nombres de columna) para esa fila, y podrían ser las que tengan mayor valor. ¿Se ve bien cuando miras algunas filas? Si es así, no sería un gran paso de preprocesamiento crear esa columna de etiqueta.
Re: ¿Redes de coocurrencia de palabras clave en JMP?Hola Craige,
¡Esto es brillante! No soy un genio de JSL, pero lo hice funcionar con mis datos. Lo único que no sé cómo hacer es crear un identificador de etiqueta que use los nombres de las columnas para los términos en la matriz de términos del documento. La matriz de términos de mi documento tiene 252 columnas. Cada nombre de columna tiene un formato automático con los términos valor derivado y el sufijo TF IDF2. Por ejemplo, una columna se denomina "distribuir· TF IDF 2" y otra se denomina "montaña· TF IDF 2". Me gustaría que las etiquetas de los puntos de las constelaciones sean el término derivado, sin el sufijo (por ejemplo, distribut· o montaña·). ¿Existe una manera sencilla de utilizar los valores de los nombres de las columnas de la matriz de términos del documento como etiquetas de puntos?
Muchas gracias por proporcionar este guión.
casey
Re: ¿Redes de coocurrencia de palabras clave en JMP?Puedes conseguir algo relacionado, tal vez, como esto. Y está conectado a la mesa. Y no profesional.
Constellation Plot from ClusteringConstellation Plot from ClusteringGráfico de constelación a partir de agrupación
// load some documents that might separate into some categories
dt1 = Open( "f:/gutenberg/books5000.jmp" ); // 5000 is too many, subset 36...
dt1 << selectwhere( Starts With( Loc Class, "D501" ) | Starts With( Loc Class, "TX:" ) | Starts With( Loc Class, "Q" ) | Starts With( Loc Class, "P" ) );
dt2 = dt1 << subset( selected rows( 1 ) );
Close( dt1, nosave );
originalnames = dt2 << getColumnNames();
te = dt2 << Text Explorer(
Text Columns( :text ), // the entire document is in one cell of the row
Add Stop Words(
{"agreement", "almost", "another", "company", "copyright holder", "electronic", "foundation", "gutenberg", "literary archive", "little",
"person or entity", "project", "public domain", "research", "without"}
),
Minimum Characters per Word( 6 ),
Stemming( "Stem for Combining" ),
Language( "English" )
);
te << savedocumenttermmatrix( Maximum Number of Terms( 300 ), Minimum Term Frequency( 25 ), Weighting( "TF IDF" ) );//BINARY would use ALL rather than !any, below
te << closewindow;
// remove all-connected columns
allnames = dt2 << getColumnNames();
For( iname = N Items( allnames ), iname > N Items( originalnames ), iname -= 1,
If( !Any( dt2[0, iname] ),
dt2 << deletecolumns( iname )
)
);
allnames = dt2 << getColumnNames();
cols = (N Items( originalnames ) + 1) :: N Items( allnames );
dt2 << Hierarchical Cluster( Y( allnames[cols] ),
Label( Transform Column( "Label", Character, Formula( Left( left(LoC Class,4)||:Subject||:Title, 20 ) ) ) ), // build your own identifier here
Method( "Ward" ), Standardize Data( 1 ), Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 4 ), Constellation Plot( 1 ), Show Dendrogram( 0 ),
SendToReport(Dispatch({"Constellation Plot"},"Clust Hier",FrameBox,{Frame Size( 1056, 716 )}))
);