判斷輸入句子向量是侮辱性語言還是正常言論。
from numpy import *
defloaddataset
(): postinglist = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'i', 'love', 'him'],
['stop', 'posting', 'stupid', 'wprthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']] #進行詞條切分後的文件集合
classvec = [0, 1, 0, 1, 0, 1] #1表示侮辱性文字,0表示正常言論
return postinglist, classvec
defcreatevocablist
(dataset):
vocabset = set() #建立乙個空子集
for document in dataset:
vocabset = vocabset | set(document) #set子集並運算,建立乙個不重複詞列表
return list(vocabset)
#檢查某個詞是否在vocablist中
defsetofwords2vec
(vocablist, inputset):
#vocablist詞彙表,inputset輸入文件
returnvec = [0]*len(vocablist) #建立乙個與vocablist等長的0向量
for word in inputset:
if word in vocablist:
returnvec[vocablist.index(word)] = 1
#相應的位置置1
else: print("the word: %s is not in my vocabulary!" % word)
return returnvec
deftrainnb0
(trainmatrix, traincategory):
#trainmatrix為判斷矩陣,traincategory為文件標籤
numtraindocs = len(trainmatrix) #判斷列表長度
numwords = len(trainmatrix[0]) #建立乙個列表
pabusive = sum(traincategory)/float(numtraindocs) #侮辱性句子言論佔總言論百分比
# p0num = zeros(numwords) #建立乙個與numwords等長的零向量,正常言論的單詞
# p1num = zeros(numwords) #侮辱性的單詞
p0num = ones(numwords)
p1num = ones(numwords)
# p0denom = 0.0 #正常
# p1denom = 0.0 #侮辱性
p0denom = 2.0
p1denom = 2.0
#防止分母為0
for i in range(numtraindocs):
if traincategory[i] == 1: #若這一句表示含義為侮辱性
p1num += trainmatrix[i] #p1num中是每個單詞出現的數量,列表對應相加
p1denom += sum(trainmatrix[i]) #單詞數
else: #正常言論
p0num += trainmatrix[i]
p0denom += sum(trainmatrix[i])
# p1vect = p1num/p1denom #每個侮辱單詞在侮辱單詞總數的百分比
# p0vect = p0num/p0denom
p1vect = log(p1num / p1denom) #採用log防止計算下溢位
p0vect = log(p0num / p0denom)
return p0vect, p1vect, pabusive
defclassifynb
(vec2classify, p0vec, p1vec, pclass1):
#vec2classify為要分類的向量,判斷輸入句子屬於那種言論
p1 = sum(vec2classify * p1vec) + log(pclass1) #向量對應相乘,得到詞彙是侮辱性的概率,然後所有概率log值相加,然後再乘以侮辱性的概率
# p(c1|w)=p(w|c1)p(c1) 分母相同沒有計算
p0 = sum(vec2classify * p0vec) + log(1.0 - pclass1)
if p1 > p0:
return
1#侮辱性言論
else:
return
0#正常言論
deftestingnb
(): listoposts, listclasses = loaddataset() #建立文件集合以及標籤
myvocablist = createvocablist(listoposts) #建立不重複的單詞集
trainmat =
for postindoc in listoposts:
p0v, p1v, pab = trainnb0(array(trainmat), array(listclasses)) #array(trainmat)二維矩陣,array(listclasses)一維矩陣
testentry = ['love', 'my', 'dalmation']
thisdoc = array(setofwords2vec(myvocablist, testentry)) #檢查testentry是否在vocablist中
print(testentry, "classified as:", classifynb(thisdoc, p0v, p1v, pab))
testentry = ['stupid', 'garbage']
thisdoc = array(setofwords2vec(myvocablist, testentry)) #檢查testentry是否在vocablist中
print(testentry, "classified as:", classifynb(thisdoc, p0v, p1v, pab))
#測試testingnb()
>>['love', 'my', 'dalmation'] classified as: 0
['stupid', 'garbage'] classified as: 1
樸素貝葉斯分類器
p a b frac 類別 結果 a出現在特徵b樣本裡的概率 frac 假設乙個學校裡有60 男生和40 女生。女生穿褲子的人數和穿裙子的人數相等,所有男生穿褲子。隨機看到了乙個穿褲子的學生,那麼這個學生是女生的概率是多少?begin 特徵 穿褲子 類別 女生 p 女生 穿褲子 frac frac ...
樸素貝葉斯分類器
樸素貝葉斯分類器是用來做分類的乙個簡便方法。在貝葉斯公式的基礎上,引人條件獨立的假設,使得貝葉斯分類器具有簡單易行的優點和假設時常與實際不符的缺點。下面簡單介紹一下樸素貝葉斯分類器。首先規定一下資料格式 輸入的每乙個樣本為 其中 i 為樣本編號,x 為樣本的特徵,是乙個 n 維向量,x cdots ...
樸素貝葉斯分類器
所謂 條件概率 conditional probability 就是指在事件b發生的情況下,事件a發生的概率,用p a b 來表示。根據文氏圖,可以發現 同理可得,所以,即 其中,p a 稱為 先驗概率 prior probability 即在b事件發生之前,我們對a事件概率的乙個判斷 p a b ...