python數據挖掘第三篇-垃圾簡訊文本分類

来源:https://www.cnblogs.com/xqqblog/archive/2019/12/16/12051108.html
-Advertisement-
Play Games

數據挖掘第三篇 文本分類 文本分類總體上包括8個步驟。數據探索分析 》數據抽取 》文本預處理 》分詞 》去除停用詞 》文本向量化表示 》分類器 》模型評估.重要python庫包括numpy(數組),pandas(用於處理結構化數據),matplotlib(繪製詞雲,便於直觀表示),sklearn(提 ...


數據挖掘第三篇-文本分類

文本分類總體上包括8個步驟。數據探索分析-》數據抽取-》文本預處理-》分詞-》去除停用詞-》文本向量化表示-》分類器-》模型評估.重要python庫包括numpy(數組),pandas(用於處理結構化數據),matplotlib(繪製詞雲,便於直觀表示),sklearn(提供大量分類聚類演算法庫).

1.數據探索分析

(1)獲取大量未經過處理的文檔,且標記好文檔所屬類型。
(2)給各個文檔分配唯一的Id,並將之前用文字標記的分類類別用離散數字代替。例如 分類標記為[‘正常簡訊’,‘垃圾簡訊’],將其離散表示為[0,1].
(3)將Id,文檔內容,標記 作為列,樣本個數作為行,將這些文檔讀入一個數組中。形式為:[ [Id1,content1,label1], ...,[Id_n,content_n,label_n] ]
代碼示例:
import pandas as pd
data = pd.read_csv(csv文件名,header=None) # 讀入csv文件,不讀入列名
data.columns = ['Id','Content','Label']

1.1DataFrame中獲取數據的一些方法:

  1. data.loc[] # 通過字元串索引的方式獲取指定行列數據 例如:
    data.loc[0:2,'content'] # 獲取第0,1,2行的content列 的數據,【註意】:0:2獲取的是0,1,2行,這一點和一般的切片不相同
    data.loc[[0,2],['content','label']] # 通過列表指定行列
  2. data.iloc[] # 通過數字索引方式,用法和數組的一模一樣
  3. data['label'] # 獲取label列的數據,結果是一維數組
    data[['content','label']] # 結果是 content,label列的所有數據

    1.2統計不同label出現頻率,繪製餅圖

    data['label'].value_counts() # 獲取label這一列數據中各個標記出現次數,結果以series的形式返回

    1.2.1繪製餅圖

    num=data['label'].value_counts()
    import matplotlib.pyplot as plt
    plt.figure(figsize=(3,3)) # 將畫布設置為3*3的正方形
    plt.pie(num,labels=['正常','垃圾']) # 繪製餅圖,num是一個series ,series是一個帶索引的數組,和字典使用類似。
    plt.show()

2.數據抽取

當不同標記的比例不平衡時,需要分層抽樣,例如0標記出現72000次,而1標記出現8000次,則此時會產生模型偷懶問題。
data_normal = data.loc[data['label']==1].sample(1000,random_state=123) #在label為1的所有數據里挑選1000個隨機樣本
data_bad = data.loc[data['label']==0].sample(1000,random_state=123) #在label為0的所有數據里挑選1000個隨機樣本
data_new = pd.contat([data_normal,data_bad],axis=0) # 預設行拼接,所以axis可不寫

3.文本預處理

如下圖所示,content一項中包含了xxx,以及一些特殊編碼字元,以及逗號句號等等的標點符號,這些東西都是無意義字元,需要刪除掉

刪除這些特殊非中文字元,需要用到正則表達式,正則表達式是爬蟲中必不可少的一個知識點,是一個條件表達式,用這個構造的條件表達式所指定的規則在一個指定字元串中檢索匹配出符合規則的句子。
import re
afterDeleteSpecialWord=data_new['content'].apply(lambda x:re.sub('[^\u4E00-\u9FD5]+','',string))
這裡的apply表示對這個series數組中的每一個元素(即文檔的內容字元串)都執行這個匿名函數x,string是傳進來的參數,re.sub 表示 將前面指定的正則表達式'[^\u4E00-\u9FD5]+'所匹配的字元串(即非中文特殊字元)用''代替。這裡的正則表達式'[^\u4E00-\u9FD5]+':
[]是一個原子列表,^表示非,\u4E00-\u9FD5中文字元的正則表示,前面加上^則表示非中文字元,[]+表示這個原子列表中的字元可以匹配1次或多次。具體正則表達式的用法網上資源很多,這裡不詳細解釋.
處理完後,標點符號,以及特殊字元都不見了,如下所示:

4.分詞,去除停用詞

第一步先將之前的content中的內容進行分詞,分詞後content列的元素是一個列表,比如之前的content列中的元素'我來到北京清華大學電腦學院',執行分詞後結果為:['我','來到','北京','清華大學','電腦','學院']
第二步是去除停用詞,首先載入停用詞文件,裡面存儲了N個停用詞,然後對第一步中的分詞結果進行去除存在於停用詞列表中的詞.
代碼如下:
import jieba # 分詞庫
with open('stopList.txt','r') as f:
stop=f.read() # 獲取的結果是一個大的字元串,其中換行符之類的特殊字元也存在於其中
stop = stop.split() # 按照空格,換行符進行分割,獲取停用詞列表
stop = [' ']+stop # 由於之前的stop里沒有空格,而空格是停用詞,所以重新加回空格
jieba.load_userdic(path) # 載入指定路徑path里的用戶自定義詞典
after_segement = afterDeleteSpecialWord.apply(jieba.lcut) # 進行分詞
data_after = after_segement.apply(lambda x:[i for i in x if i not in stop]) # 去除停用詞

4.1繪製詞雲

繪製詞雲是文本分類里對詞頻的一個直觀圖像表示,以圖像形式呈現,頻率高的辭彙字體更大,頻率小的,字體小。
import matplotlib.pyplot as plt # 畫圖工具
from wordcloud import WordCloud # 詞雲工具庫
import itertools # 將二維數據壓縮為一維數據
pic = plt.imread(picturePath) # 這裡picturePath為具體圖片所在路徑,這裡沒有指定.這行代碼是載入畫板的一個背景圖片
'''
wc = WordCloud(font_path=r'C:\Windows\Fonts\字體名稱',background_color='white',mask=pic) # 生成一個詞雲對象 ,windows系統中的字體存放在c盤Windows文件夾下的Fonts文件夾中。因為這裡統計的都是中文,所以不要選英文字體,而是選擇中文字體,右鍵,屬性,如圖,為具體的字體名稱 '''

num = pd.Series(list(itertools.chain(*list(data_after)))).value_counts() # 統計詞頻
wc.fit_words(num) # 將統計好的詞頻放進去
plt.imshow(wc)
plt.show()

文本向量化表示

文本向量化表示的含義為:由於我們目前得到的是一個分詞結果,是中文,而電腦不能直接將中文作為分類的輸入數據,必須將其用數字來表示,那麼如何將一個文檔用一個數字化的向量表示呢,這就是文本向量化。
常用的向量化表示有詞袋模型,詞頻,TF-IDF,以及考慮上下文的詞嵌入。
詞袋模型是指,一個文檔中出現了的詞則該詞置1,詞庫中其他詞置0,而不考慮出現次數的多少。一個文檔則可以表示成一個N維的0,1向量,N的大小取決於詞庫的大小。
詞頻:在詞袋模型的基礎上,考慮出現詞的次數,而不是只要出現了就是1。
TF-IDF:考慮一個詞的詞頻以及逆文檔頻率,逆文檔頻率是指該詞在所有文檔里的稀有程度,該詞在所有文檔里出現的文檔數越少,則該詞越稀有,區分度就越高,逆文檔頻率就越高,逆文檔頻率=log(所有文檔數/(出現該詞的文檔數+1)),而TF-IDF則=TF*IDF。
在sklearn 中的feature_extraction.text包中有CountVectorizer,TfidfVectorizer直接可以做文本向量化工作,一個是根據詞頻,一個是TF-IDF。
tmp = data_after.apply(lambda x:' '.join(x)) # 由於谷歌開發的向量化工具僅支持按空格統計,所以之前的列表存放的單詞需要轉換成一個以空格分隔開的一個大字元串。
cv=CountVectorizer().fit(tmp) # 載入字典,以及需要向量化的文本數據
vector_data = cv.transform(tmp) # 向量化,結果是一個迭代器
vector_array = vector_data.toarray() # 將迭代器轉為數組

文本分類

接下來的步驟和一般機器學習分類問題是一模一樣的,不多做介紹。已經得到結構化數據vector_array,以及相應的標簽label,可以用sklearn的各種訓練模型進行訓練,測試,模型評估等等。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • flash存儲器的工作原理 flash存儲器又稱快閃記憶體(快快閃記憶體儲器),是一種電可擦可編程只讀存儲器的形式,是可以在操作中被多次擦或寫,EEPROM與高速RAM成為當前最常用且發展最快的兩種存儲技術。電腦的BIOS 、數字照相機等的存儲卡中都使用快閃記憶體。flash存儲器的主要特點是在不掉電的情況下能長期 ...
  • 安裝python第三方庫boto easy_install boto 進入seafile配置文件.conf添加下麵內容 [commit_object_backend] name = s3 bucket 的名字只能使用小寫字母,數字,點號,短劃線 bucket = my.commit objects ...
  • 這裡有一個小技巧:當我使用滑鼠右鍵點擊屬性,在進行QQ或者微信的截圖工具,屬性就會消失,比如QQ的ctrl+alt+A,我習慣微信的alt+A鍵盤截圖,這裡可以更改設置,以微信為例 1.點擊設置選項 2.快捷鍵設置,想給剛直接把你想更換的快捷鍵直接按進去就行了 3.更改截取屏幕,暫時隨便更改了一下, ...
  • 磁碟在系統剛分區的時候可以做磁碟分區最好 1.右鍵我的電腦,選在管理 2.在此視窗下依次展開選項,點擊存儲->磁碟管理,右邊是我已經分好的盤不用看的 3.確認一下我的電腦的各個盤的空間,選擇要壓縮的空間,本次以E盤為例 4.右鍵點擊E盤,選擇 壓縮捲,然後預設的界面是平均分配我的E盤大小,我的是預設 ...
  • #!/bin/bashlocation=/root/rmfind $location -mtime +30 -print | xargs rm -rf //-mtime是距離上一次修改時間 -print是只顯示文件 xargs是獲取find查找的結果在通過rm命令刪除 ...
  • 一,I/O重定向 重定向正常輸出 \ :覆蓋以存在文件的內容,很危險的操作 \ :如果文件已經存在,則是在原內容的最後追加。 可以禁止 的覆蓋行為,使用 。只在當前會話有效。 恢復覆蓋行為。 \ |: 已經禁止了覆蓋,但是確認就是要覆蓋,可以使用。 重定向錯誤輸出 2 :覆蓋以存在文件的內容,很危險 ...
  • 關係型資料庫: 1、定義: 創建在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的數據 2、關係模型常用概念: (1)關係:可以理解為一張二維表,每個關係都具有一個關係名,就是通常說的表名 (2)元組:可以理解為二維表中的一行,在資料庫中經常被稱為記錄 (3)屬性:可以理解為二 ...
  • 總結一下平時用到最多的sql語句 1.特殊日期 --今天凌晨SELECT DATEADD(dd,DATEDIFF(dd,0,GETDATE()),0)--明天凌晨SELECT DATEADD(dd,DATEDIFF(dd,0,GETDATE())+1,0)--當周周一(每周從周日開始)SELECT ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...