前言

今天学了自然语言处理相关的内容,是用AI来写宋词。我觉得写的非常一般,但是该方法提供了一种思路,可借鉴一下,最后也会讲一下该方法的缺点。

主体思路

  1. 获取到大量宋词的数据集。

这里我们假设机器学习拿到了2千首宋词。

相思::王维::红豆生南国,春来发几枝。愿君多采撷,此物最相思。
贾生::李商隐::宣室求贤访逐臣,贾生才调更无伦。可怜夜半虚前席,不问苍生问鬼神。
... ...
  1. 提取出宋词的主体部分
红豆生南国,春来发几枝。愿君多采撷,此物最相思。
宣室求贤访逐臣,贾生才调更无伦。可怜夜半虚前席,不问苍生问鬼神。
...
  1. 把文字转换成数字,方便计算机处理深度学习

这一步内容多点,首先,我们把2千首宋词里所有出现过的字符,包括汉字、逗号和句号,组成一个词汇表。

第一首词《相思》也许会变成这种序列:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21, 22, 12]
其中 的对应关系深度学习

{
    1: 红
    2: 豆
    3: 生
    4: 南
    5: 国
    6: ,
    7: 春
    8: 来
    9: 发
    10: 几
    11: 枝
    12: 。
    13: 愿
    14: 君
    15: 多
    16: 采
    17: 撷
    6: ,
    18: 此
    19: 物
    20: 最
    21: 相
    22: 思
    12: 。
}
  1. 把序列处理为 字深度学习符串 和 标签的集合
1, 2
1, 2, 3
1, 2, 3, 4
1, 2, 3, 4, 5
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6, 7 
1, 2, 3, 4, 5, 6, 7, 8
1, 2, 3, 4, 5, 6, 7, 8, 9 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21, 22 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21, 22, 12
... (以上是第一首词的序列,)
... (第2-n首词的序列)

转换成这个序列是什么意思呢机器学习
我们最后是要得到一个比较“智能”的模型。这个模型能做什么事情呢?

假设序号给一个序号为1的汉字,模型可能会给出序号为2的字符。
我们表示为

1 -> 2

第一行和后面所有行的的含义:

1, 2 -> 3
1, 2, 3 -> 4
1, 2, 3, 4 ->  5
1, 2, 3, 4, 5 ->  6
1, 2, 3, 4, 5, 6 ->  7 
1, 2, 3, 4, 5, 6, 7 ->  8
1, 2, 3, 4, 5, 6, 7, 8 ->  9 
1, 2, 3, 4, 5, 6, 7, 8, 9 ->  10 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ->  11 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ->  12
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ->  13 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ->  14 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ->  15 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ->  16 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ->  17 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ->  6 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6 ->  19 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19 ->  20 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20 ->  21 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21 ->  22 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21, 22 ->  12

为了统计方便,我们会把所有深度学习的行深度学习,变成统一的长度,方便我们取最后一个列作为 标签label。深度学习

得到如下结果:


0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2 -> 3
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 -> 4
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4 ->  5
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5 ->  6
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6 ->  7 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7 ->  8
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8 ->  9 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ->  10 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ->  11 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ->  12
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ->  13 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ->  14 
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ->  15 
0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ->  16 
0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ->  17 
0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ->  6 
0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6 ->  19 
0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19 ->  20 
0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20 ->  21 
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21 ->  22 
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 19, 20, 21, 22 ->  12

这里我们大机器学习概可以看出一些规律,就是模型在给出指定的n个字符的情况下,会通过一定的规律,得到下一个字深度学习符,箭头后面的一个字符,就是模型给出的。

当然,也许并不机器学习一定都要从1 开始 也许我们还可以处理为:

1, 2 -> 3
2, 3 -> 4
...
n, m -> o
  1. 构建模型和训练模型

通过上述方法,已经对数据进行了预处理了,得到了相应的data 和 label。

模型学习到data 和 label 之间的关联。就可以通过给出的n个字符,得到下一个字符。

(个人感觉感觉是在统计字符出现的可能性。)

  1. 预测

最后机器学习,我们可以给模型开头的n个字符,让模型自己写完剩下的部分。

方法评价

通过序列进行预测的方法,用在了很多地方,但是感觉在很多场景都不完善。使用该方法来写宋词机器学习,本质上就是在统计字符出现的可能性。然后依次逐字写完剩下的部分。

个人感觉该方法的缺陷:

1,最后得到的结果,大都是看不太懂。相邻的字符生硬的拼凑在一起,可能都不组成正常的词语机器学习,就是单个字符强行前后拼接。

2,正因为是声音的拼接,写出来的诗词,看不出任何感情色彩,也无法表达深度学习出任何感情色彩。 在面对抽象的情深度学习感表达的时候深度学习机器学习很多时候也是束手无策的。

但是我们依然从中学到了一点点思深度学习路,就是把诗词处理为机器学习可以使用的数据集,把我们了解的机器学习或深度学习方法带入该场景中。

本文暂未给出任何代码,如果有同学对该方法感兴趣,可留言或私信机器学习,可提供详细代码。