NLP

Análise de tf/idf


In [44]:
library(dplyr)
library(tidyRSS)
library(tidytext)
library(ggplot2)


Loading required package: RColorBrewer

Pegamos feeds de vários sites de notícias:


In [5]:
feed <- tidyfeed("https://oglobo.globo.com/rss.xml?completo=true")
feed2 <- tidyfeed("https://news.google.com/news/rss/?ned=pt-br_br&gl=BR&hl=pt-br")
feed3 <- tidyfeed("https://br.noticias.yahoo.com/rss")
feed4 <- tidyfeed("https://br.noticias.yahoo.com/rss")

In [7]:
feedall <- bind_rows(feed,feed2,feed3,feed4)
head(feedall)


feed_titlefeed_linkfeed_languageitem_titleitem_date_publisheditem_linkfeed_descriptionfeed_last_updateditem_category1
OGlobo https://oglobo.globo.com/ pt-br Justiça determina afastamento de Pharol e Société Mondiale da Oi 2018-03-07 22:34:51 https://oglobo.globo.com/economia/justica-determina-afastamento-de-pharol-societe-mondiale-da-oi-22466226 NA NA NA
OGlobo https://oglobo.globo.com/ pt-br Viracorpos negocia venda de participação da UTC 2018-03-07 23:01:21 https://oglobo.globo.com/economia/viracorpos-negocia-venda-de-participacao-da-utc-22466314 NA NA NA
OGlobo https://oglobo.globo.com/ pt-br 'Rodrigo Maia não será o candidato de governo, nem de oposição', diz ACM Neto 2018-03-07 22:31:42 https://oglobo.globo.com/brasil/rodrigo-maia-nao-sera-candidato-de-governo-nem-de-oposicao-diz-acm-neto-22466202NA NA NA
OGlobo https://oglobo.globo.com/ pt-br Aos 29 anos, morre no Rio o escritor Victor Heringer 2018-03-07 22:47:21 https://oglobo.globo.com/cultura/livros/aos-29-anos-morre-no-rio-escritor-victor-heringer-22466251 NA NA NA
OGlobo https://oglobo.globo.com/ pt-br Cuba deporta dois ex-presidentes e fecha portas a chefe da OEA 2018-03-07 22:40:59 https://oglobo.globo.com/mundo/cuba-deporta-dois-ex-presidentes-fecha-portas-chefe-da-oea-22466246 NA NA NA
OGlobo https://oglobo.globo.com/ pt-br Quatro grupos estão de olho na TAG, rede de gasodutos da Petrobras 2018-03-07 22:00:04 https://oglobo.globo.com/economia/quatro-grupos-estao-de-olho-na-tag-rede-de-gasodutos-da-petrobras-22466101 NA NA NA

Transformamos em formato Tidy:


In [34]:
df_texto <- feedall %>% 
    mutate(item = paste(feed_title,item_date_published)) %>%
    unnest_tokens(word,item_title) %>%
    count(item,word,sort = TRUE) %>%
    ungroup()

head(df_texto)


itemwordn
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 19:29:35de 6
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 01:34:00de 4
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 13:28:12de 4
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 18:59:58de 4
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 22:01:41de 4
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 00:02:26de 4

Note que há muitas palavras sem importância, como: artigos, preposições etc. São chamadas de "stop words" e somente atrapalham a análise. Vamos utilizar o Term Frequency / Inverse Document Frequency para separar as palavras por artigo que possuem maior peso. Vamos contar a quantidade de palavras e calcular a frequência.


In [35]:
contagem  <- df_texto %>%
    group_by(item) %>%
    summarize(total = sum(n))
head(contagem)


itemtotal
More Top Stories - Google News 2018-03-06 21:54:0014
More Top Stories - Google News 2018-03-07 12:51:3513
More Top Stories - Google News 2018-03-07 14:58:57 8
More Top Stories - Google News 2018-03-07 15:21:0015
More Top Stories - Google News 2018-03-07 16:02:10 9
More Top Stories - Google News 2018-03-07 18:15:0010

Agora, vamos juntar a quantidade de palavras ao ao arquivo original:


In [36]:
artigos <- left_join(df_texto,contagem)
head(artigos)


Joining, by = "item"
itemwordntotal
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 19:29:35de 6 30
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 01:34:00de 4 20
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 13:28:12de 4 28
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 18:59:58de 4 28
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 22:01:41de 4 24
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 00:02:26de 4 32

Temos uma lista descendente de ordem de relevância das palavras nos artigos:


In [37]:
df_final <- bind_tf_idf(artigos, word,item,n) 
df_final %>% arrange(desc(tf_idf))


