最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類

2021-02-24 09:30 作者:拓端tecdat  | 我要投稿

原文鏈接:http://tecdat.cn/?p=8640

?

介紹

?

在本文中,我們將看到如何開發(fā)具有多個(gè)輸出的文本分類模型。我們開發(fā)一個(gè)文本分類模型,該模型可分析文本注釋并預(yù)測(cè)與該注釋關(guān)聯(lián)的多個(gè)標(biāo)簽。多標(biāo)簽分類問(wèn)題實(shí)際上是多個(gè)輸出模型的子集。在本文結(jié)尾,您將能夠?qū)?shù)據(jù)執(zhí)行多標(biāo)簽文本分類。

?

數(shù)據(jù)集

數(shù)據(jù)集包含來(lái)自Wikipedia對(duì)話頁(yè)編輯的評(píng)論。 評(píng)論可以屬于所有這些類別,也可以屬于這些類別的子集,這是一個(gè)多標(biāo)簽分類問(wèn)題。

現(xiàn)在,我們導(dǎo)入所需的庫(kù)并將數(shù)據(jù)集加載到我們的應(yīng)用程序中。以下腳本導(dǎo)入所需的庫(kù):

  1. import pandas as pd

  2. import numpy as np

  3. import re

  4. import matplotlib.pyplot as plt

現(xiàn)在,將數(shù)據(jù)集加載到內(nèi)存中:

toxic_comments = pd.read_csv("/comments.csv")

以下腳本顯示數(shù)據(jù)集的維度,并顯示數(shù)據(jù)集的標(biāo)題:

  1. print(toxic_comments.shape)

  2. toxic_comments.head()

輸出:

(159571,8)

數(shù)據(jù)集包含159571條記錄和8列。數(shù)據(jù)集的標(biāo)題如下所示:

?

讓我們刪除所有記錄中任何行包含空值或空字符串的記錄。

  1. filter = toxic_comments["comment_text"] != ""

  2. toxic_comments = toxic_comments[filter]

  3. toxic_comments = toxic_comments.dropna()

comment_text列包含文本注釋。?

print(toxic_comments["comment_text"][168])

輸出:

You should be fired, you're a moronic wimp who is too lazy to do research. It makes me sick that people like you exist in this world.

?讓我們看一下與此注釋相關(guān)的標(biāo)簽:

  1. print("Toxic:" + str(toxic_comments["toxic"][168]))

  2. print("Severe_toxic:" + str(toxic_comments["severe_toxic"][168]))

  3. print("Obscene:" + str(toxic_comments["obscene"][168]))

  4. print("Threat:" + str(toxic_comments["threat"][168]))

  5. print("Insult:" + str(toxic_comments["insult"][168]))

  6. print("Identity_hate:" + str(toxic_comments["identity_hate"][168]))

輸出:

  1. Toxic:1

  2. Severe_toxic:0

  3. Obscene:0

  4. Threat:0

  5. Insult:1

  6. Identity_hate:0

我們將首先過(guò)濾所有標(biāo)簽或輸出列。

  1. toxic_comments_labels = toxic_comments[["toxic", "severe_toxic", "obscene", "threat", "insult", "identity_hate"]]

  2. toxic_comments_labels.head()

輸出:

?

使用toxic_comments_labels數(shù)據(jù)框,我們將繪制條形圖,來(lái)顯示不同標(biāo)簽的總注釋數(shù)。

輸出:

?

您可以看到,“有毒”評(píng)論的出現(xiàn)頻率最高,其次是 “侮辱”。

?

創(chuàng)建多標(biāo)簽文本分類模型

創(chuàng)建多標(biāo)簽分類模型的方法有兩種:使用單個(gè)密集輸出層和多個(gè)密集輸出層。

在第一種方法中,我們可以使用具有六個(gè)輸出的單個(gè)密集層,并具有S型激活函數(shù)和二進(jìn)制交叉熵?fù)p失函數(shù)。?

在第二種方法中,我們將為每個(gè)標(biāo)簽創(chuàng)建一個(gè)密集輸出層。?

具有單輸出層的多標(biāo)簽文本分類模型

在本節(jié)中,我們將創(chuàng)建具有單個(gè)輸出層的多標(biāo)簽文本分類模型。?

在下一步中,我們將創(chuàng)建輸入和輸出集。輸入是來(lái)自該comment_text列的注釋。?

這里我們不需要執(zhí)行任何一鍵編碼,因?yàn)槲覀兊妮敵鰳?biāo)簽已經(jīng)是一鍵編碼矢量的形式。

