不是很懂这种问题的思路,行和列都代表什么意思呢?交叉的数字又是啥意思?想算一句话的概率应该怎么算?
纵向代表前缀词语,横向代表后缀词语
交叉点代表前缀词后面跟后缀词的概率(次数)
在朴素贝叶斯算法中,为了避免维度灾难,有一个大胆的假设,即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=xn∣Y=Ck)=P(X1=x1∣Y=Ck)P(X2=x2∣Y=Ck)...P(Xn=xn∣Y=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个词的关联,预测的准确率又上升了一丢丢,继续加油~
N-GRAM基础问题解答:
一、N-GRAM中的行和列分别代表什么意思,以及交叉的数字是什么意思?
二、如何计算一句话的概率?
三、计算N-gram概率的方法,极大似然估计的公式是什么?
四、如何构建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))}
。