[关闭]
@agpwhy 2022-03-07T12:20:22.000000Z 字数 2234 阅读 217

王胖的生信笔记第39期-关于Wordle

最近大家可能都玩过汉兜(https://handle.antfu.me/,没玩过的赶紧试试,真的好玩)。这个游戏是从Wordle来的,不过原版猜测次数是六次,而且规则因为是英语稍有不同。设计这个游戏的公司已经估值超过十亿刀乐了。

今天就来简单试一下分析Wordle的一些数据,使用的是Rview上的教程。稍微改了一些地方。

https://rviews.rstudio.com/2022/02/21/wordle-data-analysis/

配置环境+获取数据

  1. library(httr)
  2. library(dplyr)
  3. library(stringr)
  4. library(ggplot2)
  5. library(ggthemes)
  6. library(scales)
  7. library(tidyr)
  8. url = "https://www.nytimes.com/games/wordle/main.18637ca1.js"
  9. wordle_script_text = GET(url) %>%
  10. content(as = "text", encoding = "UTF-8")

这是nyt上面出Wordle题的函数。里面内容很多,我们需要的数据是五个字母的单词(为啥我觉得这里可以埋个五字不行的梗)。就需要使用stringr里面的函数进行拆分提取。

  1. word_list = substr(
  2. wordle_script_text, # 里面第一个五个字母词语是cigar;最后一个是shave
  3. str_locate(wordle_script_text, "cigar")[,"start"],
  4. str_locate(wordle_script_text, "shave")[,"end"]) %>%
  5. str_remove_all("\"") %>%
  6. str_split(",") %>%
  7. data.frame() %>%
  8. select(word = 1) %>%
  9. mutate(word = toupper(word)) # 去除\ 保证每个词语独立,同时转化为大写

反正一共两千多个词语。

统计字母频率

  1. letter_list = word_list %>%
  2. as.character() %>%
  3. str_split("") %>%
  4. data.frame() %>%
  5. filter(row_number() != 1) %>%
  6. select(letter = 1) %>%
  7. filter(letter %in% LETTERS) %>%
  8. group_by(letter) %>%
  9. summarize(freq = n()) %>%
  10. arrange(desc(freq))

这里是把两千多个词语全部拆成字幕,统计字母频率.

filter(row_number() != 1)这一步是因为走到那里会有个多出来的c(为啥会有可以去思考一下),不是原来2309个词语里的。

统计出来的词频是这样的

image-20220228231410434

这和英语语料里的字母词频并不完全对应(取样问题)

![image-20220228231508864](/Users/wangshengming/Library/Application Support/typora-user-images/image-20220228231508864.png)

(来源于https://en.wikipedia.org/wiki/Letter_frequency

可视化一下

  1. ggplot(letter_list, aes(
  2. x = reorder(letter, (-freq)),
  3. y = freq,
  4. fill = reorder(letter, (-freq))
  5. )) +
  6. geom_bar(stat = "identity") +
  7. scale_fill_manual(values = mycolors)+
  8. geom_text(aes(x = reorder(letter, (-freq)),
  9. y = freq,
  10. label = comma(freq, accuracy = 1),
  11. vjust = 1),
  12. size = 2) +
  13. scale_y_continuous(labels = comma,
  14. expand = c(0,0)) +
  15. theme_clean() +
  16. xlab("Letter") +
  17. ylab("Frequency") +
  18. labs(caption = "Modified by WangPang\nshengmingwangjat@qq.com") +
  19. ggtitle("Letter Frequency in Wordle's Official Word List")+theme(legend.position="none")

3

这里前面配色不会的可以发邮件or私信交流呀。

进一步统计各个位置的字母频率

  1. ordered_letter_list = word_list %>%
  2. separate(word,
  3. sep = "",
  4. into = as.character(1:6)) %>%
  5. select(-1,
  6. "l_1" = 2,
  7. "l_2" = 3,
  8. "l_3" = 4,
  9. "l_4" = 5,
  10. "l_5" = 6)

可以思考一下为啥要在select那里去掉第一个。

  1. build_df = function(df, col_name) {
  2. new_df = df %>%
  3. group_by(letter = eval(sym(col_name))) %>%
  4. summarize(freq = n()) %>%
  5. arrange(desc(freq))
  6. return(new_df)
  7. }

利用这个函数可以拆分各个位置字母的数据。

然后写个循环批量输出图

Letter_1

Letter_3

Letter_4

极简打分法

这一次先写到这?下次介绍一下极简的打分方法。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注