下一步,我們將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集:
我們需要將文本輸入轉(zhuǎn)換為嵌入式向量。?

我們將使用GloVe詞嵌入將文本輸入轉(zhuǎn)換為數(shù)字輸入。

以下腳本創(chuàng)建模型。我們的模型將具有一個(gè)輸入層,一個(gè)嵌入層,一個(gè)具有128個(gè)神經(jīng)元的LSTM層和一個(gè)具有6個(gè)神經(jīng)元的輸出層,因?yàn)槲覀冊(cè)谳敵鲋杏?個(gè)標(biāo)簽。

  1. LSTM_Layer_1 = LSTM(128)(embedding_layer)

  2. dense_layer_1 = Dense(6, activation='sigmoid')(LSTM_Layer_1)

  3. model = Model()

讓我們輸出模型摘要:

print(model.summary())

輸出:

  1. _________________________________________________________________

  2. Layer (type) ? ? ? ? ? ? ? ? Output Shape ? ? ? ? ? ? ?Param #

  3. =================================================================

  4. input_1 (InputLayer) ? ? ? ? (None, 200) ? ? ? ? ? ? ? 0

  5. _________________________________________________________________

  6. embedding_1 (Embedding) ? ? ?(None, 200, 100) ? ? ? ? ?14824300

  7. _________________________________________________________________

  8. lstm_1 (LSTM) ? ? ? ? ? ? ? ?(None, 128) ? ? ? ? ? ? ? 117248

  9. _________________________________________________________________

  10. dense_1 (Dense) ? ? ? ? ? ? ?(None, 6) ? ? ? ? ? ? ? ? 774

  11. =================================================================

  12. Total params: 14,942,322

  13. Trainable params: 118,022

  14. Non-trainable params: 14,824,300

以下腳本輸出了我們的神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu):

plot_model(model, to_file='model_plot4a.png', show_shapes=True, show_layer_names=True)

輸出:

?

?

?

從上圖可以看到,輸出層僅包含1個(gè)具有6個(gè)神經(jīng)元的密集層。現(xiàn)在讓我們訓(xùn)練模型:

?可以用更多的時(shí)間訓(xùn)練模型,看看結(jié)果是好是壞。

?結(jié)果如下:

  1. rain on 102124 samples, validate on 25532 samples

  2. Epoch 1/5

  3. 102124/102124 [==============================] - 245s 2ms/step - loss: 0.1437 - acc: 0.9634 - val_loss: 0.1361 - val_acc: 0.9631

  4. Epoch 2/5

  5. 102124/102124 [==============================] - 245s 2ms/step - loss: 0.0763 - acc: 0.9753 - val_loss: 0.0621 - val_acc: 0.9788

  6. Epoch 3/5

  7. 102124/102124 [==============================] - 243s 2ms/step - loss: 0.0588 - acc: 0.9800 - val_loss: 0.0578 - val_acc: 0.9802

  8. Epoch 4/5

  9. 102124/102124 [==============================] - 246s 2ms/step - loss: 0.0559 - acc: 0.9807 - val_loss: 0.0571 - val_acc: 0.9801

  10. Epoch 5/5

  11. 102124/102124 [==============================] - 245s 2ms/step - loss: 0.0528 - acc: 0.9813 - val_loss: 0.0554 - val_acc: 0.9807

現(xiàn)在讓我們?cè)跍y(cè)試集中評(píng)估模型:

  1. print("Test Score:", score[0])

  2. print("Test Accuracy:", score[1])

輸出:

  1. 31915/31915 [==============================] - 108s 3ms/step

  2. Test Score: 0.054090796736467786

  3. Test Accuracy: 0.9810642735274182

我們的模型實(shí)現(xiàn)了約98%的精度 。

最后,我們將繪制訓(xùn)練和測(cè)試集的損失和準(zhǔn)確度,以查看我們的模型是否過(guò)擬合。

  1. plt.title('model loss')

  2. plt.ylabel('loss')

  3. plt.xlabel('epoch')

  4. plt.legend(['train','test'], loc='upper left')

  5. plt.show()

輸出:

?

您可以看到模型在驗(yàn)證集上沒有過(guò)擬合。

具有多個(gè)輸出層的多標(biāo)簽文本分類模型

在本節(jié)中,我們將創(chuàng)建一個(gè)多標(biāo)簽文本分類模型,其中每個(gè)輸出標(biāo)簽將具有一個(gè) 輸出密集層。讓我們首先定義預(yù)處理功能:

  1. def preprocess_text(sen):

  2. # 刪除標(biāo)點(diǎn)符號(hào)和數(shù)字

  3. # 單字符刪除

  4. # 刪除多個(gè)空格

  5. sentence = re.sub(r'\s+', ' ', sentence)

  6. return sentence

