AvengeNerds – Méthodologie des analyses

Objectifs

L’objectif est d’analyser les caractéristiques et divergences sémantiques et lexicales dans l’expression sur twitter de deux groupes d’utilisateurs : 

  • les membres de ZetEthique et Métacritique (ZEM)
  • les représentants populaires de la communauté zététique francophone (ZET)

Nous souhaitons étudier la tonalité du discours et caractériser l’expression publique de ces deux groupes. 

Questions :

1) est-ce qu’il y a réellement un intérêt particulier de la part des zem envers les sceptiques ?

Est-ce qu’il y a des éléments qui sont constitutifs du harcèlement ?

2) Est-ce qu’il y a des communautés ? S’il y a des communautés, est-ce qu’il y a des leaders d’opinion ?

Méthodes

Blog

Pour chacun des blogs Zet Ethique et Métacritique (ZEM), la menace théoriste (TEB), et l’économiste sceptique (ES) nous avons :

  • collecté le fichier sitemap.xml qui contient l’arborescence du site
  • aspiré chaque page de blog présente sur le fichier sitemap.xml
  • extrait pour chaque article :
    • le titre
    • l’auteur
    • la date
    • le texte
    • les références (non utilisées ici).
  • détecté les personnes mentionnées dans les articles (dans les articles de 200 mots uniquement).

Le parsing des fichiers sitemap.xml, l’aspiration des articles de blog et le parsing des article a été effectué sur R (Team, 2014) avec les packages XML (Lang, 2022), rvest (Wickham, 2022) , et dplyr (Wickham et al., 2022).

La détection des personnes a été effectuée en utilisant le modèle Jean-Baptiste/camembert-ner disponible dans la librairie python transformers. Le tokenizer utilisé est Jean-Baptiste/camembert-ner. La stratégie d’agrégation a été laissée sur “simple”. Les personnes sont les mots ou groupes de mots tagués comme “PER” par le modèle Jean-Baptiste/camembert-ner. Le modèle Jean-Baptiste/camembert-ner a été appelé depuis R via le package reticulate (Ushey et al., 2022).

