有关N-GRAM的基础题

不是很懂这种问题的思路,行和列都代表什么意思呢?交叉的数字又是啥意思?想算一句话的概率应该怎么算?

img

纵向代表前缀词语,横向代表后缀词语
交叉点代表前缀词后面跟后缀词的概率(次数)

  • 这篇文章:从零实现深度学习框架——N-Gram语言模型(一) 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: 利用朴素贝叶斯进行新闻文本分类中的 N-gram模型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在朴素贝叶斯算法中,为了避免维度灾难,有一个大胆的假设,即X的n个维度之间相互独立:
    P(X1=x1,X2=x2,...Xn=xn∣Y=Ck)=P(X1=x1∣Y=Ck)P(X2=x2∣Y=Ck)...P(Xn=xn∣Y=Ck)P(X_1=x_1,X_2=x_2,...X_n=x_n|Y=C_k)=P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k)P(X1=x1,X2=x2,...Xn=xnY=Ck)=P(X1=x1Y=Ck)P(X2=x2Y=Ck)...P(Xn=xnY=Ck)
    这个假设下,条件分布大大的简化了,但是这也可能带来预测的不准确性。n个维度相互独立,就是完全没有考虑上下文语境,把每个词拆开单独看,这么看的话,猫吃鱼、鱼吃猫得到的特征向量是完全一样的。

    N-gram模型就是假设XnX_nXn与附近n个词是相关的,比如当n=(1,2)时,猫吃鱼提取到的特征就是[‘猫’,‘吃’,‘鱼’,‘猫吃’,‘吃鱼’],为了平衡计算量和上下文关系,N一般取2或者3。朴素贝叶斯n个维度之间完全相互独立的假设,就是N-gram的n=1时的情况

    #转词向量
    tv_2gram = TfidfVectorizer(stop_words=stopwords, max_features=5000, ngram_range=(1,2),lowercase = False)
    tv_2gram.fit(x_train_fenci)
    #训练模型
    clf_2gram = MultinomialNB()
    clf_2gram.fit(tv_2gram.transform(fenci(x_train)), y_train)
    #预测
    clf_2gram.score(tv_2gram.transform(fenci(x_test)), y_test)
    

    得到的准确率为

    0.81679999999999997
    

    可以看出,指定N-gram模型n=2时,增加了附近2个词的关联,预测的准确率又上升了一丢丢,继续加油~

  • 以下回答由chatgpt基于相关博客总结生成:

    N-GRAM基础问题解答:

    一、N-GRAM中的行和列分别代表什么意思,以及交叉的数字是什么意思?

    • 行代表的是语料库中的不同序列,每一行都代表一个N-gram序列。
    • 列代表的是N-gram序列当中不同单词的出现次数。
    • 交叉的数字代表的是在这个N-gram序列中,对应单词出现的次数。

    二、如何计算一句话的概率?

    • 首先,将一句话转化为一个N-gram序列。
    • 然后,计算每一个N-gram序列的概率,并将其相乘得到该句话的概率。

    三、计算N-gram概率的方法,极大似然估计的公式是什么?

    • 极大似然估计的公式是:频数项除以先验概率,即:P(wi|wi-1) = count(wi-1wi) / count(wi-1)。

    四、如何构建N-gram模型?

    1.导入文本特征抽取模块:

    from sklearn.feature_extraction.text import CountVectorizer

    2.加载语料库:

    text = ["orange banana apple grape", "banana apple apple", "grape", 'orange apple']

    3.N-gram模型构建:

    ngram_vectorizer = CountVectorizer( ngram_range=(2, 2), decode_error="ignore" )

    4.文本转化为向量表示:

    x1 = ngram_vectorizer.fit_transform(text)

    五、困惑度的计算公式是什么?

    • 给定测试集W=w1w2⋯wN,困惑度(perplexity)计算公式为:PP(W) = sqrt[N]{1/P(w1w2⋯wN)}

    • 在bigram语言模型下,困惑度的计算公式为:PP(W) = sqrt[N]{∏i=1N(1/P(wi|wi-1))}