第二步是為模型創(chuàng)建輸入和輸出。該模型的輸入將是文本注釋,而輸出將是六個(gè)標(biāo)簽。以下腳本創(chuàng)建輸入層和組合的輸出層:

  1. y = toxic_comments[["toxic", "severe_toxic", "obscene", "threat", "insult", "identity_hate"]]

讓我們將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

y變量包含6個(gè)標(biāo)簽的組合輸出。但是,我們要為每個(gè)標(biāo)簽創(chuàng)建單獨(dú)的輸出層。我們將創(chuàng)建6個(gè)變量,這些變量存儲(chǔ)來(lái)自訓(xùn)練數(shù)據(jù)的各個(gè)標(biāo)簽,還有6個(gè)變量,分別存儲(chǔ)測(cè)試數(shù)據(jù)的各個(gè)標(biāo)簽值。

?

下一步是將文本輸入轉(zhuǎn)換為嵌入的向量。?

?

  1. X_train = pad_sequences(X_train, padding='post', maxlen=maxlen)

  2. X_test = pad_sequences(X_test, padding='post', maxlen=maxlen)

?我們將再次使用GloVe詞嵌入:

  1. embedding_matrix = zeros((vocab_size, 100))

?我們的模型將具有一層輸入層,一層嵌入層,然后一層具有128個(gè)神經(jīng)元的LSTM層。LSTM層的輸出將用作6個(gè)密集輸出層的輸入。每個(gè)輸出層具有1個(gè)具有S型激活功能的神經(jīng)元。?

以下腳本創(chuàng)建我們的模型:

  1. model = Model()

以下腳本輸出模型的摘要:print(model.summary())

輸出:

  1. __________________________________________________________________________________________________

  2. Layer (type) ? ? ? ? ? ? ? ? ? ?Output Shape ? ? ? ? Param # ? ? Connected to

  3. ==================================================================================================

  4. input_1 (InputLayer) ? ? ? ? ? ?(None, 200) ? ? ? ? ?0

  5. __________________________________________________________________________________________________

  6. embedding_1 (Embedding) ? ? ? ? (None, 200, 100) ? ? 14824300 ? ?input_1[0][0]

  7. __________________________________________________________________________________________________

  8. lstm_1 (LSTM) ? ? ? ? ? ? ? ? ? (None, 128) ? ? ? ? ?117248 ? ? ?embedding_1[0][0]

  9. __________________________________________________________________________________________________

  10. dense_1 (Dense) ? ? ? ? ? ? ? ? (None, 1) ? ? ? ? ? ?129 ? ? ? ? lstm_1[0][0]

  11. __________________________________________________________________________________________________

  12. dense_2 (Dense) ? ? ? ? ? ? ? ? (None, 1) ? ? ? ? ? ?129 ? ? ? ? lstm_1[0][0]

  13. __________________________________________________________________________________________________

  14. dense_3 (Dense) ? ? ? ? ? ? ? ? (None, 1) ? ? ? ? ? ?129 ? ? ? ? lstm_1[0][0]

  15. __________________________________________________________________________________________________

  16. dense_4 (Dense) ? ? ? ? ? ? ? ? (None, 1) ? ? ? ? ? ?129 ? ? ? ? lstm_1[0][0]

  17. __________________________________________________________________________________________________

  18. dense_5 (Dense) ? ? ? ? ? ? ? ? (None, 1) ? ? ? ? ? ?129 ? ? ? ? lstm_1[0][0]

  19. __________________________________________________________________________________________________

  20. dense_6 (Dense) ? ? ? ? ? ? ? ? (None, 1) ? ? ? ? ? ?129 ? ? ? ? lstm_1[0][0]

  21. ==================================================================================================

  22. Total params: 14,942,322

  23. Trainable params: 118,022

  24. Non-trainable params: 14,824,300

以下腳本顯示了我們模型的體系結(jié)構(gòu):

plot_model(model, to_file='model_plot4b.png', show_shapes=True, show_layer_names=True)

輸出:

?

您可以看到我們有6個(gè)不同的輸出層。上圖清楚地說(shuō)明了我們?cè)谏弦还?jié)中創(chuàng)建的具有單個(gè)輸入層的模型與具有多個(gè)輸出層的模型之間的區(qū)別。

現(xiàn)在讓我們訓(xùn)練模型:

