Réseaux de cooccurrence de mots clés dans JMP ?Bonjour la communauté ! Quelqu'un a-t-il compris comment créer un graphique de réseau de cooccurrence de mots clés dans JMP qui peut être enregistré en tant que script dans la table de données avec interactivité avec d'autres graphiques ? Je peux faire appel à R pour créer le graphique, mais il est statique lorsque je le ramène à JMP. Je suis un utilisateur JMP standard et j'aimerais trouver une solution qui n'implique pas les mots « disponible dans JMP Pro uniquement », car une licence JMP Pro dépasse largement mon budget. Merci d'avance pour les conseils que chacun peut fournir.Automatisation et scriptsRe : Réseaux de cooccurrence de mots clés dans JMP ?Salut Craige, A fonctionné à merveille ! Merci. J'ai joint mon graphique ci-dessous. Depuis que j'ai enregistré toutes mes étapes de curation de corpus en tant que propriétés de colonne (recodes, phrases, mots vides, exceptions de tige), elles sont appliquées automatiquement lorsque le script est exécuté. Je vais commencer à expérimenter certains paramètres pour voir comment ils affectent le graphique résultant. J'ai beaucoup d'applications où ce type de graphique est utile, au moins pendant la phase d'exploration des données, j'utiliserai donc ce script encore et encore. Merci encore pour toute votre aide !
Casey
Re : Réseaux de cooccurrence de mots clés dans JMP ?Très agréable!
Stemming might help combine some of the near-duplicatesStemming might help combine some of the near-duplicatesLa recherche de racines pourrait aider à combiner certains des quasi-doublons
Le problème semble être JMP 15 contre 16 ; vous pouvez créer votre propre colonne d'étiquette à la place :
// 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>
Depuis que j'ai ajouté une colonne d'étiquette, j'ai dû en tenir compte dans la liste des colonnes.
Il n'y a pas de réelle différence entre cet affichage et l'affichage normal du dendogramme groupé ; le nœud encerclé dans ce diagramme est la racine du dendogramme et tout le reste est simplement déployé selon un motif circulaire. Ce est plus facile à lire. Vous devrez peut-être dire à votre public d'utiliser la longueur du chemin de connexion entre les mots (pas seulement la proximité) comme mesure de la connectivité.
Vous aurez également envie de jouer avec la partie explorateur de texte ; les mots vides que j'ai utilisés étaient spécifiques à la plaque passe-partout du document du Projet Gutenberg dans chaque livre, et la longueur des mots était de 6, et le choix de racine pourrait ne pas être optimal pour vos documents.
Edit : et combinez peut-être quelques mots : nord, sud, ouest, est pourraient tous signifier la même chose pour votre objectif ?
Re : Réseaux de cooccurrence de mots clés dans JMP ?Salut Craige,
C'est ça! J'ai modifié le script que vous avez envoyé pour ma table de données (voir le script et le fichier de table ci-joints). Tout a très bien fonctionné, mais je n'ai pas réussi à faire fonctionner la fonction d'étiquetage. Je l'ai regardé 3 fois et je jure que je copie exactement votre code. Voyez-vous quelque chose qui pourrait l'empêcher de fonctionner ? L'image de l'intrigue que j'obtiens est ci-dessous. Comme vous pouvez le constater, les étiquettes de termes sont affichées uniquement sous forme de points. Merci encore. J'apprécie vraiment cela!

