NLP学习第4讲

Task4

朴素贝叶斯

  • 朴素贝叶斯的原理
  • 利用朴素贝叶斯模型进行文本分类
  • 朴素贝叶斯1

SVM模型

  • SVM的原理
  • 利用SVM模型进行文本分类

LDA主题模型

  • pLSA、共轭先验分布
  • LDA
  • 使用LDA生成主题特征,在之前特征的基础上加入主题特征进行文本分类
  • LDA数学八卦 lda2 合并特征

一、朴素贝叶斯

1.概念:

朴素:朴素贝叶斯算法是假设各个特征之间相互独立,也是朴素这词的意思。

贝叶斯分类:一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。

贝叶斯公式:
P(Y|X)=P(X|Y)P(Y)P(X)

分类是把一个事物分到某个类别中。一个事物具有很多属性,把它的众多属性看作一个向量,即x=(x1,x2,x3,…,xn),用x这个向量来代表这个事物,x的集合记为X,称为属性集。类别也有很多种,用集合C={c1,c2,…cm}表示。一般X和C的关系是不确定的,可以将X和C看作是随机变量,P(C|X)称为C的后验概率,与之相对的,P(C)称为C的先验概率。
根据贝叶斯公式,后验概率P(C|X)=P(X|C)P(C)/P(X),但在比较不同C值的后验概率时,分母P(X)总是常数,忽略掉,后验概率P(C|X)=P(X|C)P(C),先验概率P(C)可以通过计算训练集中属于每一个类的训练样本所占的比例,对类条件概率P(X|C)的估计,我们只谈论朴素贝叶斯分类器方法,因为朴素贝叶斯假设事物属性之间相互条件独立,P(X|C)=∏P(xi|ci)。


2.sklearn

在scikit-learn中,提供了3中朴素贝叶斯分类算法:GaussianNB(高斯朴素贝叶斯)、MultinomialNB(多项式朴素贝叶斯)、BernoulliNB(伯努利朴素贝叶斯)

简单介绍:

高斯朴素贝叶斯:适用于连续型数值,比如身高在160cm以下为一类,160-170cm为一个类,则划分不够细腻。

多项式朴素贝叶斯:常用于文本分类,特征是单词,值是单词出现的次数。

伯努利朴素贝叶斯:所用特征为全局特征,只是它计算的不是单词的数量,而是出现则为1,否则为0。也就是特征等权重。

(1)高斯模型

有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1;在160cm和170cm之间,特征值为2;在170cm之上,特征值为3。也可以这样转换,将身高转换为3个特征,分别是f1、f2、f3,如果身高是160cm以下,这三个特征的值分别是1、0、0,若身高在170cm之上,这三个特征的值分别是0、0、1。不过这些方式都不够细腻,高斯模型可以解决这个问题。高斯模型假设这些一个特征的所有属于某个类别的观测值符合高斯分布,也就是:  
 

from sklearn.naive_bayes import GaussianNB
#高斯贝叶斯
def train_model_GaussianNB():
    pass
    clf3 = GaussianNB()
    clf3.fit(X[499:], y[499:])#训练模型
    predict_labels = clf3.predict(X[0:499])
    # 预测对了几个?
    n = 0
    for i in range(len(predict_labels)):
        if (predict_labels[i] == y[i]):
            n = n + 1
    print("高斯贝叶斯:")
    # 正确率
    print n / 499.0
    # 混淆矩阵
    confusion_matrix(y[0:499], predict_labels)
    return

(2)多项式模型
在多项式模型中,设某文档d=(t1,t2,…,tk),tk是该文档中出现过的单词,允许重复,则先验概率P(c)= 类c下单词总数/整个训练样本的单词总数。类条件概率P(tk|c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+|V|)。
其中V是训练样本的单词表(即抽取单词,单词出现多次,只算一个),|V|则表示训练样本包含多少种单词。P(tk|c)可以看作是单词tk在证明d属于类c上提供了多大的证据,而P(c)则可以认为是类别c在整体上占多大比例(有多大可能性)。
 

from sklearn.naive_bayes import MultinomialNB
#多项式贝叶斯
def train_model_MultinomialNB():
    pass
    clf = MultinomialNB()
    #训练模型
    clf.fit(X[499:],y[499:])
    #预测训练集
    predict_labels = clf.predict(X[0:499])
    #预测对了几个?
    n = 0
    for i in range(len(predict_labels)):
        if(predict_labels[i] == y[i]):
            n = n + 1
    print("多项式贝叶斯:")
    #正确率
    print n/499.0
    #混淆矩阵
    confusion_matrix(y[0:499], predict_labels)
    return

