精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

textCNN論文與原理——短文本分類

自然語言處理愛好者 ? 來源:菊子皮 ? 作者:菊子皮 ? 2020-12-31 10:08 ? 次閱讀

前言

之前書寫了使用pytorch進行短文本分類,其中的數據處理方式比較簡單粗暴。自然語言處理領域包含很多任務,很多的數據向之前那樣處理的話未免有點繁瑣和耗時。在pytorch中眾所周知的數據處理包是處理圖片的torchvision,而處理文本的少有提及,快速處理文本數據的包也是有的,那就是torchtext[1]。下面還是結合上一個案例:【深度學習】textCNN論文與原理——短文本分類(基于pytorch)[2],使用torchtext進行文本數據預處理,然后再使用torchtext進行模型分類。

關于torchtext的基本使用除了可以參考官方文檔,也可以看看這篇文章:TorchText用法示例及完整代碼[3]。

下面就開始看看該如何進行處理吧。

1 數據處理

首先導入包:

from torchtext import data

我們處理的語料中,主要涉及兩個內容:文本,文本對應的類別。下面使用torchtext構建這兩個字段:

# 文本內容,使用自定義的分詞方法,將內容轉換為小寫,設置最大長度等 TEXT = data.Field(tokenize=utils.en_seg, lower=True, fix_length=config.MAX_SENTENCE_SIZE, batch_first=True) # 文本對應的標簽 LABEL = data.LabelField(dtype=torch.float)

其中的一些參數在一個config.py文件中,如下:

# 模型相關參數 RANDOM_SEED = 1000 # 隨機數種子 BATCH_SIZE = 128 # 批次數據大小 LEARNING_RATE = 1e-3 # 學習率 EMBEDDING_SIZE = 200 # 詞向量維度 MAX_SENTENCE_SIZE = 50 # 設置最大語句長度 EPOCH = 20 # 訓練測輪次 # 語料路徑 NEG_CORPUS_PATH = ‘。/corpus/neg.txt’ POS_CORPUS_PATH = ‘。/corpus/pos.txt’

utils.en_seg是自定義的文本分詞函數,如下:

def en_seg(sentence): “”“ 簡單的英文分詞方法, :param sentence: 需要分詞的語句 返回分詞結果 ”“” return sentence.split()

當然也可以書寫更復雜的,或者使用spacy。下面就是書寫讀取文本數據到torchtext對象的數據了,便于使用torchtext中的方法,如下:

def get_dataset(corpus_path, text_field, label_field, datatype): “”“ 構建torchtext數據集 :param corpus_path: 數據路徑 :param text_field: torchtext設置的文本域 :param label_field: torchtext設置的文本標簽域 :param datatype: 文本的類別 torchtext格式的數據集以及設置的域 ”“” fields = [(‘text’, text_field), (‘label’, label_field)] examples = [] with open(corpus_path, encoding=‘utf8’) as reader: for line in reader: content = line.rstrip() if datatype == ‘pos’: label = 1 else: label = 0 # content[:-2]是由于原始文本最后的兩個內容是空格和。,這里直接去掉,并將數據與設置的域對應起來 examples.append(data.Example.fromlist([content[:-2], label], fields)) return examples, fields

現在就可以獲取torchtext格式的數據了,如下:

# 構建data數據 pos_examples, pos_fields = dataloader.get_dataset(config.POS_CORPUS_PATH, TEXT, LABEL, ‘pos’) neg_examples, neg_fields = dataloader.get_dataset(config.NEG_CORPUS_PATH, TEXT, LABEL, ‘neg’) all_examples, all_fields = pos_examples + neg_examples, pos_fields + neg_fields # 構建torchtext類型的數據集 total_data = data.Dataset(all_examples, all_fields)

有了上面的數據,下面就可以快速地為準備模型需要的數據了,如切分,構造批次數據,獲取字典等,如下:

