2013-06-04 3 views
3

Я делаю текст добычу на твиты У меня есть проблемы с повторяющимися твитами, как это:Как удалить дублированные твиты в R?

«aeCERT: aeCERT обеспечивает постоянную программу повышения осведомленности по информационной безопасности трехсторонний, правоохранительная, Academic сектора и общественности.»

«Salim_aeCERT: aeCERT предоставляет постоянную программу по информационной безопасности для учредителей, правоохранительных органов, академического сектора и общественности».

У меня такие же твиты для двух разных учетных записей, как я мог устранить один из моего набора данных? Я попробовал этот код, но дублированные твиты все еще появляются:

tweets1.df <- do.call("rbind", lapply(tweets, as.data.frame)) 
tweets2.df <- tweets1.df[duplicated(tweets1.df) == FALSE,] 
dim(tweets2.df) 

Как я могу удалить дубликаты твитов из различных учетных записей?

+1

вы можете удалить все перед двоеточием (-> регулярное выражение, GSUB, зиЬзЬги и т.д.), а затем сравнить строки или вы могли бы использовать приближенную строку совпадение (-> agrep()). – EDi

ответ

0

Может быть, попробовать что-то вроде:

tweets2.df <- unique(sapply(tweets1.df$tweets, FUN = function(tmp) 
    sub(regmatches(tmp,regexpr("^[[:alnum:]*|[:punct:]*]*[:] ",tmp))[[1]],"",tmp) 
)) 

EDIT (без ненужного sapply):

unique(gsub(regmatches(tweets,regexpr("^[[:alnum:]*|[:punct:]*]*[:] ",tweets))[[1]],"",tweets)) 
+0

спасибо, ребята, много, ваша помощь очень ценится. Я решил проблему: tweets2.df <- tweets1.df [! Duplicated (tweets1.df $ text),] – user2450850

+1

Вы должны опубликовать этот комментарий как ответ, а затем удалите комментарий. – Thomas

4

Извлечение текста из твитов, а затем использовать duplicated для удаления фактических дубликатов.

tweets = searchTwitter('aeCERT: aeCERT' , n=100, cainfo = "cacert.pem") 
texts <- sapply(unlist(tweets) , function(x) `$`(x , "text")) 
length(texts) 
#[1] 100 
texts[87:91] 
#[1] "You should always update your Operating System to reduce and eliminate vulnerabilities http://t.co/l0sdv0k304"        
#[2] "We are today at Dubai Electricity and Water Authority (DEWA) in Dubai conducting information security awareness workshop by Eng. Khalifa..." 
#[3] "We are today at Dubai Electricity and Water Authority (DEWA) in Dubai conducting information security awareness workshop by Eng. Khalifa..." 
#[4] "صباح الخير لجميع المغردين ..متواجدين اليوم في هيئة كهرباء ومياه دبي لعقد ورش التوعية الأمنية الالكترونية يقدمها المهندس خليفة الشامسي"  
#[5] "صباح الخير لجميع المغردين ..متواجدين اليوم في هيئة كهرباء ومياه دبي لعقد ورش التوعية الأمنية الالكترونية يقدمها المهندس خليفة الشامسي" 

unq.texts <- texts[ ! duplicated(texts) ] 
length(unq.texts) 
#[1] 82 
unq.texts[71:74] 
#[1] "You should always update your Operating System to reduce and eliminate vulnerabilities http://t.co/l0sdv0k304"        
#[2] "We are today at Dubai Electricity and Water Authority (DEWA) in Dubai conducting information security awareness workshop by Eng. Khalifa..." 
#[3] "صباح الخير لجميع المغردين ..متواجدين اليوم في هيئة كهرباء ومياه دبي لعقد ورش التوعية الأمنية الالكترونية يقدمها المهندس خليفة الشامسي"  
#[4] "RT @Salim_aeCERT: لا تستجب للمكالمات الهاتفية التي تخبرك بأنك ربحت جوائز قيمة ومبالغ مالية، فقد تكون ضحية للاحتيال #aecert http://t.co/HTK5…" 

Имейте в виду, что даже изменить один символ в тексте твита означает чириканье не будет обнаружен в двух экземплярах (соответствующий в случае, когда кто-то ретвитов и добавляет ссылку через другую ссылку Shortener, например,).

Вы также могли бы сделать что-то вроде

sapply(unlist(tweets) , function(x) length(`$`(x , "replyToUID")) > 0) 

Чтобы получить логическое vectorof всех твитов, которые ответы на чужую твит или

sapply(unlist(tweets) , function(x) length(`$`(x , "retweeted")) > 0) 

получить логический вектор твитов, которые ретвитов (но я не уверен, что это надежно, поскольку никакие твиты не были ретвитами в моем примере). Другие применимые имена и методы могут быть найдены с помощью (например):

str(tweets[[1]]) 
Reference class 'status' [package "twitteR"] with 14 fields 
$ text  : chr "<U+062A><U+0639><U+0644><U+0645> <U+0627><U+0644><U+0645><U+0632><U+064A><U+062F> <U+0639><U+0646> <U+062A><U+062D><U+062F><U+"| __truncated__ 
$ favorited : logi FALSE 
$ replyToSN : chr(0) 
$ created  : POSIXct[1:1], format: "2013-06-04 08:02:24" 
$ truncated : logi FALSE 
$ replyToSID : chr(0) 
$ id   : chr "341827259352641536" 
$ replyToUID : chr(0) 
$ statusSource: chr "<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>" 
$ screenName : chr "Salim_aeCERT" 
$ retweetCount: num 1 
$ retweeted : logi FALSE 
$ longitude : chr(0) 
$ latitude : chr(0) 
+0

re: «Имейте в виду, что даже изменение одного символа в тексте твита означает, что твит не будет обнаружен как дубликат», вы можете заметить, что пакет [RecordLinkage] (http://cran.r-project.org) /web/packages/RecordLinkage/index.html), в частности, может помочь RLBigDataDedup(). –

+0

@JackRyan Спасибо за указатель. Я проверю (не для этого приложения, но связанного) –