概率论中所学,用来描述两个条件概率直接的关系。
( X ∣ Y ) = P ( X , Y ) P ( Y ) (X\mid Y)=\frac{P(X,Y)}{P(Y)} (X∣Y)=P(Y)P(X,Y)
进一步推导:
P ( X ∣ Y ) = P ( Y ∣ X ) P ( X ) P ( Y ) P(X\mid Y)=\frac{P(Y\mid X)P(X)}{P(Y)} P(X∣Y)=P(Y)P(Y∣X)P(X)
其中,P(Y)叫做先验概率,P(Y|X)叫做后验概率,P(Y,X)是联合概率
在机器学习的视角下,我们把X理解成“具有某种特征”
,把Y理解成“类别标签”
:
P(所属类别|某种特征) = P(某种特征|所属类别)P(所属类别)/P(某种特征)
朴素贝叶斯理论源于随机变量的独立性
,就文本分类而言,从朴素贝叶斯的角度看,句子中的两两词之间的关系是相互独立的。
One-Hot表达是文本分类的一种结构化方式
,是最直观,也是目前为止最常用的词表示方式。特点是相互独立地表示语料中的每个词
。词与词在句子中的相关性被忽略了,这正符合朴素贝叶斯对文本的假设。
One-Hot方法就是把语料库的每个词稀疏地表示为一个长向量,这个向量的纬度是词典大小,其中绝大多数元素为0,只有代表当前词的纬度的值为1。例如这样一个语料库中有三个文本:
文本1:My dog ate my homework.
文本2:My cat ate the sandwich.
文本3:A dolphin ate the homework.
这三个文本生成的词典有9个词:
[a,ate,cat,dolphin,dog,homework,my,sandwich,the]
这9个词依次表示为One-Hot向量的形式如下:
"a" : [1,0,0,0,0,0,0,0,0]
"ate":[0,1,0,0,0,0,0,0,0]
……
"the":[0,0,0,0,0,0,0,0,1]
此时的文本内容如下
文本1: 0,1,0,0,1,1,1,0,0(“my”出现了两次,但二元向量表示中仍然是“1”)
文本2: 0,1,1,0,0,0,1,1,1
文本3: 1,1,0,1,0,1,0,0,1
词频(Term Frequency,TF)
指某一个给定的词语在该文档中出现的频率,是对词数(Term Count)的归一化
,以防止偏向长的文件。
T F i j = n i , j ∑ k n k , j TF_{ij} = \frac{n_{i,j}}{\sum_{k}n_{k,j}} TFij=∑knk,jni,j
公式中 n i , j n_{i,j} ni,j表示i词在j文件中出现的次数。分子表示该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。
逆向文件词频(Inverse Document Frequency,IDF)
是一个词语普遍重要性的度量
。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到:
I D F i = log ∣ D ∣ ∣ 1 + j : t i ∈ d j ∣ IDF_i = \log\frac{|D|}{|1+{j:t_i\in d_j}|} IDFi=log∣1+j:ti∈dj∣∣D∣
公式中|D|:语料库中的文件总数; j:包含词语的文件数目(如果该词语不在语料库中,分母为0,因此,一般情况下分母加1,然后计算TF与IDF的乘积)
对上述实例中的整型计数方法进行归一化,归一化可以避免句子长度不一致
问题,便于算法计算,而且对于基于概率算法,词频信息就变成了概率分布
,这就是文档的TF信息
,内容如下:
文本1:0,1/5,0,0,1/5,1/5,2/5,0,0
文本2: 0,1/5,1/5,0,0,0,1/5,1/5,1/5
文本3: 1/5,1/5,0,1/5,0,1/5,0,0,1/5
原词袋(收集了所有文档中的词)中的词频信息:
a(1),ate(3),cat(1),dolphin(1),dog(1),homework(2),my(3),sandwich(1),the(2)。
词袋中词的词频是针对所有文档的词频,因此,词袋的统计基数是文档数。
词条的文档频率:
a(1/3),ate(3/3),cat(1/3),dolphin(1/3),dog(1/3),homework(2/3),my(2/3),sandwich(1/3),the(2/3)。
词袋模型的IDF权重如下:
IDF: a log(3/1),ate log(3/3),cat log(3/1),dolphin log(3/1),dog log(3/1),homework log(3/2),my log(3/2),sandwich log(3/1),the log(3/2)
TF-IDF权重策略:词频(TF)— 逆向文档频率(IDF),其含义是如果某个词或短语在一篇文章中出现的频率TF高
,并且在其他文章中很少出现
,则认为此词或者短语具有很好的类别区分能力
,适用于分类。本例文本1中“my"词频是2,而在三个文件的集合中,“my”词条的文档频率也是2。“my”不仅多次发生在第一文本中,几乎也发生在每个文本中。不具备类别区分能力,逆文档频率就是使用词条的文档频率来抵消该词的词频对权重的影响,而得到一个较低的权重。
#步骤:1.分词;去除停用词;2.转换成词频向量; 3.转换成TF-IDF权重矩阵; 4.特征提取,构建模型
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer
from sklearn.naive_bayes import GaussianNB,MultinomialNB
#Scikit-Learn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。
#1. CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在第i个文本下的词频。即各个词语出现的次数,通过get_feature_names()可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。
#2.TfidfTransformer类用于统计vectorizer中每个词语的TF-IDF值
#sklearn.naive_bayes.GaussianNB类构造方法无参数,属性值有:class_prior_ 每一个类的概率、#theta_ 每个类中各个特征的平均、#sigma_ #每个类中各个特征的方差
#sklearn.naive_bayes.MultinomialNB(alpha=1.0 #平滑参数 , fit_prior=True 学习类的先验概率,#class_prior=None) 类的先验概率
transformer = TfidfTransformer() #转化tf-idf权重向量函数
vectorizer = CountVectorizer() #转化词频向量函数
corpus = [
'My dog has flea problems, help please.',
'Maybe not take him to dog park is stupid.',
'My dalmation is so cute. I love him my.',
'Stop posting stupid worthless garbage.',
'Mr licks ate mu steak, what can I do?.',
'Quit buying worthless dog food stupid'
]
labels = [0,1,0,1,0,1] #文档标签
word_vec = vectorizer.fit_transform(corpus) #转成词向量
words = vectorizer.get_feature_names() #单词集合
word_cout = word_vec.toarray() #转成nd.array
tfidf = transformer.fit_transform(word_cout) #转成tf-idf权重向量
tfidf_ma = tfidf.toarray() #转成nd.array
clf = GaussianNB().fit(tfidf_ma[:4,:],labels[:4]) #对前四行学习,对后两行预测
res = clf.predict(tfidf_ma[4:,:])
print(res)