history = model.fit(x=X_train, y=[y1_train, y2_train, y3_train, y4_train, y5_train, y6_train], batch_size=8192, epochs=5, verbose=1, validation_split=0.2)

訓(xùn)練過(guò)程和結(jié)果如下所示:

輸出:

  1. Train on 102124 samples, validate on 25532 samples

  2. Epoch 1/5

  3. 102124/102124 [==============================] - 24s 239us/step - loss: 3.5116 - dense_1_loss: 0.6017 - dense_2_loss: 0.5806 - dense_3_loss: 0.6150 - dense_4_loss: 0.5585 - dense_5_loss: 0.5828 - dense_6_loss: 0.5730 - dense_1_acc: 0.9029 - dense_2_acc: 0.9842 - dense_3_acc: 0.9444 - dense_4_acc: 0.9934 - dense_5_acc: 0.9508 - dense_6_acc: 0.9870 - val_loss: 1.0369 - val_dense_1_loss: 0.3290 - val_dense_2_loss: 0.0983 - val_dense_3_loss: 0.2571 - val_dense_4_loss: 0.0595 - val_dense_5_loss: 0.1972 - val_dense_6_loss: 0.0959 - val_dense_1_acc: 0.9037 - val_dense_2_acc: 0.9901 - val_dense_3_acc: 0.9469 - val_dense_4_acc: 0.9966 - val_dense_5_acc: 0.9509 - val_dense_6_acc: 0.9901

  4. Epoch 2/5

  5. 102124/102124 [==============================] - 20s 197us/step - loss: 0.9084 - dense_1_loss: 0.3324 - dense_2_loss: 0.0679 - dense_3_loss: 0.2172 - dense_4_loss: 0.0338 - dense_5_loss: 0.1983 - dense_6_loss: 0.0589 - dense_1_acc: 0.9043 - dense_2_acc: 0.9899 - dense_3_acc: 0.9474 - dense_4_acc: 0.9968 - dense_5_acc: 0.9510 - dense_6_acc: 0.9915 - val_loss: 0.8616 - val_dense_1_loss: 0.3164 - val_dense_2_loss: 0.0555 - val_dense_3_loss: 0.2127 - val_dense_4_loss: 0.0235 - val_dense_5_loss: 0.1981 - val_dense_6_loss: 0.0554 - val_dense_1_acc: 0.9038 - val_dense_2_acc: 0.9900 - val_dense_3_acc: 0.9469 - val_dense_4_acc: 0.9965 - val_dense_5_acc: 0.9509 - val_dense_6_acc: 0.9900

  6. Epoch 3/5

  7. 102124/102124 [==============================] - 20s 199us/step - loss: 0.8513 - dense_1_loss: 0.3179 - dense_2_loss: 0.0566 - dense_3_loss: 0.2103 - dense_4_loss: 0.0216 - dense_5_loss: 0.1960 - dense_6_loss: 0.0490 - dense_1_acc: 0.9043 - dense_2_acc: 0.9899 - dense_3_acc: 0.9474 - dense_4_acc: 0.9968 - dense_5_acc: 0.9510 - dense_6_acc: 0.9915 - val_loss: 0.8552 - val_dense_1_loss: 0.3158 - val_dense_2_loss: 0.0566 - val_dense_3_loss: 0.2074 - val_dense_4_loss: 0.0225 - val_dense_5_loss: 0.1960 - val_dense_6_loss: 0.0568 - val_dense_1_acc: 0.9038 - val_dense_2_acc: 0.9900 - val_dense_3_acc: 0.9469 - val_dense_4_acc: 0.9965 - val_dense_5_acc: 0.9509 - val_dense_6_acc: 0.9900

  8. Epoch 4/5

  9. 102124/102124 [==============================] - 20s 198us/step - loss: 0.8442 - dense_1_loss: 0.3153 - dense_2_loss: 0.0570 - dense_3_loss: 0.2061 - dense_4_loss: 0.0213 - dense_5_loss: 0.1952 - dense_6_loss: 0.0493 - dense_1_acc: 0.9043 - dense_2_acc: 0.9899 - dense_3_acc: 0.9474 - dense_4_acc: 0.9968 - dense_5_acc: 0.9510 - dense_6_acc: 0.9915 - val_loss: 0.8527 - val_dense_1_loss: 0.3156 - val_dense_2_loss: 0.0558 - val_dense_3_loss: 0.2074 - val_dense_4_loss: 0.0226 - val_dense_5_loss: 0.1951 - val_dense_6_loss: 0.0561 - val_dense_1_acc: 0.9038 - val_dense_2_acc: 0.9900 - val_dense_3_acc: 0.9469 - val_dense_4_acc: 0.9965 - val_dense_5_acc: 0.9509 - val_dense_6_acc: 0.9900

  10. Epoch 5/5

  11. 102124/102124 [==============================] - 20s 197us/step - loss: 0.8410 - dense_1_loss: 0.3146 - dense_2_loss: 0.0561 - dense_3_loss: 0.2055 - dense_4_loss: 0.0213 - dense_5_loss: 0.1948 - dense_6_loss: 0.0486 - dense_1_acc: 0.9043 - dense_2_acc: 0.9899 - dense_3_acc: 0.9474 - dense_4_acc: 0.9968 - dense_5_acc: 0.9510 - dense_6_acc: 0.9915 - val_loss: 0.8501 - val_dense_1_loss: 0.3153 - val_dense_2_loss: 0.0553 - val_dense_3_loss: 0.2069 - val_dense_4_loss: 0.0226 - val_dense_5_loss: 0.1948 - val_dense_6_loss: 0.0553 - val_dense_1_acc: 0.9038 - val_dense_2_acc: 0.9900 - val_dense_3_acc: 0.9469 - val_dense_4_acc: 0.9965 - val_dense_5_acc: 0.9509 - val_dense_6_acc: 0.9900

