文字分類 《動手學深度學習pytorch》

2021-10-03 05:56:07 字數 3037 閱讀 3429

它把一段不定長的文字序列變換為文字的類別。

情感分析:使用文字情感分類來分析文字作者的情緒。有廣泛的應用。

應用預訓練的詞向量和含多個隱藏層的雙向迴圈神經網路與卷積神經網路,來判斷一段不定長的文字序列中包含的是正面還是負面的情緒。後續內容將從以下幾個方面展開:

文字情感分類資料集

使用迴圈神經網路進**感分類

使用卷積神經網路進**感分類

我們使用斯坦福的imdb資料集(stanford』s large movie review dataset)作為文字情感分類的資料集。

def get_vocab_imdb(data):

tokenized_data = get_tokenized_imdb(data)#分詞後的文字的列表

counter = collections.counter([tk for st in tokenized_data for tk in st])

return vocab.vocab(counter, min_freq=5) #torchtext.vocab.vocab 建立詞典。

#將資料集的文字從字串的形式轉換為單詞下標序列的形式

def preprocess_imdb(data, vocab):

def pad(x):

return x[:max_l] if len(x) > max_l else x + [0] * (max_l - len(x))

tokenized_data = get_tokenized_imdb(data)

features = torch.tensor([pad([vocab.stoi[word] for word in words]) for words in tokenized_data])

labels = torch.tensor([score for _, score in data])

return features, labels

train_set = data.tensordataset(*preprocess_imdb(train_data, vocab))

test_set = data.tensordataset(*preprocess_imdb(test_data, vocab))

# 上面的**等價於下面的注釋**

#lstm類

class birnn(nn.module):

def __init__(self, vocab, embed_size, num_hiddens, num_layers):

super(birnn, self).__init__()

self.embedding = nn.embedding(len(vocab), embed_size)

# encoder-decoder framework

# bidirectional設為true即得到雙向迴圈神經網路

self.encoder = nn.lstm(input_size=embed_size,

hidden_size=num_hiddens,

num_layers=num_layers,

bidirectional=true)

self.decoder = nn.linear(4*num_hiddens, 2) # 初始時間步和最終時間步的隱藏狀態作為全連線層輸入

def forward(self, inputs):

# 因為lstm需要將序列長度(seq_len)作為第一維,所以需要將輸入轉置

embeddings = self.embedding(inputs.permute(1, 0)) # (seq_len, batch_size, d)

# rnn.lstm 返回輸出、隱藏狀態和記憶單元,格式如 outputs, (h, c)

outputs, _ = self.encoder(embeddings) # (seq_len, batch_size, 2*h)

encoding = torch.cat((outputs[0], outputs[-1]), -1) # (batch_size, 4*h)

outs = self.decoder(encoding) # (batch_size, 2)

return outs

textcnn 中使用的時序最大池化(max-over-time pooling)層實際上對應一維全域性最大池化層:假設輸入包含多個通道,各通道由不同時間步上的數值組成,各通道的輸出即該通道所有時間步中最大的數值。因此,時序最大池化層的輸入在各個通道上的時間步數可以不同。

textcnn 的計算主要分為以下幾步。

定義多個一維卷積核,並使用這些卷積核對輸入分別做卷積計算。寬度不同的卷積核可能會捕捉到不同個數的相鄰詞的相關性。

對輸出的所有通道分別做時序最大池化,再將這些通道的池化輸出值鏈結為向量。

通過全連線層將鏈結後的向量變換為有關各類別的輸出。這一步可以使用丟棄層應對過擬合。

深度學習和文字分類

參考部落格 fasttext 模型輸入乙個詞的序列 一段文字或者一句話 輸出這個詞序列屬於不同類別的概率。序列中的詞和片語組成特徵向量,特徵向量通過線性變換對映到中間層,中間層再對映到標籤。fasttext 在 標籤時使用了非線性啟用函式,但在中間層不使用非線性啟用函式。fasttext 模型架構和...

深度學習和文字分類

傳統的文字分類模型 深度學習文字分類模型 fasttext fasttext 模型輸入乙個詞的序列 一段文字或者一句話 輸出這個詞序列屬於不同類別的概率。序列中的詞和片語組成特徵向量,特徵向量通過線性變換對映到中間層,中間層再對映到標籤。fasttext 在 標籤時使用了非線性啟用函式,但在中間層不...

文字分類深度學習實踐 學習記錄

word2vec的主要思路 通過單詞和上下文彼此 對應的兩個演算法分別為 也就是說模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現。例如 如果我們向神經網路模型中輸入乙個單詞 soviet 那麼最終模型的輸出概率中,像 union russia 這種相關詞的概率將遠高...