自然语言生成也是NLP中重要的一个方面,将来的计算机一定能够吟诗作对、写书画画,具有创造性,能够生成有创意的文化作品,让我们闭上眼一起来畅想一下美好的未来:在北京零下三十度的天气里,一层窗户玻璃之隔,好似天堂地狱之分,当此际,屋外滴水成冰,屋内温暖如春,你的机器姬望着屋外纷飞大雪,意兴大发,挥毫泼墨来幅浓墨重彩的中国风山水画,再即席赋诗一首题于其上,然后弹起了你心爱的土琵琶……..这该是怎样醉人的场景@^^@,到了那一天,很多三流诗人、作家、画家、书法家估计也得成为“供给侧改革”的牺牲品,时刻准备着下岗再就业。
理想虽美好,现实行路难。
让我们鼓起革命主义大无畏精神,在研发雷区里散步,科学血池中游泳,听起来挺骇人,但是我的意思是咱们脚踏实地一步一步来,今天的文章先讨论解决一个简单的问题:假设你给出一句汉语句子或者短语,怎么让机器自动生成和它语义相关的句子?如果有训练数据的话,很明显这是一盘小菜,可以通过训练模型来自动生成。但是假设你跟我一样一穷二白,没有训练数据,此时怎么做呢?俗话说:巧妇难为无米之炊。不过俗话也说了,在没有米的情况下不会修理汽车的厨师不是一个好算法工程师,今天咱们就介绍在缺盐少油的境况下怎么做出一道菜的具体方法。
在介绍这个我们拍脑袋拍出来的土鳖方法前,我想先问个问题:您觉得如果把下面这些句子喂给计算机,计算机会产生什么句子出来呢?
输入:“明天星期二”/计算机:“???”
输入:“小葱拌豆腐”/计算机:“???”
输入:“***访问沙特”/计算机:“???”
输入:“床前明月光”/计算机:“???”
输入:“中国台湾大选美国更紧张”/计算机:“???”
输入:“总编有千种风情更与谁人说”/估计计算机会边吐血边说:“先生,是总编还是纵便啊?麻烦你先回去重修下小学一年级!”
……………………………………………………
您完全可以脑洞大开,蹿天入地去想想如果是你看到这些句子,打算说一句语义相近的话会怎么说。本文后面会给出计算机产生的答案,您可以和您想的对比一下,看看是不是您的脑袋还不如计算机灵光,如果您想的句子还不如计算机的顺畅……..施主,往楼上走100米再左拐10米就是为您这种VIP专供的可以随心使用的天台。
下面介绍如何根据给定的句子自动生成一个语义接近的句子。
首先,把输入的汉语短语或者句子分词,这个一般是处理中文首先要做的事情,想必您也知道;
然后,对每个中文单词,找到和它语义接近的其它汉语单词。这步怎么做呢?我们可以用Word Embedding来做这个事。
如果用Word2Vec跑一遍训练数据,每个中文单词就可以得到对应的Word Embedding,这是一种低维度向量形式的单词表示,能够表征单词的部分语义及语法含义。
对于任意两个已经用WordEmbedding形式表示的单词,我们可以简单通过计算两个向量之间的Cosine相似性,就得出两个单词语义接近程度了。比如通过计算可以得出如下单词对的语义相似性:
Cosine(WE“中国台湾”,WE“中国香港”) =0.79
Cosine(WE“林志玲”,WE“舒淇”) =0.93
Cosine(WE“教练”,WE“领队”) =0.81
Cosine(WE“星期二”,WE“星期四”) =0.93
于是乎,对于输入句子的某个单词,我们可以从所有其它单词中找出和这个单词语义最接近的一部分单词,也就是Cosine得分最高的一批单词。
第三步,对某个单词W找出语义最接近的单词列表后对其进行过滤,过滤规则是:根据词性过滤,把这些单词中词性和W相同的留下来,不同的过滤掉。这步其实是很关键的,对于后面最终产生的句子语义一致性及可读性有很大影响。主要原因是,尽管理论上通过Word Embedding可以找到语义相似的其它单词,但是其实还是有不少看上去不合理的内容,这是Word Embedding本身产生方式决定的,没有办法,增加合理的过滤措施能够极大改善句子生成质量,而根据词性过滤就是一个简单易行效果也不错的小Trick。
接下来,通过上述办法,输入句子中的每个单词都找出了对应的语义接近且词性相同的单词列表。下面机器该真正地生成句子了。
假设输入句子包含三个单词“W1 W2 W3”,W1找出了10个语义接近的单词,W2找出了8个,W3找出了10个,那么对这些单词按W1W2 W3原始顺序进行排列组合,那么会有10*8*10=800个可能的组合。这些组合就是根据“W1 W2 W3”生成的各种语义可能句子的所有句子语义空间。
此时,我们需要一种度量标准来对这些句子进行打分,给出看上去最合理的句子作为输出结果。那么度量标准选什么呢?可以用语言模型来做这个事情。语言模型本质上是衡量一个句子表达流畅性的技术工具,就是说给了一句话,语言模型可以判断这句话是像人话还是像鬼话,如果越像人话,那么语言模型给这个句子的打分越高。语言模型是NLP中非常广泛使用的工具,比如机器翻译、语音识别、输入法等等都是必需要用语言模型来评估句子流畅性的。例如通过语言模型给下面两个句子打分,就可以判断出哪个句子读起来更合理:
LanguageModel(“我最喜欢看知音杂志”)>LanguageModel(“我喜欢最知音看杂志”)
在实际做的时候,我们通过LSTM模型训练出语言模型,然后用来判断各种排列组合出的句子哪些更合理,选择得分最高的一部分输出作为最终的句子产生结果。当然,从上面例子可以看出,如果输入句子比较长的话,产生的单词组合空间是非常非常巨大的,对每个句子依次进行语言模型运算速度会非常慢,此时可以引入类似Beam Search的思路来大幅提升计算速度。
经过上述几个步骤,给定一个输入句子,机器就能产生跟这个句子语义接近的中文句子了。
|举栗说明
上面的解释过程已经够好理解的了吧,不过为了照顾小部分读者的理解力,下面给个具体例子来说明:
假设你打一岁起就深深喜爱着林志玲,于是情不自禁地对着计算机输入了你喜欢她的理由:“林志玲嗲声嗲气”。并期待着计算机和你发出同样的心声,你这个期待不过分,因为我们说过了,我们制造这个机器就是让它说和你类似的话的。
机器看到你输入的句子,斜着眼看了看你,对输入句子分词,得到:
“林志玲 嗲声嗲气”
第二步,根据Word Embedding的语义相似性,它找出和这两个单词语义最接近的单词,并经过同词性的词性过滤,产生的结果如下,后面那些数值是两个单词Word Embedding的真实Cosine相似性分值:
第四步,机器对各种组合进行语言模型评估,按照语言模型打分进行排序,输出得分最高的5个生成句子结果是:
这就是机器对你的暗表心声的回答。有人问了:为什么Top结果里面没有出现“张雨绮或者舒淇童心未泯”这种说法呢?要记住这是机器它老人家使用语言模型通过大量训练数据得出的铁一般的结论,套上目前流行到令人作呕的大数据分析的思路,您可以深入思考一下具体原因,也许您的最终结论是:贵圈真乱,社会现实真是令人痛心疾首@^^ @。
这就是输入一个汉语句子,利用Word Embedding生成语义相近句子的整个过程。其实这从思路上跟拼音输入法的做法思路是一脉相承的,区别无非是拼音输入法是从拼音找到汉字然后套上语言模型输出,而这个方法是通过单词的Word Embedding找到语义相关的单词而已。
通过上述方法生成的句子一般来说语义相关性和可读性还是不错的。这主要得益于:首先通过单词Word Embedding加上词性过滤找到和输入单词语义相关的单词,这在一定程度上保证了生成的句子在语义上是接近于输入句子的;另外,语言模型在一定程度上保证了生成句子的可读性;再者,因为输出的句子是参照输入句子一个单词一个单词产生的,而每个单词又有一定的语义相似性保证,因为输入句子是人输入的,本身就具有语义一致性,所以产生的句子在语义一致性方面其实也可以保证一定的质量。
当然也有一定比例的输出句子语义性和可读性都比较差,我觉得这主要还是Word Embedding阶段产生的语义相关单词质量不高导致的,如果这个阶段能够保证单词质量,理论上产生的句子质量应该是比较高的,原因就是上面说的三点。
|更多的真的栗子
下面给出一些例子,可以通过这些例子看看目前这种做法的实际效果,首先来一些看上去还不错的例子,短的开胃菜开路:
再来些长点的大餐:
可以看出无论是语言的流畅性可读性和语义一致性都还是不错的。
如果我们Bigger高些,耍点文艺腔,那么计算机会怎么喷你一脸呢:
好像计算机也随你,挺文艺的,不是吗?@^^@
您开始想的答案和机器比如何呢?比它好?恭喜您,至少您有1岁儿童的智商。不如?天台位置不用我再给您指出来了吧?
不能光捡些好听的说,下面是一些效果不好的例子:
我觉得主要问题是根据WordEmbedding寻找语义相近单词比较糟糕导致的,如果Word Embedding质量能够大幅提高,这个问题能够大大缓解。