(3)伯努利模型
P(c)= 类c下文件总数/整个训练样本的文件总数 
P(tk|c)=(类c下包含单词tk的文件数+1)/(类c下包含的文件+2)

from sklearn.naive_bayes import BernoulliNB
#伯努利贝叶斯
def train_model_BernoulliNB():
    pass
    clf2 = BernoulliNB()
    clf2.fit(X[499:], y[499:])
    predict_labels = clf2.predict(X[0:499])
    # 预测对了几个?
    n = 0
    for i in range(len(predict_labels)):
        if (predict_labels[i] == y[i]):
            n = n + 1
    print("伯努利贝叶斯:")
    # 正确率
    print n / 499.0
    # 混淆矩阵
    confusion_matrix(y[0:499], predict_labels)
    return

二、SVM模型

SVM的全称是Support Vector Machine,即支持向量机,主要用于解决模式识别领域中的数据分类问题,属于有监督学习算法的一种。

SVM 本质上在线性分类的基础上,引入间隔这个概念,将分类问题从正确率问题转换成一个最小间隔的问题。

支持向量机(SVM)算法基于结构风险最小化原理,将数据集合压缩到支持向量集合,学习得到分类决策函数。这种技术解决了以往需要无穷大样本数量的问题,它只需要将一定数量的文本通过计算抽象成向量化的训练文本数据,提高了分类的精确率。支持向量机(SVM)算法是根据有限的样本信息,在模型的复杂性与学习能力之间寻求最佳折中,以求获得最好的推广能力支持向量机算法的主要优点有:

  • 专门针对有限样本情况,其目标是得到现有信息下的最优解而不仅仅是样本数量趋于无穷大时的最优值;
  • 算法最终转化为一个二次型寻优问题,理论上得到的是全局最优点,解决了在神经网络方法中无法避免的局部极值问题;
  • 支持向量机算法能同时适用于稠密特征矢量与稀疏特征矢量两种情况,而其他一些文本分类算法不能同时满足两种情况;
  • 支持向量机算法能够找出包含重要分类信息的支持向量,是强有力的增量学习和主动学习工具。

SVM 文本分类算法主要分四个步骤:文本特征提取、文本特征表示、归一化处理和文本分类。

sklearn提供了三种基于svm的分类方法:

  • sklearn.svm.NuSVC()
  • sklearn.svm.LinearSVC()
  • sklearn.svm.SVC()

SVC()参数:

C : 惩罚系数
类型:float, optional (default=1.0)

kernel : 核函数
类型:string, optional (default=‘rbf’)
可选参数有:
‘linear’:线性核函数
‘poly’:多项式核函数
‘rbf’:径像核函数/高斯核
‘sigmod’:sigmod核函数
‘precomputed’:核矩阵

degree : 只对多项式核函数有用,是指多项式核函数的阶数n
类型:int, optional (default=3)

gamma : 核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效。
类型:float, optional (default=‘auto’)

coef0 : 核函数中的独立项,只有对‘poly’和‘sigmod’核函数有用,是指其中的参数c
类型:float, optional (default=0.0)

probability : 是否启用概率估计。 这必须在调用fit()之前启用,并且fit()方法速度变慢。
类型:boolean, optional (default=False)

shrinking : 是否采用启发式收缩方式
boolean, optional (default=True)

tol : svm停止训练的误差精度
类型:float, optional (default=1e-3)

cache_size : 指定训练所需要的内存,以MB为单位,默认为200MB。
类型:float, optional

class_weight : 给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.
如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
类型:{dict, ‘balanced’}, optional

verbose : 是否启用详细输出。 此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。
类型:bool, default: False

max_iter : 最大迭代次数,如果为-1,表示不限制
类型:int, optional (default=-1)

random_state : 伪随机数发生器的种子,在混洗数据时用于概率估计。
类型:int, RandomState instance or None, optional (default=None)
 

from sklearn.metrics import confusion_matrix    #程序参考博客1
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import LabelEncoder
from cnew_deal.pre_data import *
from sklearn.svm import SVC
import sklearn.naive_bayes as nb



train_data = pd.read_csv('G:/PycharmCode/NLP/cnews/cnews.train.txt', sep='\t', names=['label', 'content'])
test_data = pd.read_csv('G:/PycharmCode/NLP/cnews/cnews.test.txt', sep='\t', names=['label', 'content'])

