【機器學(xué)習(xí)】20大風(fēng)控文本分類算法-基于字符級的tfidf+邏輯回歸
大家好,文本數(shù)據(jù)的處理,對于一個風(fēng)控策略或者算法,我覺得是必須要掌握的技能,有人說,我的風(fēng)控并不涉及到文本?我覺得這片面了,在非內(nèi)容風(fēng)控領(lǐng)域,文本知識也是非常有用的。
用戶昵稱、地址啥的,這種絕大部分風(fēng)控場景都能遇到
關(guān)系網(wǎng)絡(luò)的節(jié)點向量化,基本也是文本處理的思路
行為序列,也能用文本的知識去處理,能捕捉非常有趣模式
在這里開個系:20大風(fēng)控文本分類算法,之前已經(jīng)寫的差不多了,慢慢更新,今天是第一講。本系列主要介紹了風(fēng)控場景下文本分類的基本方法,對抗文本變異,包括傳統(tǒng)的詞袋模型、循環(huán)神經(jīng)網(wǎng)絡(luò),也有常用于計算機視覺任務(wù)的卷積神經(jīng)網(wǎng)絡(luò),以及 RNN + CNN,試驗完一遍,基本能搞定大部分的文本分類以及文本變異對抗問題。算是個保姆級的入門教程。
數(shù)據(jù)集和預(yù)處理
本文用一個風(fēng)險彈幕數(shù)據(jù)集做實驗,該數(shù)據(jù)集包含19670條明細數(shù)據(jù),每一行都用 1(垃圾文本)和 0(正常文本)進行了標(biāo)記。需要數(shù)據(jù)集的關(guān)注:小伍哥聊風(fēng)控,后臺回復(fù)【彈幕】獲取
目標(biāo):針對直播間中存在的大量涉黃涉暴彈幕,進行垃圾分類,將彈幕中不合法的內(nèi)容進行識別并屏蔽。
正常彈幕示例
新人主播,各位老板多多關(guān)注??? 0
50077你賣我 0
看看五雷咒的威力 0
垃圾彈幕示例
網(wǎng)站++沜買的私聊我 1
安 KMD555 買-P-微 1
摳逼加薇2928046748摳逼加薇2928046748摳逼。 1

數(shù)據(jù)讀取和查看
import osimport pandas as pdpath = '/Users/wuzhengxiang/Documents/DataSets/TextCnn'os.chdir(path)data = pd.read_csv('text_all.csv')#對數(shù)據(jù)進行隨機打亂data = data.sample(frac=1, random_state=42)print(data.shape)(19670, 2)#查看0-1的比例,可以看出來,數(shù)據(jù)集基本上平衡data['label'].value_counts()1 98820 9788#查看前10行的數(shù)據(jù)data.head(10)text label17036 鄭 29526 Q 77544 15426 葩葩葩l 014173 網(wǎng)站盤需要買的私聊我. 114582 買家秀和賣家秀?01730 1776看v 01444 我又沒送你謝我干啥? 010439 7645 55562筘 02448 伽韋 sx111505 珂視頻箹 Ku 110423 影薇 w2753636 111782 胸還沒有寒磊的 大? 還奶子疼!0# 對文本進行分字data['text'] = data['text'].apply(lambda x: ' '.join(x))data.head()

數(shù)據(jù)讀取了,我們就要進行預(yù)處理,很多文本分類的預(yù)處理,上來就直接去除各種特殊字符,但是在風(fēng)控中,我們不能這么操作,因為很多文本的信息,都是包含在特殊字符里面,甚至說特殊字符比正常文本的信息含量還要高。這里暫時不做處理,后續(xù)再提高模型精度的時候我們再進行處。
將數(shù)據(jù)集進行分割,80%用于訓(xùn)練,20%用于測試:
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = \train_test_split(data['text'],data['label'],test_size=0.2,random_state=42)print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)(15736,) (3934,) (15736,) (3934,)
字符級的tfidf+邏輯回歸
1、什么是N-Gram?
n-gram 是從一個句子中提取的N 個(或更少)連續(xù)單詞的集合,這一概念中的“單詞”,也可以替換為“字符”,這個概念聽起來比較抽象,下面來看一個簡單的例子,考慮句子“小伍哥最靚”。

