前言
今天学了自然语言处理相关的内容,是用AI来写宋词。我觉得写的非常一般,但是该方法提供了一种思路,可借鉴一下,最后也会讲一下该方法的缺点。
主体思路
- 获取到大量宋词的数据集。
这里我们假设机器学习拿到了2千首宋词。
相思::王维::红豆生南国,春来发几枝。愿君多采撷,此物最相思。
贾生::李商隐::宣室求贤访逐臣,贾生才调更无伦。可怜夜半虚前席,不问苍生问鬼神。
... ...
- 提取出宋词的主体部分
红豆生南国,春来发几枝。愿君多采撷,此物最相思。
宣室求贤访逐臣,贾生才调更无伦。可怜夜半虚前席,不问苍生问鬼神。
...
- 把文字转换成数字,方便计算机处理深度学习。
这一步内容多点,首先,我们把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, 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
- 构建模型和训练模型
通过上述方法,已经对数据进行了预处理了,得到了相应的data 和 label。
模型学习到data 和 label 之间的关联。就可以通过给出的n个字符,得到下一个字符。
(个人感觉感觉是在统计字符出现的可能性。)
- 预测
最后机器学习,我们可以给模型开头的n个字符,让模型自己写完剩下的部分。
方法评价
通过序列进行预测的方法,用在了很多地方,但是感觉在很多场景都不完善。使用该方法来写宋词机器学习,本质上就是在统计字符出现的可能性。然后依次逐字写完剩下的部分。
个人感觉该方法的缺陷:
1,最后得到的结果,大都是看不太懂。相邻的字符生硬的拼凑在一起,可能都不组成正常的词语机器学习,就是单个字符强行前后拼接。
2,正因为是声音的拼接,写出来的诗词,看不出任何感情色彩,也无法表达深度学习出任何感情色彩。 在面对抽象的情深度学习感表达的时候深度学习,机器学习很多时候也是束手无策的。
但是我们依然从中学到了一点点思深度学习路,就是把诗词处理为机器学习可以使用的数据集,把我们了解的机器学习或深度学习方法带入该场景中。
本文暂未给出任何代码,如果有同学对该方法感兴趣,可留言或私信机器学习,可提供详细代码。