# 數據集切分 train_data, test_data = total_data.split(random_state=random.seed(config.RANDOM_SEED), split_ratio=0.8) # 切分后的數據查看 # # 數據維度查看 print(‘len of train data: %r’ % len(train_data)) # len of train data: 8530 print(‘len of test data: %r’ % len(test_data)) # len of test data: 2132 # # 抽一條數據查看 print(train_data.examples[100].text) # [‘never’, ‘engaging’, ‘,’, ‘utterly’, ‘predictable’, ‘and’, ‘completely’, ‘void’, ‘of’, ‘anything’, ‘remotely’, # ‘interesting’, ‘or’, ‘suspenseful’] print(train_data.examples[100].label) # 0 # 為該樣本數據構建字典,并將子每個單詞映射到對應數字 TEXT.build_vocab(train_data) LABEL.build_vocab(train_data) # 查看字典長度 print(len(TEXT.vocab)) # 19206 # 查看字典中前10個詞語 print(TEXT.vocab.itos[:10]) # [‘《unk》’, ‘《pad》’, ‘,’, ‘the’, ‘a’, ‘and’, ‘of’, ‘to’, ‘。’, ‘is’] # 查找‘name’這個詞對應的詞典序號, 本質是一個dict print(TEXT.vocab.stoi[‘name’]) # 2063 # 構建迭代(iterator)類型的數據 train_iterator, test_iterator = data.BucketIterator.splits((train_data, test_data), batch_size=config.BATCH_SIZE, sort=False)

這樣一看,是不是減少了我們書寫的很多代碼了。下面就是老生常談的模型預測和模型效果查看了。

2 構建模型并訓練

模型的相關理論已在前文介紹,如果忘了可以回過頭看看。模型還是那個模型,如下:

import torch from torch import nn import config class TextCNN(nn.Module): # output_size為輸出類別(2個類別,0和1),三種kernel,size分別是3,4,5,每種kernel有100個 def __init__(self, vocab_size, embedding_dim, output_size, filter_num=100, kernel_list=(3, 4, 5), dropout=0.5): super(TextCNN, self).__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) # 1表示channel_num,filter_num即輸出數據通道數,卷積核大小為(kernel, embedding_dim) self.convs = nn.ModuleList([ nn.Sequential(nn.Conv2d(1, filter_num, (kernel, embedding_dim)), nn.LeakyReLU(), nn.MaxPool2d((config.MAX_SENTENCE_SIZE - kernel + 1, 1))) for kernel in kernel_list ]) self.fc = nn.Linear(filter_num * len(kernel_list), output_size) self.dropout = nn.Dropout(dropout) def forward(self, x): x = self.embedding(x) # [128, 50, 200] (batch, seq_len, embedding_dim) x = x.unsqueeze(1) # [128, 1, 50, 200] 即(batch, channel_num, seq_len, embedding_dim) out = [conv(x) for conv in self.convs] out = torch.cat(out, dim=1) # [128, 300, 1, 1],各通道的數據拼接在一起 out = out.view(x.size(0), -1) # 展平 out = self.dropout(out) # 構建dropout層 logits = self.fc(out) # 結果輸出[128, 2] return logits

為了方便模型訓練,測試書寫了兩個函數,當然也和之前的相同,如下:

def binary_acc(pred, y): “”“ 計算模型的準確率 :param pred: 預測值 :param y: 實際真實值 返回準確率 ”“” correct = torch.eq(pred, y).float() acc = correct.sum() / len(correct) return acc def train(model, train_data, optimizer, criterion): “”“ 模型訓練 :param model: 訓練的模型 :param train_data: 訓練數據 :param optimizer: 優化器 :param criterion: 損失函數 該論訓練各批次正確率平均值 ”“” avg_acc = [] model.train() # 進入訓練模式 for i, batch in enumerate(train_data): pred = model(batch.text) loss = criterion(pred, batch.label.long()) acc = binary_acc(torch.max(pred, dim=1)[1], batch.label) avg_acc.append(acc) optimizer.zero_grad() loss.backward() optimizer.step() # 計算所有批次數據的結果 avg_acc = np.array(avg_acc).mean() return avg_acc def evaluate(model, test_data): “”“ 使用測試數據評估模型 :param model: 模型 :param test_data: 測試數據 該論訓練好的模型預測測試數據,查看預測情況 ”“” avg_acc = [] model.eval() # 進入測試模式 with torch.no_grad(): for i, batch in enumerate(test_data): pred = model(batch.text) acc = binary_acc(torch.max(pred, dim=1)[1], batch.label) avg_acc.append(acc) return np.array(avg_acc).mean()

