Reti di cooccorrenza di parole chiave in JMP?Ciao comunità! Qualcuno ha capito come creare un grafico di rete di cooccurence di parole chiave in JMP che può essere salvato come script nella tabella dati con interattività con altri grafici? Posso chiamare R per creare il grafico, ma è statico quando lo riporto a JMP. Sono un utente JMP standard e mi piacerebbe trovare una soluzione che non implichi la dicitura "disponibile solo in JMP Pro", poiché una licenza JMP Pro è decisamente fuori dal mio budget. Grazie in anticipo per i consigli che chiunque potrà fornirmi.Automazione e scriptingRi: Reti di cooccorrenza di parole chiave in JMP?Ciao Craige, ha funzionato a meraviglia! Grazie. Ho allegato la mia grafica qui sotto. Poiché ho salvato tutti i passaggi di curation del corpus come proprietà di colonna (ricodifiche, frasi, parole stop, eccezioni radice), vengono applicati automaticamente quando viene eseguito lo script. Inizierò a sperimentare alcuni parametri per vedere come influenzano il grafico risultante. Ho molte applicazioni in cui questo tipo di grafica è utile, almeno durante la fase di esplorazione dei dati, quindi utilizzerò questo script più e più volte. Grazie ancora per tutto il vostro aiuto!
Casey
Ri: Reti di cooccorrenza di parole chiave in JMP?Molto bello!
Stemming might help combine some of the near-duplicatesStemming might help combine some of the near-duplicatesLo stemming potrebbe aiutare a combinare alcuni dei quasi duplicati
Il problema sembra essere JMP 15 contro 16; puoi invece creare la tua colonna etichetta:
// 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>
Dato che ho aggiunto una colonna etichetta, ho dovuto registrarla nell'elenco delle colonne.
Non c'è alcuna reale differenza tra questa visualizzazione e la normale visualizzazione del dendogramma del cluster; il nodo cerchiato in questo diagramma è la radice del dendogramma e tutto il resto è semplicemente distribuito in uno schema circolare. Questo È più facile da leggere. Potrebbe essere necessario dire al tuo pubblico di utilizzare la lunghezza del percorso di connessione tra le parole (non solo la prossimità) come misura di connessione.
Ti consigliamo anche di giocare con la parte di esplorazione del testo; le parole di stop che ho usato erano specifiche per la piastra caldaia del documento del Progetto Gutenberg in ogni libro e la lunghezza della parola era 6, e la scelta della radice potrebbe non essere ottimale per i tuoi documenti.
Modifica: e combina forse alcune parole: settentrionale, meridionale, occidentale, orientale potrebbero significare tutte la stessa cosa per il tuo scopo?
Ri: Reti di cooccorrenza di parole chiave in JMP?Ciao Craige,
Questo è tutto! Ho modificato lo script che hai inviato per la mia tabella dati (vedi script e file di tabella allegati). Tutto ha funzionato alla grande, ma non sono riuscito a far funzionare la funzione etichetta. L'ho guardato 3 volte e giuro che sto copiando esattamente il tuo codice. Vedi qualcosa che potrebbe impedirgli di funzionare? L'immagine della trama che ottengo è sotto. Come puoi vedere, le etichette dei termini vengono visualizzate solo come punti. Grazie ancora. Lo apprezzo molto!

