Python如何使用神經(jīng)網(wǎng)絡(luò)進行簡單文本分類
深度學(xué)習(xí)無處不在。在本文中,我們將使用Keras進行文本分類。
準備數(shù)據(jù)集
出于演示目的,我們將使用 20個新聞組 數(shù)據(jù)集。數(shù)據(jù)分為20個類別,我們的工作是預(yù)測這些類別。如下所示:

通常,對于深度學(xué)習(xí),我們將劃分訓(xùn)練和測試數(shù)據(jù)。
導(dǎo)入所需的軟件包
Python
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
將數(shù)據(jù)從文件加載到Python變量
Python
# 為了復(fù)現(xiàn)性 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 = [] # 讀取文件中的數(shù)據(jù)并將其添加到列表 data = pd.DataFrame.from_records(data_list, columns=data_tags)
我們的數(shù)據(jù)無法以CSV格式提供。我們有文本數(shù)據(jù)文件,文件存放的目錄是我們的標簽或類別。
我們將使用scikit-learn load_files方法。這種方法可以提供原始數(shù)據(jù)以及標簽和標簽索引。
最后我們得到一個數(shù)據(jù)框,其中包含文件名,類別和實際數(shù)據(jù)。
拆分數(shù)據(jù)進行訓(xùn)練和測試
Python
# 讓我們以80%的數(shù)據(jù)作為訓(xùn)練,剩下的20%作為測試。 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
# 20個新聞組 num_labels = 20 vocab_size = 15000 batch_size = 100 # 用Vocab Size定義Tokenizer tokenizer = Tokenizer(num_words=vocab_size) tokenizer.fit_on_texts(train_posts)
在對文本進行分類時,我們首先使用Bag Of Words方法對文本進行預(yù)處理。
預(yù)處理輸出標簽/類
在將文本轉(zhuǎn)換為數(shù)字向量后,我們還需要確保標簽以神經(jīng)網(wǎng)絡(luò)模型接受的數(shù)字格式表示。
建立Keras模型并擬合
PowerShell
model = Sequential()
它為輸入數(shù)據(jù)的維度以及構(gòu)成模型的圖層類型提供了簡單的配置。
這是擬合度和測試準確性的代碼段
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
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方法訓(xùn)練了我們的數(shù)據(jù)集之后,我們將如上所述評估模型。
混淆矩陣
混淆矩陣是可視化模型準確性的最佳方法之一。

保存模型
通常,深度學(xué)習(xí)的用例就像在不同的會話中進行數(shù)據(jù)訓(xùn)練,而使用訓(xùn)練后的模型進行預(yù)測一樣。
# 創(chuàng)建一個HDF5文件'my_model.h5'
model.model.save('my_model.h5')
# 保存令牌生成器,即詞匯表
with open('tokenizer.pickle', 'wb') as handle:
pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)
Keras沒有任何實用程序方法可將Tokenizer與模型一起保存。我們必須單獨序列化它。
加載Keras模型
Python
預(yù)測環(huán)境還需要注意標簽。
encoder.classes_ #標簽二值化
預(yù)測
如前所述,我們已經(jīng)預(yù)留了一些文件進行實際測試。
Python
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
輸出
File -> C:DL20news-bydate20news-bydate-testcomp.graphics38758 Predicted label: comp.graphics File -> C:DL20news-bydate20news-bydate-testmisc.forsale76115 Predicted label: misc.forsale File -> C:DL20news-bydate20news-bydate-testsoc.religion.christian21329 Predicted label: soc.religion.christian
我們知道目錄名是文件的真實標簽,因此上述預(yù)測是準確的。
結(jié)論
在本文中,我們使用Keras python庫構(gòu)建了一個簡單而強大的神經(jīng)網(wǎng)絡(luò)。
以上就是Python如何使用神經(jīng)網(wǎng)絡(luò)進行簡單文本分類的詳細內(nèi)容,更多關(guān)于python 神經(jīng)網(wǎng)絡(luò)進行文本分類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python ImageDraw類實現(xiàn)幾何圖形的繪制與文字的繪制
這篇文章主要介紹了python ImageDraw類實現(xiàn)幾何圖形的繪制與文字的繪制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Python編程使用DRF實現(xiàn)一次性驗證碼OTP
今天講一下如何用 Django REST framework[1](DRF) 來實現(xiàn) OTP,閱讀本文需要一定的 DRF 的基礎(chǔ)知識,有需要的朋友可以借鑒參考下2021-09-09
在tensorflow以及keras安裝目錄查詢操作(windows下)
這篇文章主要介紹了在tensorflow以及keras安裝目錄查詢操作(windows下),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
python散點圖雙軸設(shè)置坐標軸刻度的實現(xiàn)
散點圖是一種常用的圖表類型,可以用來展示兩個變量之間的關(guān)系,本文主要介紹了python散點圖雙軸設(shè)置坐標軸刻度的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01
Python實現(xiàn)的登錄驗證系統(tǒng)完整案例【基于搭建的MVC框架】
這篇文章主要介紹了Python實現(xiàn)的登錄驗證系統(tǒng),結(jié)合完整實例形式分析了Python基于搭建的MVC框架進行登錄驗證操作的相關(guān)實現(xiàn)與使用技巧,需要的朋友可以參考下2019-04-04
Blueprint實現(xiàn)路由分組及Flask中session的使用詳解
這篇文章主要為大家介紹了Blueprint實現(xiàn)路由分組及Flask中session的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

