2017-07-24 66 views
2

我正在玩弄一些文本分析,并尝试使用逆文档频率(数值)显示每本书的顶部单词。我一直在跟随TidyText采矿,但使用哈利波特。使用重复因子绘制ggplot组的顺序

某些书籍之间的顶部词(使用IDF)是相同的(例如羽扇豆或拉环),并且在绘图时,顺序使用该词的最大IDF。例如,泥手是魔法石和死亡圣器中的关键词。它在死亡圣器中的价值为.0007,但只有.0002,但被命令为魔法石的最高价值。

ggplot output

hp.plot <- hp.words %>% 
    arrange(desc(tf_idf)) %>% 
    mutate(word = factor(word, levels = rev(unique(word)))) 

##For correct ordering of books 
hp.plot$book <- factor(hp.plot$book, levels = c('Sorcerer\'s Stone', 'Chamber of Secrets', 
               'Prisoner of Azkhaban', 'Goblet of Fire', 
               'Order of the Phoenix', 'Half-Blood Prince', 
               'Deathly Hallows')) 

hp.plot %>% 
    group_by(book) %>% 
    top_n(10) %>% 
    ungroup %>% 
    ggplot(aes(x=word, y=tf_idf, fill = book, group = book)) + 
    geom_col(show.legend = FALSE) + 
    labs(x = NULL, y = "tf-idf") + 
    facet_wrap(~book, scales = "free") + 
    coord_flip() 

而且here's数据框,供您参考的图像。

我试过预先分类,但似乎并没有工作。有任何想法吗?

编辑:CSV is here

回答

2

reorder()功能将由指定的变量重新排序的系数(参见?reorder)。

插入mutate(word = reorder(word, tf_idf))ungroup()之后在您的最后一个程序段绘图前应重新排序tf_idf。我没有你的数据样本,但使用janeaustenr包,这个不相同:

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

book_words <- austen_books() %>% 
    unnest_tokens(word, text) %>% 
    count(book, word, sort = TRUE) %>% 
    ungroup() 

total_words <- book_words %>% 
    group_by(book) %>% 
    summarize(total = sum(n)) 

book_words <- left_join(book_words, total_words) 

book_words <- book_words %>% 
    bind_tf_idf(word, book, n) 


library(ggplot2) 
book_words %>% 
    group_by(book) %>% 
    top_n(10) %>% 
    ungroup() %>% 
    mutate(word = reorder(word, tf_idf)) %>% 
    ggplot(aes(x = word, y = tf_idf, fill = book, group = book)) + 
    geom_col(show.legend = FALSE) + 
    labs(x = NULL, y = "tf-idf") + 
    facet_wrap(~book, scales = "free") + 
    coord_flip() 
+1

谢谢你给它看看。这个大问题是简·奥斯汀书中没有共同的词汇。你的解决方案似乎首先迫使它出现一个单词,但当下一次单词出现在列表中时,它就会出现在错误的地方。我附加了一个带有数据的csv以便与之一起使用。 – GeorgeR90

+0

啊,我现在看到问题了。我不确定如何为每个方面制定不同的因子顺序,但是如果您按书籍分割数据框,则可以使用此答案为每本书制作单独的图。 – jdb

+0

谢谢@jdb,知道搜索的实际语言让我找到一个可行的答案! – GeorgeR90

0

如果你想改变因子水平的顺序手动你可以尝试:

word = factor(word, levels = word[c(grep("griphook", word)[1], grep("quirrell", word)[1], ...)]); 

如果因子水平应该由tf_idf你可以使用下面的订购:

level_ordered =rep(0, l) 
for (i in 0: (l-1)) 
{ 
    level_ordered = c(level_ordered, grep(as.character((sort(tf_idf, partial=l-i)[l-i])), tf_idf)[1]) 
} 
word = factor(word, levels=word[level_ordered])