Addendum : Les citations concernant les blogs ont été collectées partiellement informatiquement, mais complètement vérifié par un être humain (pour faire la différence entre les citations positives et négatives. Les graphiques présentés ne prennent en compte que les citations négatives. Cette recherche concernant les blogs nous a servi à établir le contexte

Tweets – Jeu de données 1

Récolte des tweets

Nous avons défini une liste de comptes attribués aux groupes ZEM ou ZET. Ces comptes étant anonymisés, la liste n’est pas décrite ici. Pour chacun de ces comptes, nous avons receuilli les 3200 tweets émis en utilisant l’API de twitter à cet endpoint https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-tweets

Lorsqu’un tweet est une réponse à un autre tweet, nous avons également collecté le tweet dont il est fait mention.

Nous avons exclu les retweets (RT).

La limite de 3200 tweets est une limite de quota fixée par l’API de Twitter dans sa version gratuite. La période sur laquelle les tweets sont collectés varie entre les utilisateurs selon la fréquence d’émission de tweet des utilisateurs.

Prétraitement des tweets

Le prétraitement des tweets est effectué comme suit :

  • suppression de la mention RT (@xxxxx:) en début de tweet
  • suppression des tags utilisateurs en début et fin de texte. Les tags de débuts sont les comptes auxquels le tweet répond. Les tags de fin sont en général les comptes dont on sollicite le RT. Nous avons conservé les tags à l’intérieur d’un tweet, car ceux-ci sont des comptes mentionnés et sont en général le sujet du tweet.
  • transformation des hashtags: retrait du # et division de ceux-ci en mot lors du changement de casse (split sur les majuscules).

Extraction des mots

Les tweets prétraités sont ensuite traités par Named Entity Recognition (NER) grâce au modèle fr_de_news_trf de la librairie Python Spacy (Honnibal & Montani, 2017). Ce modèle est lui-même dérivé de camembert-base. Chaque mot se voit attribuer une classe grammaticale. Nous n’avons conservé  uniquement des mots identifiés en tant que verbe / nom-propre / nom commun / adjectifs. Les mots sont ensuite lemmatisés et transformés en casse minuscule. Les lemmes < 2 caractères ont été ôté du corpus.

Les lemmes (mots) apparaissant dans moins de 0.001% des tweets sont exclus du corpus.

Co-occurence

Nous avons analysé les co-occurences entre les mots utilisés dans les tweets. Nous avons ainsi déterminé la probabilité que deux mots apparaissent dans un même tweet. Cela permet de cartographier les mots souvent associés ensemble. Nous avons pour cela utilisé un algorithme emprunté à l’écologie numérique (Veech, 2013). Les données sont préalablement converties en matrice dans laquelle chaque ligne est un tweet, chaque colonne est un mot, et la valeur de chaque cellule est soit 1 soit 0 suivant que le mot soit présent ou nom dans le tweet concerné. C’est un cas classique de matrice de présence/absence.

Pour chaque paire de mots, la significativité de la co-occurrence est déterminée par la p-value, avec un risque alpha fixé à 5%. Les p-values sont ajustées pour comparaison multiple par méthode de Bonferroni (Dunn, 1961).

Tweets – Jeu de données 2

Collecte des tweets

Le jeu de données à été constitué en utilisant l’endpoint search de l’API twitter https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/api-reference/get-search-tweets. Cet endpoint permet de trouver les tweets contenant un mot ou groupe de mots particuliers.

Nous avons collecté les tweets contenant au moins un des mots suivant : @CNQTheorie2, @drsornette, @VioletGael, @ZetEthMeta, Métacritique, Acerdramax, Acermendax, Harcelmendax, Mendax, Merdax, Thomas C. Durand.

La collecte s’est effectuée entre le 18 Juillet et le 18 Août 2022.

Communautés

Pour le corpus ainsi extrait, nous avons extrait les comptes émetteurs de tweets et les relations de follow entre ces comptes. Nous avons construit un graph ou les utilisateurs sont des noeuds et les relations de follow des liens. nous avons ensuite calculé les communautés par méthode de Louvain (Blondel et al., 2008)

Analyse de sentiment

Pour chaque tweet nous avons effectué une analyse de sentiment en utilisant le modèle distilcamembert (Delestre & Amar, 2022) présent dans la librairie Python transformers.

Ce modèle renvoie une catégorie de classification entre 1 et 5 étoiles, 1 étoile représentant un texte extrêmement négatif, 5 étoiles un texte extrêmement positif, et 3 étoiles un texte neutre. La sortie du modèle permet d’avoir pour chaque texte une probabilité associée à chacune de ces catégories.

Nous avons utilisé ces probabilités comme un proxy de quantité de sentiment par texte. Par exemple, si un texte est “ je t’aime trou du cul”, il a un score neutre, mais il contient à la fois de la positivité et de la négativité (Erratum: ceci est un mauvais exemple car l’IA le reconnait bien comme positif). Utiliser la probabilité sur chaque classe permet de tenir compte de ces quantités.

Nous avons ainsi assigné pour chaque tweet une quantité de positivité, une quantité de neutralité, et une quantité de négativité comme suit :

Négativité = P(une étoile) + 0.66 x P(2 étoiles)

Neutralité = P(3 étoiles) + [P(2 étoiles) + P(4 étoiles)] x 0.33

Positivité = P(5 étoiles) + 0.66 x P(4 étoiles)

Flux de négativité

Nous avons calculé un nouveau graph dirigé dans lequel les nœuds sont des comptes et les liens représentent l’existence de tweets postés depuis un compte à l’intention d’un autre compte. Ainsi une relation A → B signifie que le compte A a émis des tweets adressés au compte B. 

Le graph est construit en colorant les nœuds suivant la modularité calculée sur les communautés (avec les liens de follow). Les liens sont pondérés en sommant la quantité de négativité entre 2 interlocuteurs. Ainsi dans le lien A → B, l’épaisseur de la flèche représente la somme de négativité de l’ensemble des tweets émis de A vers B.

Références 

Blondel, V. D., Guillaume, J.-L., Lambiotte, R., & Lefebvre, E. (2008). Fast unfolding of communities in large networks. Journal of Statistical Mechanics: Theory and Experiment, 2008(10), P10008. https://doi.org/10.1088/1742-5468/2008/10/P10008

Delestre, C., & Amar, A. (2022). DistilCamemBERT : A distillation of the French model CamemBERT (arXiv:2205.11111). arXiv. https://doi.org/10.48550/arXiv.2205.11111

Dunn, O. J. (1961). Multiple Comparisons among Means. Journal of the American Statistical Association, 56(293), 52‑64. https://doi.org/10.1080/01621459.1961.10482090

Honnibal, M., & Montani, I. (2017). spaCy 2 : Natural language understanding with Bloom embeddings, convolutional neural networks and incremental parsing.

Lang, D. T. (2022). XML: Tools for Parsing and Generating XML Within R and S-Plus. https://CRAN.R-project.org/package=XML

Team, R. C. (2014). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria, 2012. ISBN 3-900051-07-0.

Ushey, K., Allaire, J. J., & Tang, Y. (2022). reticulate : Interface to « Python ». https://CRAN.R-project.org/package=reticulate

Veech, J. A. (2013). A probabilistic model for analysing species co-occurrence. Global Ecology and Biogeography, 22(2), 252‑260. https://doi.org/10.1111/j.1466-8238.2012.00789.x

Wickham, H. (2022). rvest : Easily Harvest (Scrape) Web Pages. https://CRAN.R-project.org/package=rvest

Wickham, H., François, R., Henry, L., & Müller, K. (2022). dplyr : A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr

Laisser un commentaire

Concevoir un site comme celui-ci avec WordPress.com
Commencer