資料挖掘第三篇-文本分類
文本分類總體上包括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 = https://www.cnblogs.com/xqqblog/p/pd.read_csv(csv檔案名,header=None) # 讀入csv檔案,不讀入列名
data.columns = ['Id','Content','Label']
1.1DataFrame中獲取資料的一些方法:
- data.loc[] # 通過字串索引的方式獲取指定行列資料 例如:
data.loc[0:2,'content'] # 獲取第0,1,2行的content列 的資料,【注意】:0:2獲取的是0,1,2行,這一點和一般的切片不相同
data.loc[[0,2],['content','label']] # 通過串列指定行列 - data.iloc[] # 通過數字索引方式,用法和陣列的一模一樣
- 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 = https://www.cnblogs.com/xqqblog/p/cv.transform(tmp) # 向量化,結果是一個迭代器
vector_array = vector_data.toarray() # 將迭代器轉為陣列
文本分類
接下來的步驟和一般機器學習分類問題是一模一樣的,不多做介紹,已經得到結構化資料vector_array,以及相應的標簽label,可以用sklearn的各種訓練模型進行訓練,測驗,模型評估等等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/37821.html
標籤:大數據
上一篇:記一次Elasticsearch OOM(記憶體溢位)的優化程序—基于segments force merge 和 store type 轉為 hybridfs
