Несколько недель назад я задал ( пост ) простой вопрос: «Дорогой читатель, кто ты?» просто чтобы узнать больше о читателях моего блога. Я нашел это чрезвычайно интересным (даже если — честно говоря — я ожидал большего количества ответов, чтобы начать более серьезное социологическое исследование читателей моего блога). И интересным моментом было то, что многие читатели моего блога приходят, чтобы прочитать « где-то еще».«посты, которые представляют собой обзор интересных постов и статей, найденных в Интернете. Эти ссылки, которыми я делюсь, на самом деле берутся из моих твитов. У меня в блоге есть резервная копия моих твитов, и, как правило, я отправляюсь туда, если хочу найти какую-то статью, или какой-то график, или какую-то карту, которую я имею в виду, которую я где-то видел (но обычно не могу вспомнить, где). Но в большинстве случаев мне скучно, потому что в этом нет ничего нового: просто скопируйте и вставьте из моих твитов.
А сегодня днем @tomroud спросил, как были написаны эти посты: была ли автоматическая процедура или я делал это вручную? До вечера я делал это вручную. Но поскольку это была какая-то глупая задача, я попытался создать код, который сгенерирует простой список моих твитов, которые я могу использовать для создания поста.
Тем не менее, есть еще две проблемы, которые я не могу исправить с помощью кода:
- в моих постах » где-то еще » было различие по языку, причем посты и статьи сначала были на английском, а затем на французском. К сожалению, я не смог найти функцию, которая определяет язык твита. Я помню, что мы пытались с помощью @ 3wen написать такой код, но я не смог его найти … Я думаю, у @ 3wen был первый черновик, поэтому, если мы сможем его найти, я выложу его в свой блог (или он загрузит его на свой )
- в свои посты я включаю картинку, если есть. Эта часть все еще будет выполняться вручную, потому что это намного сложнее (но я думаю, что это возможно …)
Теперь, прежде чем начать, нам понадобятся функции из старого поста , чтобы преобразовать сокращенный URL твиттера в реальный,
extraire <- function(entree,motif){ res <- regexec(motif,entree) if(length(res[[1]])==2){ debut <- (res[[1]])[2] fin <- debut+(attr(res[[1]],"match.length"))[2]-1 return(substr(entree,debut,fin)) }else return(NA)} unshorten <- function(url){ uri <- getURL(url, header=TRUE, nobody=TRUE, followlocation=FALSE, cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")) res <- try(extraire(uri,"\r\nlocation: (.*?)\r\nserver")) return(res)}
Теперь давайте рассмотрим следующий код. Первый шаг, конечно, это запустить несколько строк, которые позволят мне использовать API Twitter,
require(twitteR) reqURL <- "https://api.twitter.com/oauth/request_token" accessURL <- "https://api.twitter.com/oauth/access_token" authURL <- "https://api.twitter.com/oauth/authorize" apiKey <- "yourAPIkey" apiSecret <- "yourAPIsecret" twitCred <- OAuthFactory$new(consumerKey=apiKey,consumerSecret=apiSecret,requestURL=reqURL,accessURL=accessURL,authURL=authURL) twitCred$handshake(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")) registerTwitterOAuth(twitCred)
Затем мне нужно быть осторожным, потому что некоторые из моих твитов написаны на французском, и могут появиться странные символы,
Sys.setlocale("LC_CTYPE","fr_FR.UTF-8")
Теперь я могу написать свою функцию
somewhere_else <- function(){ tweets_freak <- searchTwitter("from:@freakonometrics", n = 500) save(tweets_freak, file="somewhere_else.RData") tweets_freak_df <- do.call("rbind", lapply(tweets_freak, as.data.frame)) text_tweets_freak <- tweets_freak_df$text tweets_freak_message <- text_tweets_freak[which(substr(text_tweets_freak,1,1)!="@")] SE <- which(substr(tweets_freak_message,1,15)=="\"Somewhere else") first_SE <- SE[1] tweets_freak <- tweets_freak_message[1:(first_SE-1)] substitute_id <- function(x){ split_x <- strsplit(x,"@")[[1]] x_id <- paste(split_x,collapse="http://twitter.com/",sep="") split_x_id <- strsplit(x_id,"http") n <- length(split_x_id[[1]]) tweet_x <- strsplit(split_x_id[[1]]," ") if(n==1) rt <- x_id if(n>1){ for(i in 2:n){ url <- tweet_x[[i]][1] split=FALSE if(substr(url,nchar(url),nchar(url))%in%c(":",",",";",")","(")) split <- TRUE if(split==FALSE) unshort_url <- unshorten(paste("http",url,sep="")) if(split==TRUE) unshort_url <- unshorten(paste("http",substr(url,1,nchar(url)-1),sep="")) tweet=FALSE if(substr(url,4,10)=="twitter") tweet=TRUE if((split==FALSE)&(tweet==FALSE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">",unshort_url,"</a>") if((split==TRUE)&(tweet==FALSE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">",unshort_url,"</a>",substr(url,nchar(url),nchar(url))) if((split==FALSE)&(tweet==TRUE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">@",substr(unshort_url,21,nchar(unshort_url)),"</a>") if((split==TRUE)&(tweet==TRUE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">@",substr(unshort_url,21,nchar(unshort_url)) ,"</a>",substr(url,nchar(url),nchar(url))) tweet_x[[i]] <- c(tweet_x_2,tweet_x[[i]][-1]) } rt <- paste("<li>",paste(unlist(tweet_x),collapse=" "),"</li>",sep="") } return(rt) } tweets_freak_sub <- lapply(tweets_freak, substitute_id) write.table(unlist(tweets_freak_sub),file="tweets_somewhere_else.txt",quote=FALSE,row.names=FALSE) cat("Number of tweets.....",length(tweets_freak_sub),"\n") cat("File.................",paste(getwd(),"tweets_somewhere_else.txt",sep="/"),"\n") cat("Done\n") }
Первой сложной задачей было распознать имена, упомянутые в моих твиттах (так как некоторые из них — ретвиты). Вторым было создание html-ссылки каждый раз, когда есть ссылка (здесь я не учел hastags). Если я запускаю его, получаю
> somewhere_else() Number of tweets..... 72 File.... /home/arthur/tweets_somewhere_else.txt Done Warning message: In doRppAPICall("search/tweets", n, params = params, retryOnRateLimit = retryOnRateLimit, : 500 tweets were requested but the API can only return 191
Если я сделаю копию и вставлю из текстового файла, у меня есть
- Глупые люди понятия не имеют, насколько они глупы (так называемый эффект Даннинг-Крюгера) http://www.openculture.com/2014/12/john-cleese-on-stupidity-and-a-cornell-study.html http http : //youtu.be/wvVPdyYeaQU
- «Об измерении экономического риска хвоста» https://www.aeaweb.org/aea/2015conference/program/retrieve.php?pdfid=288
- «Охрана окружающей среды, редкие стихийные бедствия и скидки» https://www.aeaweb.org/aea/2015conference/program/retrieve.php?pdfid=200 (# assa2015, самый интересный хэштег в те дни)
- «20 лет в игре« Профессор »: что я сделал правильно и что я сделал неправильно» http://lymanmuseum.wordpress.com/2015/01/01/20-years-in-the-prof снизитель- игры- вещи- сделали-правые и вещи-я-сделали-неправильные / по @ta_wheeler
- «Вы можете верить, что вы байесовец, но вы, вероятно , ошибаетесь » http://www.rmm-journal.de/downloads/Article_Senn.pdf by @stephensenn
- «Расследование уровня ложных открытий и неправильной интерпретации p-значений» http://rsos.royalsocietypublishing.org/content/1/3/140216 , @david_colquhoun
- «Статистики: когда мы учим, мы не практикуем то, что проповедуем» http://www.stat.columbia.edu/~gelman/research/published/ChanceEthics2.pdf
- «Зачем продолжать учить и использовать проверку гипотез?» http://andrewgelman.com/2015/01/03/continue-teach-use-hypothesis-testing/
что имеет смысл, потому что это действительно мои последние посты,
«Глупые люди понятия не имеют, насколько они глупы» (он же эффект Даннинга-Крюгера) http://t.co/ugdGbuoD2D http://t.co/pHnyWkU20I
и т. д. Мне придется потратить некоторое время, чтобы добавить картинки, графики, карты, видео и т. д., но эта функция должна сэкономить мне время!