如何在 R 中清理 twitter 数据?

Posted

技术标签:

【中文标题】如何在 R 中清理 twitter 数据?【英文标题】:How do I clean twitter data in R? 【发布时间】:2015-09-29 15:45:18 【问题描述】:

我使用 twitteR 包从 twitter 中提取了推文,并将它们保存到一个文本文件中。

我对语料库进行了以下操作

xx<-tm_map(xx,removeNumbers, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,stripWhitespace, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,removePunctuation, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,strip_retweets, lazy=TRUE, 'mc.cores=1')
xx<-tm_map(xx,removeWords,stopwords(english), lazy=TRUE, 'mc.cores=1')

(使用 mc.cores=1 和 lazy=True 否则 Mac 上的 R 会出错)

tdm<-TermDocumentMatrix(xx)

但是这个词条文档矩阵有很多奇怪的符号,无意义的词之类的。 如果一条推文是

 RT @Foxtel: One man stands between us and annihilation: @IanZiering.
 Sharknado‚Äã 3: OH HELL NO! - July 23 on Foxtel @SyfyAU

清理推文后,我只希望留下正确的完整英文单词,即没有其他所有内容的句子/短语(用户名、缩写词、网址)

示例:

One man stands between us and annihilation oh hell no on 

(注意:tm 包中的转换命令只能去除停用词、标点空格以及转换为小写)

【问题讨论】:

那么,sharknadofoxtel 就可以了,因为它们不是“正确的”英文单词... 如果您使用例如xx &lt;- tm_map(xx, content_transformer(removePunctuation)xx &lt;- tm_map(xx, content_transformer(tolower)),您是否看到任何改进? 确切的语法可能取决于您安装的tm 软件包的版本号。 【参考方案1】:

        library(tidyverse)    
        
        clean_tweets <- function(x) 
                    x %>%
                            # Remove URLs
                            str_remove_all(" ?(f|ht)(tp)(s?)(://)(.*)[.|/](.*)") %>%
                            # Remove mentions e.g. "@my_account"
                            str_remove_all("@[[:alnum:]_]4,") %>%
                            # Remove hashtags
                            str_remove_all("#[[:alnum:]_]+") %>%
                            # Replace "&" character reference with "and"
                            str_replace_all("&amp;", "and") %>%
                            # Remove puntucation, using a standard character class
                            str_remove_all("[[:punct:]]") %>%
                            # Remove "RT: " from beginning of retweets
                            str_remove_all("^RT:? ") %>%
                            # Replace any newline characters with a space
                            str_replace_all("\\\n", " ") %>%
                            # Make everything lowercase
                            str_to_lower() %>%
                            # Remove any trailing whitespace around the text
                            str_trim("both")
            
    
        tweets %>% clean_tweets

【讨论】:

是否有可能让 cmets 了解每个步骤中要删除的内容?我目前正在学习正则表达式,但在识别某些表达式时仍有问题。谢谢 @k3r0 - 我在每个步骤中添加了 cmets 以更清楚地阐明它在做什么 我读了一点,发现了其中的一些,但不是全部。不是很熟悉执行功能,所以这也是一个很好的学习。谢谢!【参考方案2】:

代码做了一些基本的清理

转换为小写

df <- tm_map(df, tolower)  

删除特殊字符

df <- tm_map(df, removePunctuation)

删除特殊字符

df <- tm_map(df, removeNumbers)

删除常用词

df <- tm_map(df, removeWords, stopwords('english'))

删除网址

removeURL <- function(x) gsub('http[[:alnum;]]*', '', x)

【讨论】:

【参考方案3】:

对我来说,由于某种原因,这段代码不起作用-

# Get rid of URLs
clean_tweet <- str_replace_all(clean_tweet, "http://t.co/[a-z,A-Z,0-9]*8","")

错误是-

Error in stri_replace_all_regex(string, pattern, fix_replacement(replacement),  : 
 Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)

所以,我使用了

clean_tweet4 <- str_replace_all(clean_tweet3, "https://t.co/[a-z,A-Z,0-9]*","")
clean_tweet5 <- str_replace_all(clean_tweet4, "http://t.co/[a-z,A-Z,0-9]*","")

摆脱网址

【讨论】:

【参考方案4】:

使用 gsub 和

stringr 包

我已经找到了删除转发、对屏幕名称、主题标签、空格、数字、标点符号、网址的引用的部分解决方案。

  clean_tweet = gsub("&amp", "", unclean_tweet)
  clean_tweet = gsub("(RT|via)((?:\\b\\W*@\\w+)+)", "", clean_tweet)
  clean_tweet = gsub("@\\w+", "", clean_tweet)
  clean_tweet = gsub("[[:punct:]]", "", clean_tweet)
  clean_tweet = gsub("[[:digit:]]", "", clean_tweet)
  clean_tweet = gsub("http\\w+", "", clean_tweet)
  clean_tweet = gsub("[ \t]2,", "", clean_tweet)
  clean_tweet = gsub("^\\s+|\\s+$", "", clean_tweet) 

参考:(希克斯,2014 年) 经过上述 我做了以下。

 #get rid of unnecessary spaces
clean_tweet <- str_replace_all(clean_tweet," "," ")
# Get rid of URLs
clean_tweet <- str_replace_all(clean_tweet, "http://t.co/[a-z,A-Z,0-9]*8","")
# Take out retweet header, there is only one
clean_tweet <- str_replace(clean_tweet,"RT @[a-z,A-Z]*: ","")
# Get rid of hashtags
clean_tweet <- str_replace_all(clean_tweet,"#[a-z,A-Z]*","")
# Get rid of references to other screennames
clean_tweet <- str_replace_all(clean_tweet,"@[a-z,A-Z]*","")   

参考:(斯坦顿 2013 年)

在执行上述任何操作之前,我使用以下内容将整个字符串折叠成一个长字符。

paste(mytweets, collapse=" ")

与 tm_map 转换相比,这个清理过程对我来说非常有效。

我现在只剩下一组适当的词和极少数的不适当的词。 现在,我只需要弄清楚如何删除不正确的英文单词。 可能我将不得不从字典中减去我的一组单词。

【讨论】:

这很好用,但如果您不想覆盖变量,请确保不要在参数中使用clean_tweet 还要确保顺序正确。如果您首先删除提及,然后执行 RT 检查 (clean_tweet &lt;- str_replace(clean_tweet,"RT @[a-z,A-Z]*: ","")),它将找不到任何内容,因为 @ 不再存在【参考方案5】:

要删除 URL,您可以尝试以下操作:

removeURL <- function(x) gsub("http[[:alnum:]]*", "", x)
xx <- tm_map(xx, removeURL)

您可能可以定义类似的函数来进一步转换文本。

【讨论】:

以上是关于如何在 R 中清理 twitter 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java清理脏文本[关闭]

用R对Twitter用户的编程语言语义分析

如何删除数据框中的回车符

清理用户输入

如何在有效的 Twitter Bootstrap 中垂直居中内容?

使用 R 清理大数据中不必要的变量