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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...