?對(duì)于每個(gè)時(shí)期,我們?cè)谳敵鲋械乃?個(gè)密集層都有 精度 。

現(xiàn)在讓我們?cè)u(píng)估模型在測(cè)試集上的性能:

  1. print("Test Score:", score[0])

  2. print("Test Accuracy:", score[1])

輸出:

  1. 31915/31915 [==============================] - 111s 3ms/step

  2. Test Score: 0.8471985269747015

  3. Test Accuracy: 0.31425264998511726

通過(guò)多個(gè)輸出層只能達(dá)到31%的精度。

以下腳本繪制了第一密集層的訓(xùn)練和驗(yàn)證集的損失和準(zhǔn)確值。

  1. plt.title('model loss')

  2. plt.ylabel('loss')

  3. plt.xlabel('epoch')

  4. plt.legend(['train','test'], loc='upper left')

  5. plt.show()

輸出:

?

從輸出中可以看到,在第一個(gè)時(shí)期之后,測(cè)試(驗(yàn)證)的準(zhǔn)確性并未收斂。

結(jié)論

多標(biāo)簽文本分類是最常見的文本分類問(wèn)題之一。在本文中,我們研究了兩種用于多標(biāo)簽文本分類的深度學(xué)習(xí)方法。在第一種方法中,我們使用具有多個(gè)神經(jīng)元的單個(gè)密集輸出層,其中每個(gè)神經(jīng)元代表一個(gè)標(biāo)簽。

在第二種方法中,我們?yōu)槊總€(gè)帶有一個(gè)神經(jīng)元的標(biāo)簽創(chuàng)建單獨(dú)的密集層。結(jié)果表明,在我們的情況下,具有多個(gè)神經(jīng)元的單個(gè)輸出層比多個(gè)輸出層的效果更好。

最受歡迎的見解

1.探析大數(shù)據(jù)期刊文章研究熱點(diǎn)

2.618網(wǎng)購(gòu)數(shù)據(jù)盤點(diǎn)-剁手族在關(guān)注什么

3.r語(yǔ)言文本挖掘tf-idf主題建模,情感分析n-gram建模研究

4.python主題建??梢暬痩da和t-sne交互式可視化

5.疫情下的新聞數(shù)據(jù)觀察

6.python主題lda建模和t-sne可視化

7.r語(yǔ)言中對(duì)文本數(shù)據(jù)進(jìn)行主題模型topic-modeling分析

8.主題模型:數(shù)據(jù)聆聽人民網(wǎng)留言板的那些“網(wǎng)事”

9.python爬蟲進(jìn)行web抓取lda主題語(yǔ)義數(shù)據(jù)分析


用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
灵璧县| 沧州市| 施秉县| 博罗县| 安国市| 吴江市| 沂南县| 翁源县| 扬州市| 泉州市| 连城县| 都昌县| 桑植县| 德州市| 遵化市| 内丘县| 台中县| 达州市| 嘉荫县| 阿尔山市| 惠安县| 陆河县| 杭锦旗| 宣武区| 台北县| 天台县| 赤城县| 高碑店市| 南通市| 凌源市| 黄龙县| 平定县| 神池县| 昌都县| 图们市| 武山县| 锦州市| 武威市| 阳西县| 灌南县| 石阡县|