它可以被分解為以下二元語法(2-grams)的集合。
{'小 ; 伍 ; 哥 ; 最 ; 靚 ; 小伍 ; 伍哥 ; 哥最 ; 最靚'}
也可以被分解為以下三元語法(3-grams)的集合。
{小 ; 伍 ; 哥 ; 最 ; 靚 ; 小伍 ; 伍哥 ; 哥最 ; 最靚 ; 小伍哥 ; 伍哥最 ; 哥最靚'}
這樣的集合分別叫作二元語法袋(bag-of-2-grams)及三元語法袋(bag-of-3-grams)。這里袋(bag)這一術(shù)語指的是,我們處理的是標(biāo)記組成的集合,而不是一個列表或序列,即標(biāo)記沒有特定的順序,這一系列分詞方法叫作詞袋(bag-of-words)。
上面是漢語的文本級的,當(dāng)然對于英語或者漢語拼音,我們可以做成字符級的,下面以cold這個單詞為例,得到如下的詞袋組合

那么,什么是 n-gram 呢?我們拿下面????這句話舉例。
2、為什么要用NGram?
能夠捕捉順序關(guān)系數(shù)據(jù),對于單個文本【小,伍,哥】和【哥,伍,小】是等價的,而N-Gram則是不等價的,而很多場景或者文本,順序是至關(guān)重要。能夠捕捉片段信息,每個連續(xù)的片段都進行評估,更有利于發(fā)現(xiàn)更多可遷移的策略,類似于CNN的平移不變性,或者數(shù)TextCNN 的滑窗效果。分字或者分詞后進行關(guān)聯(lián)規(guī)則挖掘,并不能獲得這種比較長的片段信息。
分類模型構(gòu)建
這里比較關(guān)鍵的參數(shù)ngram_range=(1, 5) ,直接就得到了5元的n-gram,,非常強大,token_pattern=r"(?u)\b\w+\b"這個參數(shù)解決中文的分詞問題,如果不加,默認的得不到一元的詞。外國佬寫的包,對中文不大友好。
# 加載模型from sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score, auc, roc_auc_scoreimport joblib#tf-idf訓(xùn)練vectorizer_word = TfidfVectorizer(max_features=800000,token_pattern=r"(?u)\b\w+\b",min_df=1,#max_df=0.1,analyzer='word',ngram_range=(1, 5))vectorizer_word.fit(x_train)tfidf_train = vectorizer_word.transform(x_train)tfidf_test = vectorizer_word.transform(x_test)#查看詞典的大小 vectorizer_word.vocabulary_len(vectorizer_word.vocabulary_)邏輯回歸模型的訓(xùn)練lr_word = LogisticRegression(solver='sag',verbose=2)lr_word.fit(tfidf_train, y_train)# 保存模型,下次可以直接使用joblib.dump(lr_word, 'lr_word_ngram.pkl')#模型讀取model = joblib.load(filename="lr_word_ngram.pkl")y_pred_word = lr_word.predict(tfidf_test)print(accuracy_score(y_test, y_pred_word))0.9405185561769192
第一個模型就得到了0.9405185561769192的準(zhǔn)確率,這個開局還是不錯的,可以看到,一個簡單的邏輯回歸模型,威力還是非常巨大的,為什么能夠這么厲害,主要是特征提取的方法,捕獲了大量的信息片段,和CNN的掃描邏輯基本一致,但是計算復(fù)雜度缺要小很多,因此,邏輯回歸+tfidf是文本分類非常好的基模型,有利于快速的上線。
··· END ···
往期精彩回顧
