使用N-Gram计算词距离的方法一共两种:

    • 使用公共子串的方法
    • 使用emdedding也就是词嵌入的方法

    N-Gram也被叫做N元模型,我更感觉像是文本上的卷积窗
    它的理论就是一个单词的语义和前面的其他单词有关系,也就是词语的含义取决于前文所处的语境
    感觉语境信息应该没有被充分利用
    共现分布矩阵:解释
    就是在N元窗口内,两个词同时出现的次数

    对共现矩阵进行行归一化用以体现一篇文档中两个词汇之间的相对关联性的强弱,
    共现矩阵是N*N的二维矩阵,
    可以得知共现矩阵明显是一个稀疏的,可以使用PAC算法对这样一个矩阵进行降维处理,这里面PAC
    很大程度上可以视作是一种使用映射方法的编码器,能够使得词汇关系得到更好的表现形式

    • 奇异值分解SVD对非方矩阵进行分解,保留奇异值较高的向量,能够提高表示向量的信息密度


    得到每一个词的向量表示后可以使用海明距离进行词距离的度量(这里是否能够用余弦相似度来进行相似度计算),
    因为使用PAC 处理过后,各个特征的维度基本上是一个正交基空间
    for (String sen: sentence){
    String [] words = sen.split(“ “);
    for (int i =0; iwordMap[function.changeWord2Index(word[i])]=wordIndex;
    if (i>0){
    int pre = function.getWordOriginalIndex(words[i-1]);
    wordCoCurrency[wordMap[pre]][wordIndex] +=1.0//构建共现矩阵}
    wordIndex++;
    }
    /*
    这部分就是对文档中的句子进行遍历,在遍历过程中首先对每个词建立一个Map映射,记下当下的行号;
    这里才用双向Gram对每一句话前后连接的两个词都会进行统计,将统计结果存放在一个数组中*/

    1. wordCoCurrency = PCA.pca(wordCoCurrency);
    2. int i_a = function.getWordOriginalIndex(A);
    3. int i_b = function.getWordOriginalIndex(B);
    4. double [] a_array = wordCoCurrency[wordMap[i_a]];
    5. double [] b_array = wordCoCurrency[wordMap[i_b]];
    6. double sum = 0.0;
    7. for(int i = 0 ;i<b_array.length;i++){
    8. sum += Math.pow(Math.sqrt(a_array[i])-Math.sqrt(b_array[i]),2.0);
    9. }
    10. sum = Math.sqrt(sum)*(1.0/Math.sqrt(2.0));# 这里就开始计算两个向量的海明距离,也就是说两个向量的差异程度

    对词进行向量化编码的过程就叫做embeddeding是文本处理的常见步骤;

    对于非直接连接的词,embedding算法是怎么解决的呢?

    skip-gram算法能够训练一个向量:使用神经网络模型对原本词汇的独热编码进行表示学习,寻找一种能够把稀疏的输入空间投影为
    稠密的稳定的表示空间,这部分就是一种编码成向量的方法;能够减少维度灾难和内存开销,同时对词的表示状态也会更加合理。

    使用对偶学习的方式来训练生成器,使得生成器(GAN)能够提供尽量多的接近真实的样本用来学习,也就是对当前的学习任务建立对偶任务,减少对学习样本的要求