Re : Réseaux de cooccurrence de mots clés dans JMP ?Ce n'est pas vraiment ça non plus, mais peut-être plus proche. Je les ai colorés en sélectionnant un nœud racine dans la branche, puis en colorant les lignes sélectionnées dans la table de données. Il a fallu un peu de sélection manuelle des mots vides pour créer une jolie image.
TransposedTransposedTransposé
// 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 : Réseaux de cooccurrence de mots clés dans JMP ?Je suis un fidèle de JMP depuis 1994, je suis donc conscient de ses nombreux atouts et de la manière dont différents problèmes peuvent être résolus par différentes voies (c'est juste l'une des choses que j'aime chez JMP). Je commence toujours par JMP. Ma communauté professionnelle est dominée par les utilisateurs de R. Ils peuvent effectuer toutes sortes d'analyses, mais la capacité de R à créer des visualisations de données interactives (mon truc) n'est même pas dans la même ligue que JMP. Donc, je m'en tiens à JMP. Cependant, à mesure que les méthodes statistiques évoluent, une plus grande proportion d'analyses plus récentes sont possibles uniquement via R ou via JMP Pro, mais sans utiliser de licence JMP standard (par exemple, diverses plates-formes d'analyse de texte, procédures de sélection de modèles de base qui sont une pratique courante dans mon domaine). ). Cela rend plus difficile pour moi de faire des analyses holistiques, du début à la fin, dans JMP. À mesure que JMP Pro et JMP standard s'éloignent, je me retrouve à consulter la communauté pour connaître les solutions possibles à mes problèmes que je peux résoudre avec une licence JMP standard.Le message de Craige est un excellent exemple de la communauté qui m'a aidé à trouver un moyen de regrouper des documents à l'aide d'un DTM dans JMP standard. Mon message le plus récent demandait s'il existait une solution similaire permettant de regrouper des termes à l'aide d'un DTM dans JMP standard.
Dans ce cas spécifique, j'essaie d'incorporer un graphique de réseau de cooccurrence de mots clés dans une visualisation interactive existante que j'ai créée dans le standard JMP.Je ne pense pas que j'essaie de réinventer la roue. Je pense que je me heurte soit à un mur de fonctionnalités dans la licence JMP standard (peut-être), soit à un manque de connaissances/créativité de ma part sur la façon d'y parvenir (plus probablement).Je ne peux pas me permettre JMP Pro. C’est ma réalité et je ne la vois pas changer de sitôt. Les plates-formes d'analyse de classes latentes et d'analyse sémantique latente que vous avez mentionnées ne sont disponibles que dans JMP Pro. Lorsque je pose des questions sur les capacités de la licence JMP standard et que j'obtiens des réponses me disant que je ne peux faire quelque chose que dans JMP Pro, cela ne m'aide pas vraiment. Je suis heureux si mes questions aident à résoudre les problèmes des utilisateurs de JMP Pro, mais je me retrouve toujours avec mon énigme initiale consistant à essayer de faire quelque chose dans JMP standard qui nécessite plus de créativité et de connaissances (deux qualités étonnantes de la communauté des utilisateurs de JMP) que Je possède tout seul.
Je suis reconnaissant envers JMP, envers le personnel d'assistance technique de JMP (qui est formidable) et envers cette communauté d'utilisateurs. Jusqu'à ce que mon budget devienne bien plus important que jamais, je continuerai probablement à poser des questions ici sur les moyens créatifs de faire avancer les choses en utilisant une licence JMP standard (ce qui peut parfois repousser les limites). Je suis d'accord avec Mark sur le fait qu'il faut d'abord apprendre JMP (ce que j'aime faire depuis plus de 25 ans). Pourtant, j’ai parfois du mal à comprendre comment répondre à mes besoins croissants en matière d’analyse et de visualisation avec une licence JMP standard. J'espère toujours qu'il existe un moyen légitime d'utiliser un JMP standard pour créer un diagramme de réseau de cooccurrence de mots clés afin de regrouper des termes dotés d'une interactivité totale et pouvant être enregistrés en tant que script de table JMP. Je ne sais pas comment faire ça. Compte tenu de mon processus habituel de lecture de la documentation JMP, de recherche de publications dans la communauté JMP et d'expérimentation par moi-même, je n'ai pas réussi à comprendre comment procéder. Si cela ne peut tout simplement pas être fait sans licence JMP Pro, je vais le laisser dériver et laisser ce type de graphique hors de ma visualisation.
Désolé pour la longue réponse. Si quelqu'un de JMP souhaite proposer des stratégies sur la façon de se débrouiller avec JMP standard lorsque vous ne pouvez pas vous permettre JMP Pro, j'aimerais avoir des conseils (cela semble être un bon sujet de blog). Ce n'est peut-être pas un sujet pour ce forum de discussion. Je m'excuse si ce n'est pas le cas. N'hésitez pas à me contacter hors ligne à caseylott@ymail.com si quelqu'un a des suggestions à ce sujet.
Re : Réseaux de cooccurrence de mots clés dans JMP ?Il suffit d'ajouter à @Craige_Hales ' vous aide à utiliser l'analyse de classe latente pour regrouper des lignes (documents) et l'analyse sémantique latente pour regrouper des colonnes (termes). Ces plateformes sont disponibles sous Analyser > Méthodes multivariées. (Ils sont également intégrés et spécialisés pour Text Explorer dans JMP Pro.) Voir la documentation JMP...
L’idée est que JMP dispose de nombreuses plates-formes puissantes qui fonctionnent ensemble. Mon analogie est une calculatrice graphique. Il y a beaucoup de boutons et il en faut souvent plus d’un pour faire le travail. C'est-à-dire qu'il n'existe pas de bouton unique qui « fasse tout », mais vous pouvez y arriver. Vous devez apprendre JMP comme première approche au lieu d'essayer de recréer une application personnalisée. Pourquoi réinventer la roue ?
Re : Réseaux de cooccurrence de mots clés dans JMP ?Salut Craige,
Je viens de réaliser que le script que vous avez envoyé utilise les valeurs d'un DTM pour créer des groupes de documents basés sur des utilisations similaires de termes parmi les documents. Dans ce cas, chaque nœud représente un document et chaque lien est basé sur une valeur de distance issue de l'analyse cluster. J'essaie de faire quelque chose de légèrement différent.
J'aimerais créer un graphique de constellation comme celui-ci où chaque nœud représente un TERME dans le DTM et chaque lien est basé sur une sorte de statistique décrivant la cooccurrence de mots clés. Cela sort bien de mon expertise. J'adore l'idée d'un tel tracé, mais je ne sais pas s'il serait approprié de reformater le DTM d'une manière ou d'une autre afin qu'une analyse de cluster puisse être effectuée là où les termes finissent sous forme de nœuds (ou comment je ferais cela). Cela permettrait d'atteindre mon objectif d'avoir un graphique dans JMP basé sur la relation des termes que je peux utiliser comme filtre global dans une visualisation de données interactive. Cependant, ce genre de détour créerait-il un graphique qui ne serait pas basé sur les meilleures pratiques d’analyse de texte ? Pour ceux d'entre vous qui comprennent ce domaine, cette utilisation de l'analyse groupée serait-elle inappropriée pour illustrer la cooccurrence de mots clés ? Si tel est le cas, quelqu'un a-t-il construit quelque chose qui puisse effectuer des analyses de cooccurrence de mots clés (en utilisant des méthodes statistiques appropriées pour ce type d'analyse) dans JMP ?Je suis intéressé à entendre les commentaires de la communauté à ce sujet. Je m'excuse si mon message initial n'était pas plus clair. Craige, j'utiliserai certainement le script que vous avez envoyé dans votre première réponse lorsque j'aurai besoin de regrouper des documents ! Merci.
Re : Réseaux de cooccurrence de mots clés dans JMP ?Utiliser une ligne à la fois n’est peut-être pas la bonne réponse ; il ne sera pas nécessaire que ce soit un ou plusieurs mots communs avec les voisins dans le diagramme. A moins que deux voisins spatiaux partagent quelques mots.
Re : Réseaux de cooccurrence de mots clés dans JMP ?Je ne suis pas sûr; Je pense que pour chaque ligne, vous voudriez les 3 ou 4 mots les plus importants (noms de colonnes) pour cette ligne, et ce sont peut-être ceux qui ont la plus grande valeur. Est-ce que cela semble correct lorsque vous regardez certaines lignes ? Si tel est le cas, la création de cette colonne d’étiquettes ne nécessiterait pas beaucoup de prétraitement.
Re : Réseaux de cooccurrence de mots clés dans JMP ?Salut Craige,
C'est génial ! Je ne suis pas un expert du JSL, mais je l'ai fait fonctionner avec mes données. La seule chose que je n'arrive pas à comprendre comment faire est de créer un identifiant d'étiquette qui utilise les noms de colonnes pour les termes dans la matrice des termes du document. La matrice des termes de mon document comporte 252 colonnes. Chaque nom de colonne est automatiquement formaté avec les termes valeur de tige et le suffixe TF IDF2. Par exemple, une colonne est nommée « distribution · TF IDF 2 », une autre est nommée « montagne · TF IDF 2 ». J'aimerais que les étiquettes des points de constellation soient le terme radical, sans le suffixe (par exemple, distribut· ou montagne·). Existe-t-il un moyen simple d'utiliser les valeurs des noms de colonnes de la matrice de termes du document comme étiquettes de points ?
Merci beaucoup d'avoir fourni ce script.
Casey
Re : Réseaux de cooccurrence de mots clés dans JMP ?Vous pouvez peut-être obtenir quelque chose de lié, comme celui-ci. Et il est connecté à la table. Et pas Pro.
Constellation Plot from ClusteringConstellation Plot from ClusteringTracé de constellation à partir du 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 )}))
);