R文本挖掘:ggplot2绘制二元/三元组tf-idf图表标签异常问题
解决三元组tf-idf图表top_n筛选失效的问题
嘿,我懂你碰到的这个麻烦啦!当大量三元组的tf-idf分数完全相同时,top_n(10)确实会把所有分数等于第10名的条目都保留下来,这就导致图表里出现远超10个的内容——只有Negative组正常,说明它的同分情况少。下面给你几个实用的解决方案:
方法1:用slice_max()严格筛选前10个条目
top_n()的核心问题是会保留所有同分的条目,而slice_max()可以通过with_ties=FALSE参数直接去掉同分,只保留每组前10个最相关的三元组。修改后的代码如下:
Trigram_tibble %>% arrange(desc(tf_idf)) %>% mutate(trigram = factor(trigram, levels = rev(unique(trigram)))) %>% group_by(Box) %>% slice_max(tf_idf, n = 10, with_ties = FALSE) %>% # 替换top_n,关闭同分保留 ungroup %>% ggplot(aes(trigram, tf_idf, fill = Box)) + geom_col(show.legend = FALSE) + labs(x = NULL, y = "tf-idf") + facet_wrap(~Box, ncol = 2, scales = "free") + coord_flip()
这个方法最直接,能保证每个组只显示10个三元组,完全符合你的需求。
方法2:自定义排名筛选(灵活处理同分)
如果你想保留部分同分条目,但又不想显示太多,可以先给每个组内的条目按tf-idf排名,再筛选排名前10的:
Trigram_tibble %>% arrange(desc(tf_idf)) %>% mutate(trigram = factor(trigram, levels = rev(unique(trigram)))) %>% group_by(Box) %>% mutate(rank = dense_rank(desc(tf_idf))) %>% # 同分条目共享相同排名 filter(rank <= 10) %>% # 筛选排名前10的所有条目 ungroup %>% ggplot(aes(trigram, tf_idf, fill = Box)) + geom_col(show.legend = FALSE) + labs(x = NULL, y = "tf-idf") + facet_wrap(~Box, ncol = 2, scales = "free") + coord_flip()
如果还是觉得条目太多,可以把dense_rank()换成row_number(),它会给每个条目分配唯一的排名(即使同分也会按顺序取前10),不过这样会随机去掉一些同分的条目,取决于你的数据排序顺序。
先确认同分情况(可选)
你可以先检查每个组的tf-idf分数分布,看看是不是真的有大量同分:
Trigram_tibble %>% group_by(Box) %>% count(tf_idf, sort = TRUE)
这个代码会输出每个组里不同tf-idf分数的出现次数,帮你明确问题的根源。
内容的提问来源于stack exchange,提问作者Jennimh
相关产品推荐
相关产品推荐

