光阴似箭,日月如梭,又到了我写DevBlog的时辰了。由于周更平常又忙,zed上周就在挣扎不知道该写啥,还羡慕我说我这周可以写写GDC的见闻,我就嗯了一声。但实际上,作为一个有料的男人,我是不虚的,所以GDC见闻留给他,这次我要跟大家说我们怪物的随机名字生成器。
由于我是个简单的人,不擅长文化人的套路词汇,自己看专业的专有名词都会犯晕,所以在信息理论里头如果我用词粗鄙了,请各位专业的哥哥姐姐们轻轻地喷。
那么这个玩意儿原理很简单,是这样的,假如我训练数据里头有四个名字"topdog"和"toto","toby"和"snoopy",那么通过统计就可以知道
to出现了3次,to后面一个字母有一次出现了p(topdog),有一次出现了t(toto)有一次出现了b(toby)。
那么假如我名字开头随机出来是to,并且随机接的是p得到top,那么我就可以查表找op后头有可能接d或者y,假如接的是y,那就得到topy这个新的名字。
假如我名字开头随机出来是sn, 那就有可能出现sn->sno->snop->snopd->snopdo->snopdog这个新的名字。
刚刚说的是最基础的markovchain的原理,他当然有很明显的缺陷。刚刚我选择每2个字母为一组做一个表,如果选择每1个字母为一组做的表,那么随机出来的名字就会变得过度随机,但是如果每3个字母随机一次,那么就会出现数据不足的问题,导致无法生成新的高质量的名字。
另外由于数据的限制,生成的数据缺少不确定性,比方to后面永远不会接r。
另外如何判断起点和终点如果不作判断就会出现tototototo这样的名字。
那么解决这些个问题的方法是:
1.储存3个字母2个字母1个字母生成的表,如果3个字母的表找不到对象,那就查找2个字母的表,不然就查找1个字母的表。
2.给每个样本增加一定常量这样to后面就会出现2次p,2次t,2次b,和各1次的acdefg...
3.起点和终点都加入等字母表数量的特殊的符号,比方两个字母的表就可以是"&&topdog%%","**toto%%"
这样我就把咱们的随机名字生成的机制给讲完了,是不是很简单,很好理解?我记得我第一次看懂这原理的瞬间反应是。卧槽,人类真他妈的聪明,我要好好学习天天向上。
当然,虽然说了那么多显得我那么屌,然而我却并没有实现它,因为我无情地在Github里头找到已经有大兄弟用C#实现了一遍的MarkovChain RandomNameGenerator,我就一声谢谢也没说地把他下载了放进了工程里,嘻嘻。在此由衷地感谢一下Maurits Elbers以及Sam Twidale大大。
不知道大家会不会看到一个小学生式的开头后就点了窗口的叉叉,看到语言匮乏的自己只能有卧槽和好好学习天天向上来表达自己的感情觉得很羞愧,如果我的日常用语和你们这些文化人的日常用语分别装进训练数据里头。我的样本应该只会有“我操”,“操了”,“日了狗了”,结果生成的最多也就新生成一个“我操了狗了”。但你们的应该是祖国的大好河山,璀璨美丽的世界,啊,我操了狗了,编不下去了,我还是得多读些书,能推荐些快速提升修养的书吗?希望这篇又能承上启下打个满分,再次谢谢各位观众老爷们。
C# Implementation of MarkovChainNameGenerator
https://github.com/MagicMau/ProceduralNameGenerator
Original Haxe Implementation of MarkovChainNameGenerator
https://github.com/Tw1ddle/MarkovNameGenerator
MarkovChain Visual Explanation
http://setosa.io/blog/2014/07/26/markov-chains/index.html
Names from a high order Markov Process and a simplified Katz back-off scheme
============================================================
如果您对Monster Farm的后续信息和更新感兴趣,欢迎关注我们的微博:
@Hi_MoE嗨盟游戏组
或我们的专栏:纽大游戏故事 知乎专栏
进入Hi-MoE游戏组 | indienova 独立游戏 Hi_Moe小组,注册后也可以讨论或直接和我们互动。
暂无关于此日志的评论。