Ri: Reti di cooccorrenza di parole chiave in JMP?Anche questo non è proprio così, ma forse più vicino. Li ho colorati selezionando un nodo radice nel ramo e quindi colorando le righe selezionate nella tabella dati. Ci è voluto un po' di cura manuale delle parole chiave per creare una bella immagine.
TransposedTransposedTrasposto
// 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 )} ) )
);Ri: Reti di cooccorrenza di parole chiave in JMP?Sono un sostenitore di JMP dal 1994, quindi sono consapevole dei suoi numerosi punti di forza e di come problemi diversi possano essere risolti attraverso percorsi diversi (questa è solo una delle cose che mi piace di esso). Inizio sempre con JMP. La mia comunità professionale è dominata dagli utenti R. Possono eseguire tutti i tipi di analisi, ma la capacità di R di creare visualizzazioni di dati interattive (cosa mia) non è nemmeno allo stesso livello di JMP. Quindi rimango con JMP. Tuttavia, con l'evoluzione dei metodi statistici, una percentuale maggiore di analisi più recenti è possibile solo tramite R o JMP Pro, ma non utilizzando una licenza JMP standard (ad esempio, varie piattaforme di analisi del testo, procedure di selezione di modelli di base che sono una pratica standard nel mio campo ). Ciò rende più difficile per me svolgere analisi olistiche, dall'inizio alla fine in JMP. Man mano che JMP Pro e JMP standard si allontanano sempre di più, mi ritrovo a consultare la comunità per possibili soluzioni ai miei problemi che posso ottenere con una licenza JMP standard.Il post di Craige è stato un ottimo esempio di come la community mi abbia aiutato a trovare un modo per raggruppare i documenti utilizzando un DTM in JMP standard. Il mio post più recente chiedeva se esiste una soluzione simile che potrebbe essere possibile per raggruppare i termini utilizzando un DTM in JMP standard.
In questo caso specifico, sto cercando di incorporare un grafico di rete di co-occorrenza di parole chiave in una visualizzazione interattiva esistente che ho creato in JMP standard.Non penso che sto cercando di reinventare la ruota. Penso che mi sto imbattendo in un muro di funzionalità nella licenza JMP standard (forse) o in una mancanza di conoscenza/creatività da parte mia su come farcela (più probabile).Non posso permettermi JMP Pro. Questa è la mia realtà e non credo che cambierà presto. Entrambe le piattaforme di analisi delle classi latenti e di analisi semantica latente menzionate sono disponibili solo in JMP Pro. Quando faccio domande sulle funzionalità della licenza JMP standard e ricevo risposte che mi dicono che posso fare qualcosa solo in JMP Pro, non mi aiuta davvero. Sono felice se le mie domande aiutano a risolvere i problemi per gli utenti di JMP Pro, ma mi rimane ancora l'enigma originale di provare a fare qualcosa in JMP standard che richiede più creatività e conoscenza (due straordinarie qualità della comunità di utenti JMP) rispetto a Possiedo da solo.
Sono grato a JMP, al personale del supporto tecnico di JMP (che è straordinario) e a questa comunità di utenti. Fino a quando il mio budget non diventerà molto più grande di quanto non sia mai stato, probabilmente continuerò a fare domande qui sui modi creativi per portare a termine le cose utilizzando una licenza JMP standard (che a volte potrebbe essere eccessivo). Sono d'accordo con Mark sul fatto che sia necessario prima imparare JMP (cosa che mi piace fare da oltre 25 anni). Tuttavia, a volte faccio fatica a capire come soddisfare le mie crescenti esigenze di analisi e visualizzazione con una licenza JMP standard. Spero ancora che esista un modo legittimo per utilizzare un JMP standard per creare un diagramma di rete di co-occorrenza di parole chiave per raggruppare termini che abbia piena interattività e possa essere salvato come script di tabella JMP. Non so come farlo. Dato il mio normale processo di lettura della documentazione JMP, ricerca nei post della comunità JMP e semplice sperimentazione per conto mio, non sono riuscito a capire come farlo. Se semplicemente non è possibile farlo senza una licenza JMP Pro, lascerò che vada alla deriva e lascerò questo tipo di grafico fuori dalla mia visualizzazione.
Scusa per la lunga risposta. Se qualcuno di JMP vuole intervenire con alcune strategie su come cavarsela con JMP standard quando non puoi permetterti JMP Pro, mi piacerebbe qualche consiglio (sembra un buon argomento per il blog). Forse non è un argomento per questo forum di discussione. Mi scuso se non lo è. Sentitevi liberi di contattarmi offline a caseylott@ymail.com se qualcuno ha suggerimenti al riguardo.
Ri: Reti di cooccorrenza di parole chiave in JMP?Sto solo aggiungendo @Craige_Hales ' aiuta a utilizzare l'analisi delle classi latenti per raggruppare righe (documenti) e l'analisi semantica latente per raggruppare colonne (termini). Queste piattaforme sono disponibili in Analizza > Metodi multivariati. (Sono inoltre integrati e specializzati per Text Explorer in JMP Pro.) Consultare la documentazione di JMP...
L'idea è che JMP abbia molte piattaforme potenti che lavorano insieme. La mia analogia è una calcolatrice grafica. Ci sono molti pulsanti e spesso è necessario più di un pulsante per portare a termine il lavoro. Vale a dire che non esiste un pulsante che "fa tutto", ma puoi arrivarci. È necessario apprendere JMP come primo approccio invece di provare a ricreare un'applicazione personalizzata. Perché reinventare la ruota?
Ri: Reti di cooccorrenza di parole chiave in JMP?Ciao Craige,
Mi sono appena reso conto che lo script che hai inviato utilizza valori in un DTM per creare cluster di documenti basati su usi simili dei termini tra i documenti. In questo caso ogni nodo rappresenta un documento e ogni collegamento si basa su un valore di distanza derivante dall'analisi del cluster. Sto cercando di fare qualcosa di leggermente diverso.
Mi piacerebbe creare un grafico di costellazione come questo in cui ogni nodo rappresenta un TERMINE nel DTM e ogni collegamento è basato su una sorta di statistica che descrive la ricorrenza delle parole chiave. Questo è molto al di fuori della mia competenza. Adoro l'idea di una trama del genere, ma non sono sicuro che sarebbe appropriato riformattare il DTM in qualche modo in modo da poter eseguire un'analisi dei cluster in cui i termini finiscono come nodi (o come lo farei io). Ciò raggiungerebbe il mio obiettivo di avere un grafico in JMP basato sulla correlazione dei termini che posso utilizzare come filtro globale in una visualizzazione interattiva dei dati. Tuttavia, questo tipo di conclusione creerebbe una grafica che non si basa sulle migliori pratiche di analisi del testo? Per quelli di voi che comprendono questo campo, questo uso dell'analisi dei cluster sarebbe inappropriato per illustrare la ricorrenza delle parole chiave? In tal caso, qualcuno ha creato qualcosa in grado di eseguire analisi di ricorrenza di parole chiave (utilizzando metodi statistici adeguati per questo tipo di analisi) in JMP?Sono interessato a ricevere feedback dalla community a riguardo. Mi scuso che il mio post originale non fosse più chiaro. Craige, utilizzerò sicuramente lo script che hai inviato nella tua prima risposta per quando avrò bisogno di raggruppare i documenti! Grazie.
Ri: Reti di cooccorrenza di parole chiave in JMP?Usare una riga alla volta potrebbe non essere la risposta giusta; non dovrà essere una parola comune con i vicini nel diagramma. A meno che due vicini spaziali non condividano alcune parole.
Ri: Reti di cooccorrenza di parole chiave in JMP?Non sono sicuro; Penso che per ogni riga vorresti le 3 o 4 parole più importanti (nomi di colonna) per quella riga, e potrebbero essere quelle con il valore maggiore. Sembra corretto quando guardi alcune righe? Se è così, non sarebbe un passaggio di preelaborazione creare quella colonna di etichette.
Ri: Reti di cooccorrenza di parole chiave in JMP?Ciao Craige,
È brillante! Non sono un mago di JSL, ma sono riuscito a farlo funzionare con i miei dati. L'unica cosa che non riesco a capire come fare è creare un identificatore di etichetta che utilizzi i nomi delle colonne per i termini nella matrice dei termini del documento. La matrice dei termini del mio documento ha 252 colonne. Ogni nome di colonna viene formattato automaticamente con i termini valore con radice e il suffisso TF IDF2. Ad esempio, una colonna è denominata "distribuzione· TF IDF 2", un'altra è denominata "montagna· TF IDF 2". Mi piacerebbe che le etichette dei punti della costellazione fossero il termine con radice, senza il suffisso (ad esempio, distribut· o mountain·). Esiste un modo semplice per utilizzare i valori dei nomi delle colonne della matrice dei termini del documento come etichette dei punti?
Grazie mille per aver fornito questo script.
Casey
Ri: Reti di cooccorrenza di parole chiave in JMP?Puoi ottenere qualcosa di correlato, forse, come questo. Ed è collegato al tavolo. E non professionista.
Constellation Plot from ClusteringConstellation Plot from ClusteringGrafico delle costellazioni dal clustering
// 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 )}))
);