label_list = []
for i in train_data['label']:
    label_list.append(i)
with open('train_content.pickle', 'rb') as f:
    train_content = pk.load(f)
with open('test_content.pickle', 'rb') as f:
    test_content = pk.load(f)
labelEncoder = LabelEncoder()
train_y = labelEncoder.fit_transform(label_list)
print(len(train_y))
vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(train_content)
x_test = vectorizer.transform(test_content)
y_train = train_y
model = SVC(C=0.5)
model.fit(x_train, y_train)
print('--------------------训练完成-----------------------')


test_label_list = []
for i in test_data['label']:
    test_label_list.append(i)
y_test = labelEncoder.transform(test_label_list)
print(len(y_test))
predic = model.predict(x_test)
print(len(predic))
print("classification report on test set for classifier:")
print(classification_report(y_test, predic))
print(model.score(x_test, predic))
print(confusion_matrix(y_test, predic))

三、LDA主题模型

1. 共轭先验分布
1.1似然函数
统计学中,似然函数是一种关于统计模型参数的函数,表示模型参数中的似然性。计算上:给定输出x时,关于参数θ的似然函数L(θ|x)(在数值上)等于给定参数θ后数据X的概率:L(θ|x)=P(X=x|θ)。简单意思就是,把参数设出来,记为θ,那似然函数就是在参数θ下,样本事件所发生的概率表述。但是我们要注意在统计学中,似然和概率又不一样,概率用于在已知一些参数的情况下,预测接下来的观测所得到的结果,而似然性则是用于在已知某些观测所得到的结果时,对有关事物的性质的参数进行估计。

1.2先验概率p(θ)
先验概率(prior probability)通俗来讲是指根据以往经验和分析得到的概率分布。

1.3后验概率P(θ|x)
在贝叶斯统计中,一个随机事件或者一个不确定事件的后验概率是在给出相关证据或数据后所得到的条件概率。

1.4共轭先验分布
共轭,顾名思义,两个及以上的对象,互相牵制、控制。

那在贝叶斯理论里,在已知似然函数情况下(已经有样本数据了),根据先验概率函数求后验概率。问题是:选取什么样的先验分布,会让后验分布与先验分布具有相同的数学形式呢,从这里提出了共轭分布理论。

在贝叶斯概率理论中,如果后验概率P(θ|x)和先验概率p(θ)满足同样的分布律(同分布),那么,先验分布叫作似然函数的共轭先验分布,先验分布和后验分布被叫作共轭分布。

共轭先验的好处主要在于代数上的方便性,可以直接给出后验分布的封闭形式,否则的话只能数值计算。共轭先验也有助于获得关于似然函数如何更新先验分布的直观印象。


2.PLSA

概率隐语义分析(PLSA)是一个著名的针对文本建模的模型,是一个生成模型。因为加入了主题模型,所以可以很大程度上改善多词一义和一词多义的问题。Hoffmm在1999年提出了概率隐语义分析(Probabilistic Latent Semantic Analysis)。他认为每个主题下都有一个词汇的概率分布,而一篇文章通常由多个主题构成,并且文章中的每个单词都是由某个主题生成的。


3.LDA主题模型
事实上,理解了pLSA模型,也就差不多快理解了LDA模型,因为LDA就是在pLSA的基础上加层贝叶斯框架,即LDA就是pLSA的贝叶斯版本(正因为LDA被贝叶斯化了,所以才需要考虑历史先验知识,才加的两个先验参数)。

对于语料库中的每篇文档,LDA定义了如下生成过程(generative process):

(1).对每一篇文档,从主题分布中抽取一个主题

(2) 从上述被抽到的主题所对应的单词分布中抽取一个单词

(3) 重复上述过程直至遍历文档中的每一个单词。

说实话以我现在的基础这一节啥都没看懂。。支持向量机以前接触过点还有点印象,最后这一部分实在不知所云,先放在这里了解下概念吧。

参考博客:

1.https://blog.csdn.net/mxs1123/article/details/88090715

2.https://blog.csdn.net/Heitao5200/article/details/88242389#1__1

3.https://blog.csdn.net/qq_35175666/article/details/89162925

4.https://github.com/HuanwenW/NLP-2019.github.io/blob/master/Data%20%26%26%20%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5.md

5.https://blog.csdn.net/nc514819873/article/details/89094687

6.https://blog.csdn.net/ljfwz153076024/article/details/89071850#PR_77

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值