業(yè)務(wù)背景:
? ? 隨著技術(shù)業(yè)務(wù)的產(chǎn)品化初厚,用戶對技術(shù)產(chǎn)品的使用過程中存在很多疑問,我們組織應(yīng)運而生孙技,主要負(fù)責(zé)技術(shù)產(chǎn)品日常過程中的答疑产禾;在答疑過程中會遇到很多對產(chǎn)品有抱怨的用戶,這些用戶比較大的特征是在會話語料牵啦、咨詢頻次亚情、滿意度方面;其他數(shù)據(jù)層還好哈雏,在語料層機器比較難識別楞件,在我所處的案例過程中,我一開始用的是開源的NLP包裳瘪,snownlp履因,但是snownlp的切詞不夠強大,而我們業(yè)務(wù)過程中又會存在很多的專有名詞盹愚,僅憑市場上的詞典無法很好的做切詞處理栅迄,需要自己建立詞典,所以我這邊整合了jieba的切詞皆怕,和snownlp所用到的貝葉斯分類器對文本進行分類毅舆。
數(shù)據(jù)鏈路:
? ? 文本切詞 -> 去stop word -> 用bag of word模型映射成為詞向量 -> 基于樸素貝葉斯的句子分類計算
原理似乎很簡單。愈腾。憋活。但是在此之前我干了啥。虱黄。悦即。因為我是冷場王,發(fā)起語料收集之后沒人鳥我。辜梳。粱甫。
????1.不斷地從語料里找專有名詞
????2.不斷地在語料里找各個分類的句子,直到形成每個庫都有上千行的語料作瞄。茶宵。。
成果:
技術(shù)點:
? ? · 切詞 ---- 一個反復(fù)而又繁瑣的過程
? ? 這個基本是調(diào)用jieba的接口就ok,jieba庫支持自己定制詞語契耿,然后程序啟動的時候load進來就好瞒大。
? ? 詞典有三列,自己定義的名詞搪桂,權(quán)重糠赦,詞性
? ? 然后調(diào)用jieba的cut方法即可
mvn 100 n
git 100 n
? ? · 訓(xùn)練貝葉斯分類器
? ? ? ? 這個訓(xùn)練過程干了什么事情:1.生成詞語圖譜向量 2.把切好的詞映射成詞向量 3.生成分類向量和各個大類的概率 p0V, p1V, pAb(這三個東西組成了分類器的核心)
? ? 解釋一下這三個變量背后所代表的意義:
? ? ????p1V、p0V(詞典里的每個詞屬于某個類的概率向量)
? ? ????pAb(詞典里某個類出現(xiàn)的概率)? ? ? ??
? ? · 樸素貝葉斯分類預(yù)測
? ? ? ? 有了各個分類向量和分類概率锅棕,在加上詞典拙泽,就可以進行分類預(yù)測了嘿嘿
? ? ? ? 基于貝葉斯條件概率,加上樸素假設(shè)(每個詞都是獨立變量裸燎,這個是簡化計算)
def classifyNB(self, vec2Classify):
????if sum(vec2Classify) < 2: # 這里我基于業(yè)務(wù)做了過濾顾瞻,因為用戶如果只說了一句話,一般不足以構(gòu)成abusive德绿,當(dāng)然也會出現(xiàn)用戶爆粗的時候只說了一句話荷荤,這樣的話他前后也會提供了一些abusive的詞,所以也不影響預(yù)測移稳,這個只是經(jīng)驗處理
????????return 0
# 這兩行就是基于條件概率的預(yù)測蕴纳,取log是對概率預(yù)測做了平滑處理,以防概率為0和概率太小導(dǎo)致的算法預(yù)測失效的情況
????p1 = sum(vec2Classify * self.p1Vec) + log(self.pClass1)
????p0 = sum(vec2Classify * self.p0Vec) + log(1.0 - self.pClass1)
????if p1 > p0:
????????return 1
????else:
????????return 0