涉及相關包的話,就自行導入即可。下面就是創建模型和模型訓練測試了。好緊張,又到了這個環節了。

# 創建模型 text_cnn = model.TextCNN(len(TEXT.vocab), config.EMBEDDING_SIZE, len(LABEL.vocab)) # 選取優化器 optimizer = optim.Adam(text_cnn.parameters(), lr=config.LEARNING_RATE) # 選取損失函數 criterion = nn.CrossEntropyLoss() # 繪制結果 model_train_acc, model_test_acc = [], [] # 模型訓練 for epoch in range(config.EPOCH): train_acc = utils.train(text_cnn, train_iterator, optimizer, criterion) print(“epoch = {}, 訓練準確率={}”.format(epoch + 1, train_acc)) test_acc = utils.evaluate(text_cnn, test_iterator) print(“epoch = {}, 測試準確率={}”.format(epoch + 1, test_acc)) model_train_acc.append(train_acc) model_test_acc.append(test_acc) # 繪制訓練過程 plt.plot(model_train_acc) plt.plot(model_test_acc) plt.ylim(ymin=0.5, ymax=1.01) plt.title(“The accuracy of textCNN mode”) plt.legend([‘train’, ‘test’]) plt.show()

模型最后的結果如下:

模型訓練過程

這個和之前結果沒多大區別,但是在數據處理中卻省去更多的時間,并且也更加規范化。所以還是有時間學習一下torchtext咯。

3 總結

torchtext支持的自然語言處理處理任務還是比較多的,并且自身還帶有一些數據集。最近還在做實體識別任務,使用的算法模型是bi-lstm+crf。這個任務的本質就是序列標注,torchtext也是支持這種類型數據的處理的,后期有時間的話也會做相關的介紹,記得關注哦。對啦,本文的全部代碼和語料,我都上傳到github上了:https://github.com/Htring/NLP_Applications[4],后續其他相關應用代碼也會陸續更新,也歡迎star,指點哦。

原文標題:textCNN論文與原理——短文本分類(基于pytorch和torchtext)

文章出處:【微信公眾號:自然語言處理愛好者】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84453
  • 深度學習
    +關注

    關注

    73

    文章

    5492

    瀏覽量

    120977

原文標題:textCNN論文與原理——短文本分類(基于pytorch和torchtext)

