如何在R中删除重复的推文?

4
我正在对推文进行文本挖掘,但是遇到了重复的推文问题,就像这样:
"aeCERT: aeCERT为选民、执法机构、学术界和公众提供持续的信息安全意识计划。"
"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、substr等方法删除冒号前的所有内容,然后比较字符串;或者你可以使用近似字符串匹配(agrep())方法。 - EDi
2个回答

5

从推文中提取文本,然后使用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…"

请注意,即使推文中的文本只有一个字符发生变化,该推文也不会被检测为重复(例如,当某人转推并通过不同的链接缩短器添加链接时)。

您还可以像这样做

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

获取一个逻辑向量,其中包含所有回复他人推文的推文,或
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) 

请注意,即使在推文文本中更改了一个字符,也意味着该推文将不会被检测为重复。您可以注意到包[RecordLinkage](http://cran.r-project.org/web/packages/RecordLinkage/index.html),特别是RLBigDataDedup()函数可以提供帮助。 - Jack Ryan
@JackRyan 感谢你的指引,我会去看看(虽然不是为了这个应用程序,但是相关的)。 - Simon O'Hanlon

0

或许可以尝试这样做:

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

编辑(不带不必要的sapply):

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

1
非常感谢大家的帮助,我已经通过以下方式解决了问题:tweets2.df <- tweets1.df [!duplicated(tweets1.df$text),]。 - user2450850
1
你应该将那个评论发布为答案,然后删除该评论。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接