Python使用神經網絡進行簡單文本分類

原文連接:http://tecdat.cn/?p=8613

 

 

深度學習無處不在。在本文中,咱們將使用Keras進行文本分類。python

 

準備數據集

出於演示目的,咱們將使用  20個新聞組  數據集。數據分爲20個類別,咱們的工做是預測這些類別。以下所示:windows

一般,對於深度學習,咱們將訓練和測試數據分開。微信

導入所需的軟件包

 

 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import pickle
from keras.preprocessing.text import Tokenizer
from keras.models import Sequential
from keras.layers import Activation, Dense, Dropout
from sklearn.preprocessing import LabelBinarizer
import sklearn.datasets as skds
from pathlib import Path

 

將數據從文件加載到Python變量

 

 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# For reproducibility
np.random.seed(1237)
  
label_index = files_train.target
label_names = files_train.target_names
labelled_files = files_train.filenames
 
data_tags = ["filename","category","news"]
data_list = []
 
# Read and add data from file to a list
 
data = pd.DataFrame.from_records(data_list, columns=data_tags)

在咱們的狀況下,數據沒法以CSV格式提供。咱們有文本數據文件,文件存放的目錄是咱們的標籤或類別。網絡

咱們將使用scikit-learn load_files方法。這種方法能夠爲咱們提供原始數據以及標籤和標籤索引。app

在以上代碼的結尾,咱們將有一個數據框,其中包含文件名,類別和實際數據。dom

 

拆分數據進行訓練和測試

 

 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
10
# lets take 80% data as training and remaining 20% for test.
train_size = int(len(data) * .8)
 
train_posts = data['news'][:train_size]
train_tags = data['category'][:train_size]
train_files_names = data['filename'][:train_size]
 
test_posts = data['news'][train_size:]
test_tags = data['category'][train_size:]
test_files_names = data['filename'][train_size:]

 

 

標記化並準備詞彙

 

 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 20 news groups
num_labels = 20
vocab_size = 15000
batch_size = 100
 
# define Tokenizer with Vocab Size
tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(train_posts)
 
 
 

在對文本進行分類時,咱們首先使用Bag Of Words方法對文本進行預處理。electron

 

預處理輸出標籤/類

在將文本轉換爲數字向量後,咱們還須要確保標籤以神經網絡模型接受的數字格式表示。ide

 

 
 
 
 
Python
 
   

 

創建Keras模型並擬合

 

 
 
 
 
 
PowerShell
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
model = Sequential()
 

它爲輸入數據的形狀以及構成模型的圖層類型提供了簡單的配置。post

這是一些適合度和測試準確性的代碼段學習

 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
100/8145 [..............................] - ETA: 31s - loss: 1.0746e-04 - acc: 1.0000
200/8145 [..............................] - ETA: 31s - loss: 0.0186 - acc: 0.9950    
300/8145 [>.............................] - ETA: 35s - loss: 0.0125 - acc: 0.9967
400/8145 [>.............................] - ETA: 32s - loss: 0.0094 - acc: 0.9975
500/8145 [>.............................] - ETA: 30s - loss: 0.0153 - acc: 0.9960
...
7900/8145 [============================>.] - ETA: 0s - loss: 0.1256 - acc: 0.9854
8000/8145 [============================>.] - ETA: 0s - loss: 0.1261 - acc: 0.9855
8100/8145 [============================>.] - ETA: 0s - loss: 0.1285 - acc: 0.9854
8145/8145 [==============================] - 29s 4ms/step - loss: 0.1293 - acc: 0.9854 - val_loss: 1.0597 - val_acc: 0.8742
 
Test accuracy: 0.8767123321648251

 

評估模型

 

 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
10
11
12
13
 
for i in range(10):
    prediction = model.predict(np.array([x_test[i]]))
    predicted_label = text_labels[np.argmax(prediction[0])]
    print(test_files_names.iloc[i])
    print('Actual label:' + test_tags.iloc[i])
    print("Predicted label: " + predicted_label)

在Fit方法訓練了咱們的數據集以後,咱們將如上所述評估模型。

 

混淆矩陣

混淆矩陣是可視化模型準確性的最佳方法之一。

 

保存模型

一般,深度學習的用例就像在不一樣的會話中進行數據訓練,而使用訓練後的模型進行預測同樣。

 
 
 
 
 
 
1
2
3
4
5
6
# creates a HDF5 file 'my_model.h5'
model.model.save('my_model.h5')
 
# Save Tokenizer i.e. Vocabulary
with open('tokenizer.pickle', 'wb') as handle:
    pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)

Keras沒有任何實用程序方法可將Tokenizer與模型一塊兒保存。咱們必須單獨序列化它。

 

加載Keras模型

 

 
 
 
 
 
Python
 
   

預測環境還須要注意標籤。

 
 
 
 
 
 
1
encoder.classes_ #LabelBinarizer

 

預測

如前所述,咱們已經預留了一些文件進行實際測試。

 
 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
 
labels = np.array(['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc',
'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x',
'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball',
'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space',
'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast',
'talk.politics.misc', 'talk.religion.misc'])
 ...
for x_t in x_tokenized:
    prediction = model.predict(np.array([x_t]))
    predicted_label = labels[np.argmax(prediction[0])]
    print("File ->", test_files[i], "Predicted label: " + predicted_label)
    i += 1

 

輸出量

 

 
 
 
 
 
 
 
1
2
3
File -> C:\DL\20news-bydate\20news-bydate-test\comp.graphics\38758 Predicted label: comp.graphics
File -> C:\DL\20news-bydate\20news-bydate-test\misc.forsale\76115 Predicted label: misc.forsale
File -> C:\DL\20news-bydate\20news-bydate-test\soc.religion.christian\21329 Predicted label: soc.religion.christian

咱們知道目錄名是文件的真實標籤,所以上述預測是準確的。

 

結論

在本文中,咱們使用Keras python庫構建了一個簡單而強大的神經網絡。


 

若是您有任何疑問,請在下面發表評論。 

  

大數據部落 -中國專業的第三方數據服務提供商,提供定製化的一站式數據挖掘和統計分析諮詢服務

統計分析和數據挖掘諮詢服務:y0.cn/teradat(諮詢服務請聯繫官網客服

點擊這裏給我發消息QQ:3025393450

 

​QQ交流羣:186388004 

【服務場景】  

科研項目; 公司項目外包;線上線下一對一培訓;數據爬蟲採集;學術研究;報告撰寫;市場調查。

【大數據部落】提供定製化的一站式數據挖掘和統計分析諮詢

 

歡迎關注微信公衆號,瞭解更多數據乾貨資訊!
 
 

歡迎選修咱們的R語言數據分析挖掘必知必會課程!

相關文章
相關標籤/搜索