文章出處:【微信號:NLP_lover,微信公眾號:自然語言處理愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    圖紙模板中的文本變量

    “ ?文本變量和系統自帶的內置變量,可以幫助工程師靈活、高效地配置標題欄中的信息,而不用擔心模板中的文字對象被意外修改。 ? ” 文本變量的語法 文本變量以?${VARIABLENAME}?的方式
    的頭像 發表于 11-13 18:21 ?117次閱讀
    圖紙模板中的<b class='flag-5'>文本</b>變量

    如何在文本字段中使用上標、下標及變量

    在KiCad的任何文本字段中,都可以通過以下的方式實現上標、下標、上劃線以及顯示變量及字段值的描述: 文本變量“文本變量”可以在 原理圖設置->工程->文本變量 中設置。下圖中設置了一
    的頭像 發表于 11-12 12:23 ?56次閱讀
    如何在<b class='flag-5'>文本</b>字段中使用上標、下標及變量

    RK3588 技術分享 | 在Android系統中使用NPU實現Yolov5分類檢測

    : NPU幫助機器完成更高效的翻譯、文本分類和情感分析,推動了自然語言處理技術的發展。 實例分享:Yolov5分類檢測 在RK3588處理器上,不僅可以基于Linux系統使用NPU,也可以
    發表于 10-24 10:13

    雷達的基本分類方法

    電子發燒友網站提供《雷達的基本分類方法.pdf》資料免費下載
    發表于 09-11 09:09 ?6次下載

    RK3588 技術分享 | 在Android系統中使用NPU實現Yolov5分類檢測

    : NPU幫助機器完成更高效的翻譯、文本分類和情感分析,推動了自然語言處理技術的發展。 實例分享:Yolov5分類檢測 在RK3588處理器上,不僅可以基于Linux系統使用NPU,也可以
    發表于 08-20 11:13

    利用TensorFlow實現基于深度神經網絡的文本分類模型

    要利用TensorFlow實現一個基于深度神經網絡(DNN)的文本分類模型,我們首先需要明確幾個關鍵步驟:數據預處理、模型構建、模型訓練、模型評估與調優,以及最終的模型部署(盡管在本文中,我們將重點放在前四個步驟上)。下面,我將詳細闡述這些步驟,并給出一個具體的示例。
    的頭像 發表于 07-12 16:39 ?699次閱讀

    llm模型有哪些格式

    Representations from Transformers):BERT是一種雙向預訓練模型,通過大量文本數據進行預訓練,可以用于各種NLP任務,如文本分類、問答、命名實體識別等。 b. GPT(
    的頭像 發表于 07-09 09:59 ?546次閱讀

    llm模型和chatGPT的區別

    LLM(Large Language Model)是指大型語言模型,它們是一類使用深度學習技術構建的自然語言處理(NLP)模型。LLM模型可以處理各種語言任務,如文本生成、文本分類、機器翻譯等。目前
    的頭像 發表于 07-09 09:55 ?922次閱讀

    卷積神經網絡在文本分類領域的應用

    在自然語言處理(NLP)領域,文本分類一直是一個重要的研究方向。隨著深度學習技術的飛速發展,卷積神經網絡(Convolutional Neural Network,簡稱CNN)在圖像識別領域取得了
    的頭像 發表于 07-01 16:25 ?620次閱讀

    鴻蒙ArkTS聲明式開發:跨平臺支持列表【文本通用】

    文本通用屬性目前只針對包含文本元素的組件,設置文本樣式。
    的頭像 發表于 06-13 15:09 ?434次閱讀
    鴻蒙ArkTS聲明式開發:跨平臺支持列表【<b class='flag-5'>文本</b>通用】

    交換機的基本分類

      交換機作為網絡通訊中的核心設備之一,其在網絡架構中起著至關重要的作用。隨著信息技術的飛速發展,交換機也在不斷演進和革新,以滿足日益復雜的網絡需求。本文將對交換機的分類及其特點進行詳細介紹,以期為讀者提供清晰、深入的理解。
    的頭像 發表于 06-06 11:06 ?1636次閱讀

    鴻蒙UI界面——@ohos.measure (文本計算)

    : MeasureOptions): number 計算指定文本單行布局下的寬度。 系統能力: SystemCapability.ArkUI.ArkUI.Full 參數: ? 參數名 類型 必填 說明 options
    的頭像 發表于 02-22 17:02 ?677次閱讀
    鴻蒙UI界面——@ohos.measure (<b class='flag-5'>文本</b>計算)

    了解如何使用PyTorch構建圖神經網絡

    圖神經網絡直接應用于圖數據集,您可以訓練它們以預測節點、邊緣和與圖相關的任務。它用于圖和節點分類、鏈路預測、圖聚類和生成,以及圖像和文本分類。
    發表于 02-21 12:19 ?717次閱讀
    了解如何使用PyTorch構建圖神經網絡

    人工智能中文本分類的基本原理和關鍵技術

    在本文中,我們全面探討了文本分類技術的發展歷程、基本原理、關鍵技術、深度學習的應用,以及從RNN到Transformer的技術演進。文章詳細介紹了各種模型的原理和實戰應用,旨在提供對文本分類技術深入理解的全面視角。
    的頭像 發表于 12-16 11:37 ?1179次閱讀
    人工智能中<b class='flag-5'>文本分類</b>的基本原理和關鍵技術

    vlookup函數能匹配文本

    ,第三個參數是返回的列數,第四個參數是是否進行近似匹配。 VLOOKUP函數可以用來匹配文本。在使用VLOOKUP函數時,要確保文本類型的數據與查找范圍中的數據類型一致,否則可能會出現匹配不到的情況。當文本類型的數據在查找范圍中
    的頭像 發表于 12-01 10:36 ?1.7w次閱讀