2017-09-19 3 views
0

Je suis nouveau sur R, et j'utilise widyr pour faire du text mining. J'ai utilisé avec succès les méthodes trouvées here pour obtenir une liste de mots co-occurrents dans chaque section de texte et leur coefficient phi.Puis-je combiner pairwise_cor et pairwise_count pour obtenir le coefficient phi ET le nombre d'occurrences pour chaque paire de mots?

Code comme suit:

word_cors <- review_words %>% 
    group_by(word) %>% 
    pairwise_cor(word, title, sort = TRUE) %>% 
    filter(correlation > .15) 

Je comprends que je peux générer une trame de données avec concomitantes mots et le nombre de fois où ils apparaissent, en utilisant le code comme:

word_pairs <- review_words %>% 
    pairwise_count(word, title, sort = TRUE) 

Qu'est-ce que J'ai besoin d'une table qui a à la fois le coefficient phi et le nombre d'occurrences pour chaque paire de mots. J'ai creusé dans pairwise_cor et pairwise_count, mais je n'arrive toujours pas à comprendre comment les combiner. Si je comprends bien, les jointures ne tiennent compte que d'une colonne pour la correspondance, donc je ne pouvais pas utiliser une jointure régulière de manière fiable car il peut y avoir plusieurs paires qui ont le même mot dans la colonne item1.

Est-ce possible avec widyr? Sinon, y a-t-il un autre paquet qui me permettra de faire cela?

Voici le code complet:

#Load packages 
pacman::p_load(XML, dplyr, stringr, rvest, httr, xml2, tidytext, tidyverse, widyr) 

#Load source material 
prod_reviews_df <- read_csv("SOURCE SPREADSHEET.csv") 

#Split into one word per row 
review_words <- prod_reviews_df %>% 
    unnest_tokens(word, comments, token = "words", format = "text", drop = FALSE) %>% 
    anti_join(stop_words, by = c("word" = "word")) 

#Find phi coefficient 
word_cors <- review_words %>% 
    group_by(word) %>% 
    pairwise_cor(word, title, sort = TRUE) %>% 
    filter(correlation > .15) 

#Write data to CSV 
write.csv(word_cors, "WORD CORRELATIONS.csv") 

Je veux ajouter pairwise_count, mais je dois aux côtés du coefficient phi.

Merci!

+0

Je suis confus parce que vous utilisez des données différentes pour les exemples, mais la question sonnait comme vous vouliez obtenir deux statistiques à partir des mêmes données. Pouvez-vous clarifier s'il vous plait? Les jointures ne sont pas limitées à une seule colonne bien que je suppose que cela dépend du paquet que vous utilisez. – Elin

+0

Salut Elin, désolé pour la confusion. Je n'utilise pas réellement la fonction pairwise_count dans mon code, donc je viens de copier et coller un exemple pairwise_count à partir des instructions que j'utilisais. Je veux l'ajouter à mon code, mais je veux seulement l'ajouter comme une colonne attachée aux paires de mots et au coefficient phi, que je reçois de la fonction pairwise_cor. Je ne peux pas comprendre comment faire cela et n'ai pas pu trouver d'instructions. Je vais modifier mon message pour plus de clarté. En outre, les jointures que je regardais proviennent de dplyr. Je vais regarder dans d'autres paquets. – ElizabethW

Répondre

0

Si vous obtenez en utilisant les principes de données propres et d'outils tidyverse, je suggère tout le chemin :) et en utilisant dplyr pour faire le se joindra à vous intéresse. Vous pouvez utiliser left_join pour relier les calculs de pairwise_cor() et pairwise_count() , et vous pouvez simplement passer de l'un à l'autre, si vous voulez.

library(dplyr) 
library(tidytext) 
library(janeaustenr) 
library(widyr) 

austen_section_words <- austen_books() %>% 
    filter(book == "Pride & Prejudice") %>% 
    mutate(section = row_number() %/% 10) %>% 
    filter(section > 0) %>% 
    unnest_tokens(word, text) %>% 
    filter(!word %in% stop_words$word) 

austen_section_words %>% 
    group_by(word) %>% 
    filter(n() >= 20) %>% 
    pairwise_cor(word, section, sort = TRUE) %>% 
    left_join(austen_section_words %>% 
       pairwise_count(word, section, sort = TRUE), 
      by = c("item1", "item2")) 

#> # A tibble: 154,842 x 4 
#>  item1  item2 correlation  n 
#>  <chr>  <chr>  <dbl> <dbl> 
#> 1 bourgh  de 0.9508501 29 
#> 2  de bourgh 0.9508501 29 
#> 3 pounds thousand 0.7005808 17 
#> 4 thousand pounds 0.7005808 17 
#> 5 william  sir 0.6644719 31 
#> 6  sir william 0.6644719 31 
#> 7 catherine  lady 0.6633048 82 
#> 8  lady catherine 0.6633048 82 
#> 9 forster colonel 0.6220950 27 
#> 10 colonel forster 0.6220950 27 
#> # ... with 154,832 more rows 
0

J'ai découvert et utilisé la fusion aujourd'hui, et il semble avoir utilisé les deux colonnes pertinentes pour fusionner les données. Je ne sais pas comment vérifier l'exactitude, mais je pense que cela a fonctionné.