常用于文档分类
叫做朴素的原因:
整个形式化过程只作最原始、最简单的假设,概率独立性
优点:
在数据较少的情况下仍然有效,可以处理多类别的问题
缺点:
对输入数据的准备方式较为敏感
使用数据类型:
标称型数据
条件概率
从文本构建词向量
def createVacabList(dataSet):
vacabSet = set([])
for document in dataSet:
vocabSet = vocabSet | set(document)
return list(vocabSet)
def setOfWords2vec(vocabList,inputSet):
returnVec = [0]*len(vocabList)
for word in inputSet:
if word in vocabList:
#词集法
#returnVec[vocabList.index(word)]=1
#词袋法
returnVec[vocabList.index(word)]+=1
else:
pass
return returnVec
从词向量计算概率
def trainNBO(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory)/float(numTrainDocs)
#p0Num = zeros(numWords);p1Num = zeros(numWords)
#p0Denom = 0.0,p1Denom = 0.0
#由于有一个单词没有出现,那么其概率将会是0,相乘之后乘积也为0,
#未降低这种影响,将所有词出现的次数初始化为一,并将分母初始化为2
p0Num = ones(numWords);p1Num = ones(numWords)
p0Denom = 2.0,p1Denom = 2.0
for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
#由于此处会导致结果非常小,计算不准确,所以取对数
#p1Vect = p1Num/p1Denom
#p0Vect = p0Num/p0Denom
p1Vect = log(p1Num/p1Denom)
p0Vect = log(p0Num/p0Denom)
return p0Vect,p1Vect,pAbusive
分类
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
p1 = sum(vec2Classify*p1Vec)+log(pClass1)
p0 = sum(vec2Classify*p0Vec)+log(1-pClass1)
if p1>p0:
return 1
else:
return 0
处理文本的其他技巧:
再文本分类的时候,由于有一些词汇是常用词,他们的出现对于文本分类并没有帮助,有时候还会影响分类结果的准确性,所以不要将其计入词向量中。与之对应的我们可以统计词汇出现的频率,将较高频率的词删掉,或者使用停用词