itemwordntotaltfidftf_idf
More Top Stories - Google News 2018-03-06 21:54:00 ao 2 14 0.1428571 4.382027 0.6260038
OGlobo 2018-03-07 23:01:21 negocia 1 7 0.1428571 4.382027 0.6260038
OGlobo 2018-03-07 23:01:21 participação 1 7 0.1428571 4.382027 0.6260038
OGlobo 2018-03-07 23:01:21 utc 1 7 0.1428571 4.382027 0.6260038
OGlobo 2018-03-07 23:01:21 venda 1 7 0.1428571 4.382027 0.6260038
OGlobo 2018-03-07 23:01:21 viracorpos 1 7 0.1428571 4.382027 0.6260038
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 14:00:101.700 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 14:00:10árabe 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 14:00:10combatentes 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 14:00:10força 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 14:00:10mobiliza 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 00:16:00traz 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 15:29:00apresentador 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 15:29:00astro 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 15:29:00jornal 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 15:29:00maquiagem 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 15:29:00um 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 15:29:00vira 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 17:31:32femen 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 17:31:32impacto 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 17:31:32militantes 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 17:31:32mundial 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 17:31:32têm 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 17:31:32topless 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:06:00amor 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:06:00beijar 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:06:00encontrar 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:06:00lábios 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:06:00precisamos 2 16 0.1250000 4.382027 0.5477533
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:06:00quantos 2 16 0.1250000 4.382027 0.5477533
OGlobo 2018-03-07 22:31:42 de 2 14 0.14285714 0.644357 0.09205100
OGlobo 2018-03-07 23:01:21 de 1 7 0.14285714 0.644357 0.09205100
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 00:02:26de 4 32 0.12500000 0.644357 0.08054463
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 15:29:00de 2 16 0.12500000 0.644357 0.08054463
More Top Stories - Google News 2018-03-07 14:58:57 de 1 8 0.12500000 0.644357 0.08054463
OGlobo 2018-03-07 21:53:25 de 1 8 0.12500000 0.644357 0.08054463
OGlobo 2018-03-07 22:16:15 de 1 8 0.12500000 0.644357 0.08054463
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 00:10:00de 2 18 0.11111111 0.644357 0.07159522
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 15:28:00de 2 18 0.11111111 0.644357 0.07159522
More Top Stories - Google News 2018-03-07 21:02:00 de 1 9 0.11111111 0.644357 0.07159522
OGlobo 2018-03-07 22:07:50 de 1 9 0.11111111 0.644357 0.07159522
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 13:46:46de 2 20 0.10000000 0.644357 0.06443570
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 14:42:00de 2 20 0.10000000 0.644357 0.06443570
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 14:48:38de 2 20 0.10000000 0.644357 0.06443570
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 14:54:47de 2 20 0.10000000 0.644357 0.06443570
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:01:15de 2 20 0.10000000 0.644357 0.06443570
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:32:00de 2 20 0.10000000 0.644357 0.06443570
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 21:39:38de 2 20 0.10000000 0.644357 0.06443570
More Top Stories - Google News 2018-03-07 18:59:55 de 1 10 0.10000000 0.644357 0.06443570
More Top Stories - Google News 2018-03-07 21:43:56 de 1 10 0.10000000 0.644357 0.06443570
OGlobo 2018-03-07 22:34:51 de 1 10 0.10000000 0.644357 0.06443570
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-06 19:45:00de 2 22 0.09090909 0.644357 0.05857791
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 16:23:07de 2 22 0.09090909 0.644357 0.05857791
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 19:47:47de 2 22 0.09090909 0.644357 0.05857791
More Top Stories - Google News 2018-03-07 20:18:00 de 1 11 0.09090909 0.644357 0.05857791
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 10:00:00de 2 24 0.08333333 0.644357 0.05369642
More Top Stories - Google News 2018-03-06 21:54:00 de 1 14 0.07142857 0.644357 0.04602550
More Top Stories - Google News 2018-03-07 22:00:17 de 1 14 0.07142857 0.644357 0.04602550
More Top Stories - Google News 2018-03-07 22:14:52 de 1 14 0.07142857 0.644357 0.04602550
Notícias do Brasil e do Mundo - Yahoo Notícias 2018-03-07 17:33:52de 2 36 0.05555556 0.644357 0.03579761

Vamos plotar um gráfico de barras das palavras vs tf_idf:


In [74]:
words = df_final %>% 
    arrange(desc(tf_idf)) %>%
    filter(tf_idf > 0.50) %>%
    group_by(word) %>% 
    summarise(freq = sum(tf_idf)) %>% 
    arrange(desc(freq)) %>% top_n(15)

words = as.data.frame(words)
words
rownames(words) = words$word


Selecting by freq
wordfreq
ao 0.6260038
negocia 0.6260038
participação 0.6260038
utc 0.6260038
venda 0.6260038
viracorpos 0.6260038
1.700 0.5477533
amor 0.5477533
apresentador 0.5477533
árabe 0.5477533
assalto 0.5477533
astro 0.5477533
bbb18 0.5477533
beijar 0.5477533
combatentes 0.5477533
confira 0.5477533
descumprimento0.5477533
diligências 0.5477533
direito 0.5477533
dupla 0.5477533
encontrar 0.5477533
femen 0.5477533
força 0.5477533
impacto 0.5477533
indiciado 0.5477533
jornal 0.5477533
lábios 0.5477533
leblon 0.5477533
mahmoud 0.5477533
maquiagem 0.5477533
militantes 0.5477533
mobiliza 0.5477533
mundial 0.5477533
novas 0.5477533
pedir 0.5477533
planejava 0.5477533
precisamos 0.5477533
presa 0.5477533
quando 0.5477533
quantos 0.5477533
selfies 0.5477533
têm 0.5477533
tipifica 0.5477533
topless 0.5477533
traz 0.5477533
um 0.5477533
vira 0.5477533

E vamos plotar um gráfico:


In [78]:
words %>%
    mutate(word = factor(word, levels = rev(unique(word)))) %>%
    ggplot(aes(word,freq)) +
    geom_col(show.legend = FALSE) + 
    labs(x = NULL, y = "tf-idf") + 
    coord_flip()



In [ ]: