《Python例項》震驚了,用Python這麼簡單實現了聊天系統的髒話,廣告檢測

語言: CN / TW / HK

小知識,大挑戰!本文正在參與“ 程式設計師必備小知識

本文同時參與 「掘力星計劃」 ,贏取創作大禮包,挑戰創作激勵金

在遊戲中聊天功能幾乎是必備的功能,這樣的功能存在一定的問題那就是會導致世界頻道很亂,經常會有一些敏感詞,或者一些遊戲廠商不願意看到的聊天,之前我們遊戲中也有這樣的問題,我們公司做了舉報和後臺監控,今天就來實現下這種監控。

1、需求分析:

因為深度學習用的不咋樣,雖然之前寫過強化學習,但是看強化學習的結果不是特別滿意,所以研究下簡單一些的方法實現。

這種分類任務其實有現成的解決方案,比如垃圾郵件的分類是同樣的問題,雖然有不同的解法,但是我還是選擇了最簡單的樸素貝葉斯分類。主要做一些探索,

因為我們的遊戲大都是中文,所以我們需要對中文進行分詞,比如我是帥哥,要拆分。

2、演算法原理:

樸素貝葉斯演算法,是一種通過根據新樣本的已有特徵在資料集中的條件概率來判斷新樣本所屬類別的演算法;它假設①每個特徵之間相互獨立、②每個特徵同等重要。也可以理解為根據過往的概率判斷當前特徵同時滿足時的概率。具體的數學公司可以自己百度,資料公式太雞兒難寫了,大概懂得就好。

在恰當的時候使用恰當的演算法。

jieba 分詞原理 :jieba分詞屬於概率語言模型分詞。概率語言模型分詞的任務是:在全切分所得的所有結果中求某個切分方案S,使得P(S)最大。

image.png

可以看到jieba 自帶了一些片語,在切分時會從這些片語中為基礎單位進行拆分。

注:以上兩個技術的原理我只是簡單的介紹,如果想徹底搞明白又得寫一大篇文章,可以百度下,到處都是,找一篇能看懂的就可以了。如果能用就先用起來。

3、技術分析

中文分詞的包最出名的分詞包是jieba,至於是不是最好的我也不知道,我想火是有火的道理,先做起來。jieba的原理不用深究,優先解決問題,遇到了問題可以再以問題點進行學習,這樣的學習模式才是最高效的。

因為最近在做語音相關的東西,有大佬推薦了庫nltk,查閱了相關的資料,似乎是做語言處理方向很出名的庫,很強大,功能很強大,我這裡主要選擇了他的分類演算法,這樣我就不用關注具體的實現,也不用重複造輪子了,況且還不如別人造的好,拿來用之就好。

python 是真不錯,各種包,各種輪子。

安裝命令: pip install jieba pip install nltk 分別輸入以上兩句程式碼,等執行完畢後,包就安裝成功了,可以開心的測試了 ``` """

Author: 香菜

@time: 2021/8/5 0005 下午 10:26 """ import jieba

if name == 'main': result = " | ".join(jieba.cut("我愛北京天安門,very happy")) print(result) ``` 看下分詞結果,可以說非常好,果然專業就是專業。

image.png

4、原始碼

簡單的測試做了,可以發現我們要完成的基本上都有了,現在開始直接搞程式碼。

1、載入初始的文字資源。

2、去除文字中的標點符號

3、對文字進行特徵提取

4、訓練資料集,訓練出模型(也就是預測的模型)

5、開始測試新輸入的詞語

```python

!/usr/bin/env python

encoding: utf-8

import re

import jieba from nltk.classify import NaiveBayesClassifier

"""

Author: 香菜

@time: 2021/8/5 0005 下午 9:29 """ rule = re.compile(r"[^a-zA-Z0-9\u4e00-\u9fa5]") def delComa(text): text = rule.sub('', text) return text

def loadData(fileName): text1 = open(fileName, "r", encoding='utf-8').read() text1 = delComa(text1) list1 = jieba.cut(text1) return " ".join(list1)

特徵提取

def word_feats(words): return dict([(word, True) for word in words])

if name == 'main': adResult = loadData(r"ad.txt") yellowResult = loadData(r"yellow.txt") ad_features = [(word_feats(lb), 'ad') for lb in adResult] yellow_features = [(word_feats(df), 'ye') for df in yellowResult] train_set = ad_features + yellow_features # 訓練決策 classifier = NaiveBayesClassifier.train(train_set)

# 分析測試
sentence = input("請輸入一句話:")
sentence = delComa(sentence)
print("\n")
seg_list = jieba.cut(sentence)
result1 = " ".join(seg_list)
words = result1.split(" ")
print(words)
# 統計結果
ad = 0
yellow = 0
for word in words:
 classResult = classifier.classify(word_feats(word))
 if classResult == 'ad':
    ad = ad + 1
 if classResult == 'ye':
    yellow = yellow + 1
# 呈現比例
x = float(str(float(ad) / len(words)))
y = float(str(float(yellow) / len(words)))
print('廣告的可能性:%.2f%%' % (x * 100))
print('髒話的可能性:%.2f%%' % (y * 100))

``` 看下執行的結果

image.png

所有資源下載地址:https://download.csdn.net/download/perfect2011/20914548

5、擴充套件

1、資料來源可以修改,可以用已經監控的資料儲存到資料庫中進行載入

2、可以多一些資料分類,方便客服進行處理,比如分為廣告,髒話,對官方的建議等等,根據業務需求進行定義

3、可以對概率比較高的資料銜接其他系統進行自動處理,提高處理問題的處理速度

4、可以使用玩家的舉報,增加資料的積累

5、可以將這個思想用作敏感詞的處理,提供敏感詞字典,然後進行匹配,檢測

6、可以做成web服務,進行回撥遊戲

7、可以把模型做成邊學習邊預測,比如有些案例需要客服手動處理,標記好之後直接加入到資料集中,這樣資料模型可以一直學習s

6、遇到的問題

1、遇到的問題,標點符號問題,標點符號如果不去除會導致匹配的時候標點符號也算作匹配,不合理。

2、編碼的問題,讀出來的是二進位制,搞了半天才解決

3、技術選型問題,在最初的時候想用深度學習解決,也看了一些解決方案,奈何自己的電腦訓練實在太慢,先選擇這樣方式練習下

4、程式碼很簡單,但是闡述技術很難,程式碼早都寫好了,但是這篇文章還是過了一個週末才寫好

7、總結:

遇到問題就去找技術方案,如果知道方案就去實現,遇到bug就去查,念念不忘必有迴響,你的任何一次嘗試都是學習的好機會