你好,世界!!我最近加入Jatana.ai 擔任NLP研究員(實習生and),並被要求使用深度學習模型研究文本分類用例。html
在本文中,我將分享個人經驗和學習,同時嘗試各類神經網絡架構。git
我將介紹3種主要算法,例如:github
對具備丹麥語,意大利語,德語,英語和土耳其語的數據集進行文本分類。算法
咱們來吧。✅bash
在不一樣業務問題中普遍使用的網絡
文本分類的目標是自動將文本文檔分類爲一個或多個預約義類別。架構
文本分類的一些示例是:app
文本分類是學術界和工業界很是活躍的研究領域。在這篇文章中,我將嘗試介紹一些不一樣的方法,並比較它們的性能,其中實現基於Keras。機器學習
全部源代碼和實驗結果均可以在jatana_research 存儲庫中找到。函數
咱們使用3種類型的數據集,其中包含各類類,以下表所示:
CNN是一類深度前饋人工神經網絡(節點之間的鏈接
我參考了Yoon Kim 論文和Denny Britz撰寫的這篇博客。
CNN一般用於計算機視覺,但它們最近已應用於各類NLP任務,結果頗有但願 🙌 。
讓咱們簡要地看一下當咱們經過圖表在文本數據上使用CNN時會發生什麼。當檢測到特殊模式時,每一個卷積的結果都將觸發。經過改變內核的大小並鏈接它們的輸出,你能夠本身檢測多個大小的模式(2,3或5個相鄰的單詞).Patterns能夠是表達式(單詞ngrams?),如「我討厭」,「很是好「所以CNN能夠在句子中識別它們而無論它們的位置如何。
在本節中,我使用簡化的CNN來構建分類器。因此首先使用Beautiful Soup來刪除一些HTML標籤和一些不須要的字符。
def clean_str(string):
string = re.sub(r「\\」,「」,string)
string = re.sub(r「\'」,「」,string) string = re.sub(r「\」 「,」,「string」 return string.strip()。lower() texts = []; labels = [] for i in range(df.message.shape [0]): text = BeautifulSoup(df.message [i ]) text.append(clean_str(str(text.get_text()。encode()))) for for in df ['class']: labels.append(i) 複製代碼
這裏我使用了Google Glove 6B vector 100d。其官方文件:
對於未知單詞,如下代碼將隨機化其向量。下面是一個很是簡單的卷積架構,使用了總共128個過濾器,大小爲5,最大池爲5和35,遵循此博客的示例。
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_cov1= Conv1D(128, 5, activation='relu')(embedded_sequences)
l_pool1 = MaxPooling1D(5)(l_cov1)
l_cov2 = Conv1D(128, 5, activation='relu')(l_pool1)
l_pool2 = MaxPooling1D(5)(l_cov2)
l_cov3 = Conv1D(128, 5, activation='relu')(l_pool2)
l_pool3 = MaxPooling1D(35)(l_cov3) # global max pooling
l_flat = Flatten()(l_pool3)
l_dense = Dense(128, activation='relu')(l_flat)
preds = Dense(len(macronum), activation='softmax')(l_dense)
複製代碼
甲迴歸神經網絡(RNN)是一類神經網絡,其中節點之間的鏈接造成沿着一序列的有向圖的。這容許它展現時間序列的動態時間行爲。
使用外部嵌入的知識能夠提升RNN的精確度,由於它集成了關於單詞的新信息(詞彙和語義),這些信息已經在一個很是大的數據集上訓練和提煉。預先訓練嵌入咱們將要使用的是GloVe。
RNN可能看起來很嚇人😱。雖然它們很難理解,但它們很是有趣。它們封裝了一個很是漂亮的設計,克服了傳統神經網絡在處理序列數據時出現的缺點:文本,時間序列,視頻,DNA序列等。
RNN是一系列神經網絡塊,它們像鏈同樣彼此連接。每一個人都將消息傳遞給繼任者。若是你想深刻了解內部機制,我強烈推薦Colah的博客。
使用Beautiful Soup也能夠完成相同的預處理。咱們將處理文本數據,這是一種序列類型。單詞的順序對意義很是重要。但願RNN可以處理這個問題並捕獲長期依賴關係。
要在文本數據上使用Keras,咱們首先必須對其進行預處理。爲此,咱們可使用Keras的Tokenizer類。該對象採用num_words參數做爲參數,這是基於字頻率進行標記化後保留的最大字數。
MAX_NB_WORDS = 20000
tokenizer = Tokenizer (num_words=MAX_NB_WORDS) tokenizer.fit_on_texts(texts)
複製代碼
一旦將標記化器安裝在數據上,咱們就可使用它將文本字符串轉換爲數字序列。這些數字表明字典中每一個單詞的位置(將其視爲映射)。
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
preds = Dense(len(macronum), activation='softmax')(l_lstm)
model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',optimizer='rmsprop', metrics=['acc'])
複製代碼
我參考了這篇研究論文「 分層注意網絡文檔分類」。它能夠成爲使用HAN進行文檔分類的絕佳指南。使用Beautiful Soup也能夠進行相同的預處理。咱們將使用的預訓練嵌入是GloVe。
tokenizer = Tokenizer(nb_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(texts)
data = np.zeros((len(texts), MAX_SENTS, MAX_SENT_LENGTH), dtype='int32')
for i, sentences in enumerate(reviews):
for j, sent in enumerate(sentences):
if j< MAX_SENTS:
wordTokens = text_to_word_sequence(sent)
k=0
for _, word in enumerate(wordTokens):
if(k<MAX_SENT_LENGTH and tokenizer.word_index[word]<MAX_NB_WORDS):
data[i,j,k] = tokenizer.word_index[word]
k=k+1
複製代碼
在此以後,咱們可使用Keras魔術函數TimeDistributed構建以下的Hierarchical輸入層。咱們也能夠參考這篇文章。
embedding_layer=Embedding(len(word_index)+1,EMBEDDING_DIM,weights=[embedding_matrix],
input_length=MAX_SENT_LENGTH,trainable=True)
sentence_input = Input(shape=(MAX_SENT_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sentence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
sentEncoder = Model(sentence_input, l_lstm)
review_input = Input(shape=(MAX_SENTS,MAX_SENT_LENGTH), dtype='int32')
review_encoder = TimeDistributed(sentEncoder)(review_input)
l_lstm_sent = Bidirectional(LSTM(100))(review_encoder)
preds = Dense(len(macronum), activation='softmax')(l_lstm_sent)
model = Model(review_input, preds)
複製代碼
結果
爲了達到最佳表現😉,咱們能夠:
全部上述實驗均在具備Nvidia Tesla K80 GPU的 8核vCPU上進行。
此外,全部實驗均在Rahul Kumar guidance 的指導下進行。
此外,我還要感謝Jatana.ai 爲我提供了一個很是好的基礎設施和全程支持😃。
感謝 Rahul Kumar。
英文原文:Report on Text Classification using CNN, RNN & HAN
更多文章歡迎訪問: www.apexyun.com
公衆號:銀河系1號
聯繫郵箱:public@space-explore.com(未經贊成,請勿轉載)