在 R 中的海量数据集上进行文本挖掘(或 Python!)
Text mining on a massive dataset in R (or Python !)
我有一个包含超过 2.300.000 个观察值的数据集。一个变量专门用于描述(文本),有时会有很长的句子。
通过所有这些观察,想象一下我们拥有的单词数量。我想获得一个输出(数据框),其中包含此变量的所有单词,从最频繁到最不频繁排序。但是,我不想考虑一些词,例如“and”、“street”、“the”等
我测试了两个代码:
descri1tm <- df %>%
# Transforming in a corpus #
VectorSource() %>%
Corpus() %>%
# Cleaning the corpus #
tm_map(content_transformer(tolower)) %>% #lowercase
tm_map(stripWhitespace) %>%
tm_map(removeNumbers) %>% #numbers
tm_map(removePunctuation) %>% #ponctuation
tm_map(removeWords, stopwords("spanish", "cale","barrio","y","al","en","la","el","entre","del")) %>% # words we don't care about
# Transform in a Matrix #
TermDocumentMatrix() %>%
as.data.frame.matrix() %>%
mutate(name = row.names(.)) %>%
arrange(desc(`1`))
#Creating the data frame #
tidytext <- data_frame(line = 1:nrow(df), Description = df$cdescription)
#Frequency analysis
tidytext <- tidytext %>%
unnest_tokens(word, Description) %>%
anti_join(stop_words) %>%
count(word, sort = TRUE)
head(tidytext, 10)
对于这个,我认为还不够强大,R 运行 24 小时没有结果...
所以我测试了这个(在这里找到):
allwords <- df %>% stringr::str_glue_data("{rownames(.)} cdescription: {cdescription}")
# function to count words in a string #
countwords = function(strings){
# remove extra spaces between words
wr = gsub(pattern = " {2,}", replacement=" ", x=strings)
# remove line breaks
wn = gsub(pattern = '\n', replacement=" ", x=wr)
# remove punctuations
ws = gsub(pattern="[[:punct:]]", replacement="", x=wn)
# split the words
wsp = strsplit(ws, " ")
# sort words in table
wst = data.frame(sort(table(wsp, exclude=""), decreasing=TRUE))
wst
}
all_words <- countwords(allwords)
对于这个,有两个问题:不能不考虑某些单词,而且我一次又一次地收到以下错误消息:
Error in table(wsp, exclude = "") :
all arguments must have the same length
有人有想法吗?
请客气,这是我第一次使用这样的数据集,数据科学根本不是我的专业!
如果文本存储在数据框中
变量,要获取词频并删除西班牙语停用词,您只需要第一段代码的第三个序列。
df <- data.frame(
status_id = c("1377298096732958721", "1376773867805540360", "1376627381994188802", "1376551216252076038", "1379254614898393091", "1376551522746691588", "1377122148779655174", "1376518995508133888", "1376675783775764486", "1377697100276842497"),
text = c("La protección de las mujeres defensoras de #DDHH es imprescindible para avanzar hacia la igualdad. Por este motivo, llamamos a los Estados y mecanismos internacionales presentes en el #ForoGeneraciónIgualdad a adoptar una serie de medidas urgentes para su protección. HILO<U+0001F447><U+0001F3FE>", "Llaman a las feministas a no participar en la farsa conocida como Foro Generación Igualdad, anunciado como un acto donde es fundamental la sociedad civil feminista vía @SemMéxico", "En el marco de la inauguración del Foro Generación Igualdad, el presidente @lopezobrador_ afirmó que trabajamos todos los días para combatir la discriminación, el clasismo y el racismo. #FelizLunes <U+270C><U+FE0F> #MJyEx4T <U+0001F1F2><U+0001F1FD> #MJE4T", "Es un honor participar en el #ForoGeneraciónIgualdad que inauguró el presidente @lopezobrador_. Este encuentro mundial convocado por @ONUMujeres y co presidido por el gobierno de Francia del presidente @EmmanuelMacron busca acciones concretas a favor de las mujeres.", "Queremos un mundo en el que las mujeres decidamos sobre nuestros cuerpos, la política y el medio ambiente. #GeneraciónIgualdad", "<U+0001F5E3> Inauguración del Foro Generación Igualdad : \"En México como en Paris podremos contar con la movilización colectiva de los gobiernos\" - Emmanuel Macron. <U+0001F6BA>=<U+0001F6B9> @EmmanuelMacron @Elysee @GenEgaliteFR @ONUMujeresMX", "Gran orgullo ser parte del #ForoGeneraciónIgualdad en el que también destaca el intercambio cultural. Un honor compartir este día con @nadgasman, @ONUMujeres y con mis compañeras del primer gabinete paritario en la historia de México.", "Como nos recuerda @C2030Europe hoy empieza el #ForoGeneraciónIgualdad, cita mundial para impulsar los derechos sexuales y reproductivos y la igualdad de género. Más información, aquí:", "En este #ForoGeneracionIgualdad escucharemos las voces de mujeres de todo el mundo en un diálogo horizontal para avanzar hacia la igualdad y nos hemos propuesto objetivos de interés general que atienda a las mujeres que menos tienen: @M_OlgaSCordero", "<U+0001F4C4>El activismo y los compromisos para acelerar la igualdad de género marcan la clausura del Foro Generación Igualdad en la CDMX." )
)
df %>%
mutate(text = tolower(text)) %>%
unnest_tokens(output = word, input = text) %>%
filter(!word %in% c(stopwords::stopwords(language = "es"), "cale","barrio","y","al","en","la","el","entre","del")) %>%
count(word, sort = TRUE)
word n
1 u 13
2 igualdad 8
3 mujeres 5
4 foro 4
5 forogeneraciónigualdad 4
...
如果这对您的系统 RAM 来说仍然太多,只需将源 DF 分割成更小的 df,然后追加并求和所得的字数。
我有一个包含超过 2.300.000 个观察值的数据集。一个变量专门用于描述(文本),有时会有很长的句子。 通过所有这些观察,想象一下我们拥有的单词数量。我想获得一个输出(数据框),其中包含此变量的所有单词,从最频繁到最不频繁排序。但是,我不想考虑一些词,例如“and”、“street”、“the”等
我测试了两个代码:
descri1tm <- df %>%
# Transforming in a corpus #
VectorSource() %>%
Corpus() %>%
# Cleaning the corpus #
tm_map(content_transformer(tolower)) %>% #lowercase
tm_map(stripWhitespace) %>%
tm_map(removeNumbers) %>% #numbers
tm_map(removePunctuation) %>% #ponctuation
tm_map(removeWords, stopwords("spanish", "cale","barrio","y","al","en","la","el","entre","del")) %>% # words we don't care about
# Transform in a Matrix #
TermDocumentMatrix() %>%
as.data.frame.matrix() %>%
mutate(name = row.names(.)) %>%
arrange(desc(`1`))
#Creating the data frame #
tidytext <- data_frame(line = 1:nrow(df), Description = df$cdescription)
#Frequency analysis
tidytext <- tidytext %>%
unnest_tokens(word, Description) %>%
anti_join(stop_words) %>%
count(word, sort = TRUE)
head(tidytext, 10)
对于这个,我认为还不够强大,R 运行 24 小时没有结果... 所以我测试了这个(在这里找到):
allwords <- df %>% stringr::str_glue_data("{rownames(.)} cdescription: {cdescription}")
# function to count words in a string #
countwords = function(strings){
# remove extra spaces between words
wr = gsub(pattern = " {2,}", replacement=" ", x=strings)
# remove line breaks
wn = gsub(pattern = '\n', replacement=" ", x=wr)
# remove punctuations
ws = gsub(pattern="[[:punct:]]", replacement="", x=wn)
# split the words
wsp = strsplit(ws, " ")
# sort words in table
wst = data.frame(sort(table(wsp, exclude=""), decreasing=TRUE))
wst
}
all_words <- countwords(allwords)
对于这个,有两个问题:不能不考虑某些单词,而且我一次又一次地收到以下错误消息:
Error in table(wsp, exclude = "") : all arguments must have the same length
有人有想法吗? 请客气,这是我第一次使用这样的数据集,数据科学根本不是我的专业!
如果文本存储在数据框中 变量,要获取词频并删除西班牙语停用词,您只需要第一段代码的第三个序列。
df <- data.frame(
status_id = c("1377298096732958721", "1376773867805540360", "1376627381994188802", "1376551216252076038", "1379254614898393091", "1376551522746691588", "1377122148779655174", "1376518995508133888", "1376675783775764486", "1377697100276842497"),
text = c("La protección de las mujeres defensoras de #DDHH es imprescindible para avanzar hacia la igualdad. Por este motivo, llamamos a los Estados y mecanismos internacionales presentes en el #ForoGeneraciónIgualdad a adoptar una serie de medidas urgentes para su protección. HILO<U+0001F447><U+0001F3FE>", "Llaman a las feministas a no participar en la farsa conocida como Foro Generación Igualdad, anunciado como un acto donde es fundamental la sociedad civil feminista vía @SemMéxico", "En el marco de la inauguración del Foro Generación Igualdad, el presidente @lopezobrador_ afirmó que trabajamos todos los días para combatir la discriminación, el clasismo y el racismo. #FelizLunes <U+270C><U+FE0F> #MJyEx4T <U+0001F1F2><U+0001F1FD> #MJE4T", "Es un honor participar en el #ForoGeneraciónIgualdad que inauguró el presidente @lopezobrador_. Este encuentro mundial convocado por @ONUMujeres y co presidido por el gobierno de Francia del presidente @EmmanuelMacron busca acciones concretas a favor de las mujeres.", "Queremos un mundo en el que las mujeres decidamos sobre nuestros cuerpos, la política y el medio ambiente. #GeneraciónIgualdad", "<U+0001F5E3> Inauguración del Foro Generación Igualdad : \"En México como en Paris podremos contar con la movilización colectiva de los gobiernos\" - Emmanuel Macron. <U+0001F6BA>=<U+0001F6B9> @EmmanuelMacron @Elysee @GenEgaliteFR @ONUMujeresMX", "Gran orgullo ser parte del #ForoGeneraciónIgualdad en el que también destaca el intercambio cultural. Un honor compartir este día con @nadgasman, @ONUMujeres y con mis compañeras del primer gabinete paritario en la historia de México.", "Como nos recuerda @C2030Europe hoy empieza el #ForoGeneraciónIgualdad, cita mundial para impulsar los derechos sexuales y reproductivos y la igualdad de género. Más información, aquí:", "En este #ForoGeneracionIgualdad escucharemos las voces de mujeres de todo el mundo en un diálogo horizontal para avanzar hacia la igualdad y nos hemos propuesto objetivos de interés general que atienda a las mujeres que menos tienen: @M_OlgaSCordero", "<U+0001F4C4>El activismo y los compromisos para acelerar la igualdad de género marcan la clausura del Foro Generación Igualdad en la CDMX." )
)
df %>%
mutate(text = tolower(text)) %>%
unnest_tokens(output = word, input = text) %>%
filter(!word %in% c(stopwords::stopwords(language = "es"), "cale","barrio","y","al","en","la","el","entre","del")) %>%
count(word, sort = TRUE)
word n
1 u 13
2 igualdad 8
3 mujeres 5
4 foro 4
5 forogeneraciónigualdad 4
...
如果这对您的系统 RAM 来说仍然太多,只需将源 DF 分割成更小的 df,然后追加并求和所得的字数。