Commit 86093501 authored by Hadrien Commenges's avatar Hadrien Commenges
Browse files

add list CNRS and check content

parent c375eb2e
This diff is collapsed.
ID;LABEL;KEY
01;Interactions, particules, noyaux, du laboratoire au cosmos;physique
02;Théories physiques : méthodes, modèles et applications;physique
03;Matière condensée : structures et propriétés électroniques;physique
04;Physique des atomes, molécules et plasmas. Optique et lasers;physique
05;Matière condensée : organisation et dynamique;physique
06;Sciences de l'information : fondements de l'informatique, calculs, algorithmes, représentations, exploitations;informatique
07;Sciences de l'information : signaux, images, langues, automatique, robotique, interactions, systèmes intégrés matériel-logiciel;informatique
08;Micro- et nanotechnologies, micro- et nanosystèmes, photonique, électronique, électromagnétisme, énergie électrique;électronique
09;Mécanique des solides. Matériaux et structures. Biomécanique. Acoustique;mécanique
10;Milieux fluides et réactifs : transports, transferts, procédés de transformation;physique
11;Matière molle : synthèse, élaboration, assemblages, structure, propriétés, fonctions;physique
12;Architectures moléculaires : synthèses, mécanismes et propriétés;chimie
13;Chimie physique, théorique et analytique;chimie
14;Chimie de coordination, catalyse et procédés, interfaces;chimie
15;Chimie des matériaux, nanomatériaux et procédés;chimie
16;Chimie et vivant;chimie
17;Système solaire et univers lointain;univers
18;Terre et planètes telluriques : structure, histoire, modèles;univers
19;Système Terre : enveloppes superficielles;géologie
20;Biologie moléculaire et structurale, biochimie;biologie
21;Organisation, expression, évolution des génomes;biologie
22;Biologie cellulaire, développement, évolution-développement;biologie
23;Biologie intégrative des organismes photosynthétiques et des microorganismes associés;biologie
24;Physiologie, physiopathologie, biologie du cancer;physiologie
25;Neurobiologie moléculaire et cellulaire, neurophysiologie;neurologie
26;Cerveau, cognition, comportement;neurologie
27;Relations hôte-pathogène, immunologie, inflammation;immunologie
28;Pharmacologie - ingénierie et technologies pour la santé - imagerie biomédicale;pharmacologie
29;Biodiversité, évolution et adaptations biologiques : des macromolécules aux communautés;biologie
30;Surface continentale et interfaces;géologie
31;Hommes et milieux : évolution, interactions;histoire
32;Mondes anciens et médiévaux;histoire
33;Mondes modernes et contemporains;histoire
34;Sciences du langage;linguistique
35;Philosophie, littératures, arts;philosophie
36;Sociologie et sciences du droit;sociologie
37;Economie et gestion;économie
38;Anthropologie et étude comparative des sociétés contemporaines;anthropologie
39;Espaces, territoires, sociétés;géographie
40;Politique, pouvoir, organisation;politique
41;Mathématiques et interactions des mathématiques;mathématique
......@@ -11,22 +11,45 @@ Si des chercheurs s'affichent sur Wikipédia, d'autres chercheurs peuvent bien a
## Structure de l'outil
- liste pré-établies des catégories requêtables (`Historien du XXIe siècle`, `Sociologue_français_du_XXe_siècle`, etc.), à regrouper par discipline
- extraction de la liste des individus de la catégorie
### Constitution de la base
- source des noms : liste des électeurs du CNRS (fournie par Robin, 75063 individus au 28 septembre 2021)
- la base contient trois ensembles de pages, stockées entières en HTML :
1. la page de contenu
2. la page de l'historique des contributions
3. la page de chaque contributeurs apparaissant dans l'historique des contributions (prendre l'ensemble unique des contributeurs qui apparaissent dans l'ensemble des deux niveaux précédents)
- pour chaque page existante extraction et stockage de la page HTML complète (read_html())
- extraction du texte de la page html_nodes("[id='mw-content-text']") %>% html_text()
- tests préalables :
- racine des mots de la section CNRS dans la page
- racine "homonyme"
- racine "curriculum"
- racine "promotionnel ou publicitaire"
- racine "ne cite pas suffisamment ses sources"
- racine "admissibilité de cette page"
### Détection des candidats
- pour un individu donné, extraction de l'historique des modifications
- somme de la taille des contributions par utilisateur
- calcul de mesures de concentration (p.ex. entropie relative)
- détection d'un seuil à partir de la distribution de la mesure de concentration
- CRITÈRE 1 : si le nombre de contributeurs est égal inférieur ou égal à 3 (l'autobiographe aura 1, 2, peut-être 3 comptes utilisateur maximum) et/ou si l'entropie relative est faible, le contenu d'une page est éditée par très peu de contributeurs, page candidate à l'autobiographie
- CRITÈRE 1 : si le nombre de contributeurs est égal inférieur ou égal à 3 (l'autobiographe aura 1, 2, peut-être 3 comptes utilisateur maximum [<-- ! Romain Huret en a créé 4]) et/ou si l'entropie relative est faible, le contenu d'une page est éditée par très peu de contributeurs, page candidate à l'autobiographie
- sélection du petit nombre des contributeurs principaux (l'autobiographe aura 1, 2, peut-être 3 comptes utilisateur maximum)
- extraction de l'historique des contributions des contributeurs principaux
- somme de la taille des contributions par page
- calcul de la concentration (p.ex. entropie relative)
- CRITÈRE 2 : si le nombre de pages modifiées est égal à 1, ou que l'entropie relative est faible, le contributeur est caractérisé comme autobiographe
- CRITERE 3 : si les contributeurs principaux n'ont pas créé de compte sur wikipedia (l'ID est une adresse IP et pas un pseudo)
## Feuille de route
- étiqueter manuellement des pages (autobio TRUE/FALSE) et entraîner un algo d'apprentissage
- chercher tous les homonymes sur wikipedia
- 1er passage : détecter si tu tombes sur une page "homonymie" de wikipedia
-
----------
......@@ -14,6 +14,11 @@ https://fr.wikipedia.org/wiki/Michel_Dugast_Rouill%C3%A9
-----
Philippe Durand (castellologue)
https://fr.wikipedia.org/wiki/Philippe_Durand_%28castellologue%29
-----
Discussion sur la suppression de la page Marie Jaisson, créée par Éric Brian, puis supprimée, puis recréée par lui sur le Wikipédia anglophone
https://fr.wikipedia.org/wiki/Discussion:Marie_Jaisson/Suppression
......@@ -24,3 +29,9 @@ Cas de Claude Piard et Luc Robène
https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Faux-nez/Claude_PIARD
----
Cas de Alberto Alemmano
https://en.wikipedia.org/wiki/Alberto_Alemanno
https://fr.wikipedia.org/wiki/Alberto_Alemanno
----
......@@ -28,14 +28,25 @@ get_name <- function(subject){
# [scrapping] extract contributions for each page and compute size of contribs (octets) ----
get_contribpage <- function(name, limit = 3000){
urlOne <- paste0("https://fr.wikipedia.org/w/index.php?title=", name, "&offset=&limit=", limit, "&action=history")
contentOne <- try(read_html(urlOne))
if(class(contentOne)[1] == "try-error"){
# mage URLs
name <- URLencode(name)
indivURL <- paste0("https://fr.wikipedia.org/wiki/", name)
historyURL <- paste0("https://fr.wikipedia.org/w/index.php?title=", name, "&offset=&limit=", limit, "&action=history")
# get HTML pages
indivPage <- try(read_html(indivURL))
historyPage <- try(read_html(historyURL))
# get contributions if page exists
if(class(historyPage)[1] == "try-error"){
indivPage <- NA
historyPage <- NA
tabContribs <- NA
idContribs <- NA
} else {
idContribs <- contentOne %>% html_nodes("bdi") %>% html_text()
historySizes <- contentOne %>%
idContribs <- historyPage %>% html_nodes("bdi") %>% html_text()
historySizes <- historyPage %>%
html_nodes("[class='history-size mw-diff-bytes']") %>%
html_text() %>%
gsub("[[:punct:][:alpha:]]", "", x = .) %>%
......@@ -52,25 +63,56 @@ get_contribpage <- function(name, limit = 3000){
}
}
closeAllConnections()
return(list(ID = name, CONTRIBS = tabContribs))
return(list(ID = name,
CONTRIBS = tabContribs,
USERS = sort(unique(idContribs)),
INDIVPAGE = indivPage,
HISTORYPAGE = historyPage))
}
# [scrapping] check for section and banners from text content ----
check_content <- function(slot, annuaire){
indivPage <- slot$INDIVPAGE
if(is.na(indivPage)){
allCheck <- NA
} else {
textContent <- indivPage %>%
html_nodes("[id='mw-content-text']") %>%
html_text()
indivSection <- annuaire %>% filter(slot$ID == annuaire$name) %>% pull(KEY)
sectioncheck <- grepl(pattern = indivSection, x = textContent, ignore.case = TRUE)
curriculum <- grepl(pattern = "curriculum", x = textContent, ignore.case = TRUE)
promopub <- grepl(pattern = "promotionnel ou publicitaire", x = textContent, ignore.case = TRUE)
sourcite <- grepl(pattern = "ne cite pas suffisamment ses sources", x = textContent, ignore.case = TRUE)
admissib <- grepl(pattern = "admissibilité de cette page", x = textContent, ignore.case = TRUE)
allCheck <- list(SEC = sectioncheck, CUR = curriculum, PRO = promopub, SOU = sourcite, ADM = admissib)
}
return(allCheck)
}
# [scrapping] extract contributions from user pages and compute size (octets) ----
get_contribuser <- function(name, limit = 500){
get_contribuser <- function(name, limit = 1000){
namewws <- gsub(pattern = " ", replacement = "_", x = name) %>% URLencode()
urlOne <- paste0("https://fr.wikipedia.org/w/index.php?title=Sp%C3%A9cial:Contributions/",
name,
namewws,
"&offset=&limit=",
limit,
"&target=",
name)
namewws)
contentOne <- try(read_html(urlOne))
if(class(contentOne)[1] == "try-error"){
tabContribs <- NA
contentOne <- NA
idContribs <- NA
} else {
idContribs <- contentOne %>% html_nodes("[class='mw-contributions-title']") %>% html_text()
idContribs <- contentOne %>% html_nodes(".mw-contributions-title") %>% html_text()
contribSize <- contentOne %>%
html_nodes('.mw-diff-bytes') %>%
html_text() %>%
......@@ -87,7 +129,7 @@ get_contribuser <- function(name, limit = 500){
}
}
closeAllConnections()
return(tabContribs)
return(list(ID = name, TABCONTRIBS = tabContribs, USERPAGE = contentOne))
}
......@@ -199,7 +241,7 @@ candidate_fromuser <- function(x, target, thres, method = "hampel"){
}
return(result)
}
# [selection] get suspects from history (contribs)
......
......@@ -3,7 +3,6 @@
##### web scrapping
########################################
# load packages ----
library(rvest)
......
# web harvesting
# 3 sets of pages:
# 1. individual pages
# 2. history pages
# 3. users pages
## Hadri ----
# Faire une fonction uniquement d'extraction, qui nomme les éléments de premier niveau avec Prenom_Nom
# Sortir le calcul des contribs dans une fonction dédiée qui prend l'historique comme entrée
# extraire les 70 000 noms sans doublon
## Tom ----
# Développer une fonction qui fasse la distribution des éléments simples d'édition (sans cumul)
# Imaginer une fonction qui travaille sur cette distribution, comme le inter-event time
## Autre ----
# travailler sur les views avec le package wikipediatrend
# rhtrend <- wikipediatrend::wp_trend(page = "Romain_Huret", from = "2015-01-01", lang = "fr")
# produire un fichier texte avec le nom et l'URL, le produire automatiquement puis l'éditer à la main
# load packages ----
library(rvest)
library(tidyverse)
# load functions ----
source("autobiopedia_functions.R")
# get individual pages ----
sections <- read_csv2("DATA/sectionCNRS.csv")
annuaire <- read_csv("DATA/liste_electeurs_CNRS.csv") %>%
filter(!is.na(as.integer(Section_de_vote))) %>%
rename(id = N_Electeur,
genre = Civilite,
lastname = NOM,
firstname = Prenom) %>%
mutate(section = ifelse(Section_de_vote < 10,
paste0("0", Section_de_vote),
as.character(Section_de_vote)),
genre = ifelse(genre == "M.", "M",
ifelse(genre == "Mme", "F", "other")),
lastname = stringr::str_to_title(lastname),
name = paste(firstname, lastname, sep = "_")) %>%
left_join(y = sections, by = c("section" = "ID"))
listHomo <- annuaire %>%
group_by(name) %>%
summarise(NB = n())
tmp <- head(annuaire, 57)
listContribs <- lapply(tmp$name,
function(x) get_contribpage(name = x))
ind <- which(!is.na(lapply(listContribs, function(x) x$CONTRIBS)))
listContribs[ind]
checkDiscipline <- lapply(listContribs,
function(x) check_content(slot = x, annuaire = annuaire))
# get users pages ----
idUsers <- lapply(listContribs, function(x) x$USERS) %>% unlist()
uniqueUsers <- idUsers %>% na.omit() %>% unique() %>% sort()
listUsers <- lapply(uniqueUsers, function(x) get_contribuser(name = x))
library(readr)
library(readxl)
library(dplyr)
df <- readxl::read_excel("DATA/Table_1_Authors_career_2020_wopp_extracted_202108.xlsx",
sheet="Data")
df %>%
filter(cntry=="fra") %>%
pull(authfull)
group_by(inst_name) %>%
summarize(n=n_distinct(authfull)) %>%
arrange(desc(n))
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment