感觉字典是一个很有意思的存在,因为字典中的每个字都可以由其他字解释,字与字之间相互定义了彼此。
一个字的规范性含义以及标准用法,取决于它和字典中其他字之间的关系,是由其他字所规定的。
可以将字典中字的关系用网络图的形式表示出来:
例如,“嘼”字的字典解释为“犬龇牙咧嘴貌”,那么就可以构建从犬、龇、牙、咧、嘴、貌这六个字分别到“嘼”字的有向边。只需要遍历字典中每个字及其解释,就可以获得所有字之间的关系。
代码及数据:
字典数据源:https://github.com/pwxcoo/chinese-xinhua/blob/master/data/word.json
library(rjson)
library(tidyverse)
library(tidygraph)
dat_json <- fromJSON(file = "word.json")
dat_tidy <- map_dfr(dat_json, ~list(word = .$word, explanation = .$explanation))
dat_tidy <- dat_tidy %>%
# 剔除非中文字符
mutate(explanation = gsub("[^\u4e00-\u9fa5]+", "" ,x = explanation),
# 将字符串打散成向量
explanation = str_extract_all(explanation, "\\w"),
# 删除重复字
explanation = map(explanation, ~unique(.))) %>%
rename(to = word, from = explanation) %>%
unnest(from) %>%
filter(from != to)
# 构建有向网络
g <- as_tbl_graph(dat_tidy, directed = T)
# 导出csv文件,方便导入Gephi作图
g %>%
activate(nodes) %>%
as_tibble() %>%
mutate(id = row_number()) %>%
select(id, name) %>%
rename(ID = id, Label = name) %>%
write_csv(file = "nodes.csv")
g %>%
activate(edges) %>%
as_tibble() %>%
rename(Source = from, Target = to) %>%
write_csv(file = "edges.csv")
通过Gephi绘制的网络图如下:
最后求助一个问题:
如果我想知道,至少知道几个字的含义及用法,才能了解字典中所有字的含义,有没有类似算法可以提供?
例如,还是以“嘼”字为例,要想了解它的含义,我至少得知道“犬龇牙咧嘴貌”六个字的含义,而这六个字分别又有各自的解释,以此类推……
进一步说,需要哪些字作为起始,才能沿着有向边的方向“到达”(理解)字典中所有的字?