在进行文字处理的时候,通常会把文字转换成一个文字字典,即给字典里面的每一个字一个编号,而整篇文章,就都用这些编号表示。例如,12,34等等。

而通常,我们不能直接用这些数字进行AI学习的,我们要把这些东西变成热编码。什么是热编码呢?比如,有10个数,那么就有一个长度为10的向量,向量中第几个元素不为0,就表示这是第几个数,如上述,10个数,分别是1,2,3....那么转换成热编码就是:

1,0,0,0,0,0,0,0,0,0

0,1,0,0,0,0,0,0,0,0

0,0,1,0,0,0,0,0,0,0

热编码计算实际上会带来一个问题,就是计算量过于庞大,想想,我们通常的文字编码可不仅仅是10,如果一篇文章,出现的字符数量5千,那么转换成热编码,那就是一个长度为5k的一个矩阵,这个实在太消耗性能了。而我们仔细观察一下这个矩阵就会发现,其实如果只有一个是1,其他是0,其进行矩阵计算的时候,实际是一个数组选择:

而,这就是embedding的原理。这种特殊的矩阵乘法,变成一个矩阵下标选择。

在本例中,我们用embedding实现word2vec。word2vec又是另外一个很有意思的功能。意思是,根据一篇文章,将文字中出现的词语进行向量化。而根据向量化的结果,是很容易看出向量相同,即方向相同的词,他们其实是一类词。这个在语义处理中有着重要的作用,好了,直接看代码。(注意,这个例子是一篇英文文章,中英文文字处理的话,是有区别的)

先定义一个函数,将文本的符号进行替换,然后,拆分出一个一个的词,然后将低频词去掉。返回的是一个词数组。

这个是一个很典型的词字段处理,输出的是词-序号,以及反向的序号-词字典。

然后,整理出正向,逆向,两个字典,和一个字典序列化后的文章int_words

接着,对于英文,有很多the等助词,这些词实际上对向量分析是没有意义的,也需要过滤掉。过滤这个的原理是依据一个公式:

t是常量,f(wi)是这个词在文章中出现的频率。代码如下:

好,到目前为止,我们对原始的输入进行一些处理。

下面就开始进一步整理数据,首先我们每输入一个词,他的学习目标是什么呢?

我们用一个滑动窗口的方法,即每一个输入词,和这个词间隔一个数以内的其他词全是的他的目标。代码如下:

目标定好了,下面我们设定一下,每次学习的批量数:

一切就绪,下面开始建立模型:

这是输入输出,然后进行embeding计算

这个用tensorflow以采样方式,直接进行计算,函数tf.nn.sample_softmax_loss的定义如下:

接着,开始训练:

这就是大致的代码,这个代码计算后的向量,将其打印出来,会发现一些向量化后的词语,近义词的话,其向量的方向也是相近的,很有意思。

相关文章