前言:
我们先看四首诗,这里面,两首是唐诗人元稹的作品,两首是作诗机的作品。你能看得出来吗?
七绝《清明》
对镜空嗟白发新,微吟还唤梦中人。
登楼入望青山旧,隔断红尘二十春。
五律《清明》
清明来向晚,山渌正光华。
杨柳先飞絮,梧桐续放花。
鴽声知化鼠,虹影指天涯。
已识风云意,宁愁雨谷赊。
七绝《寒食》
今年寒食好风流,此日一家同出游。
碧水青山无限思,莫将心道是涪州。
五律《寒食》
伤心曾失所,君子欲何归?
瑶草诚难补,黄花孰可依。
愁侵灯自照,老去叶初飞。
世事同为客,青山对拂衣。
笔者在17年前(2000年)在自己的个人网站上用“稻香老农”的网名发布了第一代算法的作诗机产品,是国内第一款机器合成诗词的软件,至今已经被使用超过2亿次。
2017年初,采用第二代算法的作诗机发布在公众号“作诗机”上。上面四首中的其中两首,就是采用第二代算法机器直接输入题目进行机器合成的。
公众号“作诗机”有两个功能板块:
1、超级词汇:提供字、词汇的各种属性、关联查询。
2、智能创作:自动作诗,填词。
使用第三代算法的软件正在调试,预计年内发布。
我这里尽可能用最通俗的语言剖析一下作诗机的第二代算法。网上时常见到一些大学、科研机构研究的机器合成算法,遗传算法、精英策略、轮盘赌算法等等……写得很深奥,其实说白了,都差不多一个意思。
机器作诗的三个步骤
总的来说,二代算法的作诗机写一首诗,经历了三个步骤:
第一步、事先让机器学习约50万首律诗和绝句,形成几个能表现“题目”,“句子”和“词汇”三者关系的数据库。
第二步、根据题目,用和题目相关的词汇形成每个句子的第一个词汇,然后再形成每个句子,然后机器先合成出一首原型诗。
第三步、即时根据格律要求、词汇间关系的紧密程度,优化原型诗,直到符合格律或达到设定的优化次数,最后输出。
壹、步骤一:机器学习了什么?
举个例子,机器学习李白的《望庐山瀑布》:
日照香炉生紫烟,遥看瀑布挂前川。
飞流直下三千尺,疑是银河落九天。
1、首先是分词(把句子分割成词汇),一个是题目需要分词,一个内容需要分词。
(1)题目通过算法可以分为:望/庐山/瀑布。其中庐山和瀑布都是专用名词。机器会认为这首的主题有可能是“庐山”或者“瀑布”。
但到底是“庐山”还是“瀑布”呢?这又是另外一个预先就要先计算好的课题:
我们可以把这首诗里的词汇取出来,再去匹配其他诗词,如果发现在一定的适配度下,以哪个词为题的诗词更多,我们就会认为这首诗的主题哪个词。(当然,通过计算,我们的结果是:这首诗的主题是“瀑布”而不是“庐山”)。
(2)然后就是内容分词,诗内容很容易,就2-2-2-1或2-2-1-2不外乎这两种。
Tips:词如何分词?词的分词则麻烦一些,词有几十个词牌有领字(也叫一字逗、一字领),可以先根据词谱来分词。然后再用常规的分词技术,常见有领字的词牌有《沁园春》等三十几个词牌(见文末的附录)。
例诗内容分词后的效果:
日照/香炉/生/紫烟,遥看/瀑布/挂/前川。
飞流/直下/三千/尺,疑是/银河/落/九天。
2、分词完,我们要形成三种数据:
推荐词数据库:词汇之间前后关系的数据库。
共现词库:能表现题目和词汇关系的数据库。
对词库:对仗词数据库。
(1)推荐词数据库:把几十万首诗过一遍,去掉重复的,我们会得到大约120万组“前后推荐词”,什么叫“推荐词”?
这一首里:“日照”是“香炉”的前推荐词。“香炉”则是“日照”的后推荐词。推荐词数据库不只预示词汇间的前后关系,更重要的是,预示词汇间“有没有关系”。如果有很多诗词句子里都有日照和香炉,不管先后,我们可以理解为日照和香炉“很有关系”,由于古诗词的特殊性,大多数词汇前后关系不重要,可以互为推荐词。
(2)共现词库:什么叫共现词?
在一种主题的中,共同出现的词汇。
李白这首《望庐山瀑布》,题目我们通过机器分词,然后用词性筛选,我们得到主题:“瀑布”。
我们已经事先通过另一个机器学习程序,把数十万首诗词做了分类,比如瀑布,我们得到大约有三四百首以瀑布为主题的诗词。这几百首诗里经常共同出现的词汇,我把他它们叫共现词。
比如经常在瀑布这个主题里出现的词汇(共现词)大致是:峰前、银河、飞泉、清谷、壁山、烟霞……
体会下,这些词汇是不是和“瀑布”关系密切?
(3)对仗词库:我们知道律诗中间两联需要对仗,所以,机器在学习形成前两个库的同时,从中间两联同时获得了对词,大约得到100万组不重复的对词。
对词哪个对子重复最多,猜猜?居然是“天上”对“人间”,北京那家夜总会起名字人莫非研究过?
Tips:对仗词只是诗里有吗?不是,不少词里也有。有些词牌某两句会推荐使用对仗句(如《浣溪沙》),或者某个一字逗后面推荐使用几组对仗句(如《满江红》)。
词里的对仗句也出了很多名句,如“无可奈何花落去,似曾相识燕归来。”,又如“自在飞花轻似梦,无边丝雨细如愁。”
推荐使用对仗的词牌有十几个,见文后附录。我不知道这里用“词牌推荐使用”是否合适,也可能是某人用对仗出了名句,大家就跟着学了,而后就成了惯例。
有一点提醒,从词里获得的对仗词,往往无法用在诗里面。因为律诗里获得的对仗词,平仄也是相对的,而词里则未必,因为词诗根据词谱填的。
3、这三个数据库都可以使用超级词汇工具查询:
以瀑布为例:
这里,“走得近”的词就是我上面说的共现词。
贰、步骤二:根据题目机器合成出一首原型诗。
这个里有三个问题要解决:
怎么根据题目获取和题目相关的词汇。
怎么根据词汇形成句子。
律诗怎么处理。
1、从用户的题目获取词汇:从上面的共现词库获取。
如上面说到的“瀑布”,我们已经从三四百首瀑布里获得了瀑布的共现词:
瀑布:飞流、银河、飞泉、清谷、壁山、烟霞……
仔细看看,是否这些词汇放在写“瀑布”的诗里意思还是合适的?
这里我们选四个分配给四个句子。每个句子就有了一个共现词。
2、如何让词汇形成句子:从前后推荐词库里获得,我还还是以瀑布为例:
在公众号超级词汇里,查找瀑布,我们看到:
荷花的前推荐词为:千寻、奔腾、倒悬、飞来、窗前……
荷花的后推荐词为:半空落、出空微、穿危石、挂峰头、飞晴雨……
这个时候,哪怕闭上眼睛,随便把“前推荐词” “瀑布” “后推荐词”,一组合,都是连贯的句子:
千寻瀑布半空落
飞来瀑布出空微
倒悬瀑布挂峰头
窗前瀑布飞晴雨
3、律诗的合成。绝句中间加上两联,就是律诗,分别用对词库。
Tips:其实,在我的软件里,不管你选择什么体裁,软件都是写一首七言律诗,然后裁剪成你要体裁。
五律:七律砍掉前两字,就是五律。
七绝:“绝”本来就是“截”的意思,七律砍掉任意连续的两联就是七绝。
五绝:七绝砍掉前两字,就是五绝。
4、到了这一步结束,我们已经把词汇都填进去了:
通过用户的题目,为每一句分配了一个共现词。(这也确定了整首诗的大致意思)
把每一句的共现词,用“前推荐词” 共现词 “后推荐词”已经写好了句子。(这里确保了每个句子的连贯性)
只是:平仄还没有考虑,押韵还没有考虑。后面第三步会说明如何交叉、优化和收敛到符合格律、符合押韵。
Tips:诗的平仄还好,就平仄。词就麻烦很多,不少地方不止是要求仄,还要求是仄里的去声或者入声。
正如李清照在《词论》中提出“盖诗文分平侧,而歌词分五音,又分五声,又分六律,又分清浊轻重。”
但从技术的角度来说,由于作诗机诗按平水韵,平水韵有106个韵部(特别是有些窄韵、险韵和哑韵,可选词汇很少);词按词林正韵,有19个韵部。就从这点来说,诗可选的词汇限制多很多。
叁、最后一个步骤:优化和输出。
这个时候,只要从四个共现词(绝句为例)中,以格律为约束条件,通过交叉和迭代,收敛到同一个韵部就可以了。
交叉、迭代技术性比较强,这里就不详细解释了,总之,目的就是优化。
二代算法为了保证趣味性,比如每次都要形成不同的诗词,不能优化到最佳值,否则最佳值只有一个,那就没有趣味性了。二代算法只优化到符合格律(平仄、押韵)为止,把更多的选择用候选句的形式提供给使用者。
理论上,给机器足够的时间进行足够的交叉迭代,机器是可以写出很中规中矩的诗词来的。
Tips:词的自动生成:
词除了平仄押韵外,还有一些特殊的格式。仅叠句就很多,举一些名句:
叠一字的如:陆游《钗头凤》“一怀愁绪,几年离索。错!错!错!”
叠两字的如:李清照《如梦令》“争渡,争渡,惊奇一滩鸥鹭。”
叠三字的如:李白《忆秦娥》“秦娥梦断秦楼月。秦楼月,”
叠四字的如:辛弃疾《丑奴儿》:“爱上层楼。爱上层楼,”
叠五字的如:辛弃疾《东坡引》:“罗衣宽一半,罗衣宽一半”
叠六字的如:贺铸《琴调相思引》“动管色,催行色;动管色,催行色;”
最为特殊的,当属《调笑令》(也叫古调笑、宫中调笑、调啸词、转应曲)。
我们看一个唐诗人戴叔伦的《转应曲》:
边草,边草,(仄韵一)
边草尽来兵老。(仄韵一)
山南山北雪晴。(转平韵)
千里万里月明。(平韵)
明月,明月,(前句最后两个字反转)(反转后转仄韵二)
胡笳一声愁绝(仄韵二)
说明:“明月”处是将上句的最后两个字“月明”翻转二来。最后一句则和翻转后的“月“押韵。所以,这首词短短几句,有三个韵。
肆、效果测试:
只需输入标题,比如我们输入“天涯”:
七绝《天涯》作诗机
千里迢迢返故庐,平生寂寞故人疏。
江山不见莺花老,落日相逢岁又除。
Tips:作诗机的作品,点击其中一句,候选句会提供无穷无尽的同一个格律的候选句。每次点击出10句,总可以挑选到合适的。
伍、三代算法和二代算法:
可以简单这么理解:
二代算法:使用了唐宋诗人数千人大众的基因。
三代算法:让李白娶李清照,取两个“精英”结婚后的基因。
希望届时能给大家带来更大的惊喜。
附录一:含有领字格的词牌:
|沁园春|寿星明|
|水龙吟|龙吟曲|庄椿岁|小楼连苑|
|摸鱼儿|摸鱼子|买陂塘|迈陂塘|双蕖怨|
|齐天乐|台城路|五福降中天|如此江山|
|洞仙歌|
|行香子|
|八声甘州|
|醉太平|
|忆旧游|
|兰陵王|
|二郎神|
|法曲献仙音|
|长亭怨慢|
|绛都春|
|莺啼序|
|金人捧露盘|铜人捧露盘引|上西平|西平曲|
|暗香|红情|
|双双燕|
|望远行|
|酷相思|
|黄莺儿|
|翠楼吟|
|八六子|
|忆少年|十二时|
|眉妩|百宜娇|
|六丑|
附录二:词谱里有推荐使用对仗句子的词牌有
|浣溪沙|摊破浣溪沙|山花子|
|鹧鸪天|思佳客|
|水调歌头|
|沁园春|寿星明|
|西江月|步虚词|江月令|
|踏莎行|转调踏莎行|
|南歌子|南柯子|风蝶令|
|忆江南|望江南|梦江南|江南好|
|望海潮|
|渔歌子|
|金人捧露盘|铜人捧露盘引|上西平|西平曲|
|八六子|
联系客服