日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 循环神经网络 >内容正文

循环神经网络

循环神经网络和自然语言处理介绍

發(fā)布時(shí)間:2024/5/14 循环神经网络 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环神经网络和自然语言处理介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目標(biāo)

  • 1.了解token和tokenization。
  • 2.知道N-gram的概念和作用。
  • 3.知道文本向量化表示的方法。

1.文本的tokenization

1.1 基本概念

tokenization就是通常所說(shuō)的分詞,分出的每一個(gè)詞語(yǔ)稱(chēng)為token。

1.2 中英文分詞的方法

  • 把句子轉(zhuǎn)化為詞語(yǔ)
  • 把句子轉(zhuǎn)化為單個(gè)字

2. N-gram表示方法

2.1 基本概念

N-gram模型是一種語(yǔ)言模型(Language Model,LM),語(yǔ)言模型是一個(gè)基于概率的判別模型,它的輸入是一句話(單詞的順序序列),輸出是這句話的概率,即這些單詞的聯(lián)合概率(joint probability)。

2.2 N-gram用途

N-gram用途有下:

  • 1.詞性標(biāo)注
  • 2.垃圾短信分類(lèi)
  • 3.分詞器
  • 4.機(jī)器翻譯和語(yǔ)音識(shí)別

3. 向量化

把文本轉(zhuǎn)化成向量有兩種方法:

  • 1.轉(zhuǎn)化為one-hot編碼
  • 2.轉(zhuǎn)化為word embedding

3.1 one-hot編碼

one-hot編碼使用稀疏的向量表示文本,占用空間多

3.2 word embedding

word embedding使用了浮點(diǎn)型的稠密矩陣來(lái)表示token,根據(jù)詞典的大小,我們的向量通常使用不同的維度,例如100,256,300等等。其中向量中的每一個(gè)值都是超參數(shù),其初始值都是隨機(jī)生成的,之后會(huì)在訓(xùn)練的過(guò)程中進(jìn)行學(xué)習(xí)而獲得。
我們會(huì)把所有的文本轉(zhuǎn)化為向量,把句子用向量來(lái)表示。
但是在這中間,我們會(huì)先把token使用數(shù)字來(lái)表示,再把數(shù)字使用向量來(lái)表示。

3.3 word embedding API

使用torch.nn.Embedding(num_embedding,embedding_dim)
參數(shù)介紹:

  • 1.num_embedding:詞典的大小
  • 2.embedding_dim:embedding的維度
    使用方法:
embedding=nn.Embedding(vocab_size,300)#實(shí)例化 input_embeded=embedding(input)#進(jìn)行embedding的操作

形狀的變化:從[batch_size,seq_len]變成[batch_size,seq_len,embedding_dim]。

4. 文本情感分類(lèi)

4.1 目標(biāo)

  • 1.知道文本處理的基本方法
  • 2.能夠使用數(shù)據(jù)實(shí)現(xiàn)情感分類(lèi)

4.2 思路分析

首先可以把上述問(wèn)題定義為分類(lèi)問(wèn)題,情感評(píng)分為1-10。依據(jù)之前的學(xué)習(xí)內(nèi)容,大致流程如下:

  • 1.準(zhǔn)備數(shù)據(jù)集
  • 2.構(gòu)建模型
  • 3.模型訓(xùn)練
  • 4.模型評(píng)估

4.3 準(zhǔn)備數(shù)據(jù)集

在這一部分,我們需要實(shí)例化dataset,準(zhǔn)備dataloader。其中需要注意:

  • 1.如何完成基礎(chǔ)的Dataset和Dataloader的構(gòu)建;
  • 2.每個(gè)batch中文本的長(zhǎng)度不一致的問(wèn)題如何解決;
  • 3.每個(gè)batch中文本如何轉(zhuǎn)化為數(shù)字序列。

4.4 文本序列化

實(shí)現(xiàn)文本序列化考慮的問(wèn)題:

  • 1.如何使用字典把詞語(yǔ)和數(shù)字進(jìn)行對(duì)應(yīng)
  • 2.不同的詞語(yǔ)出現(xiàn)的次數(shù)不盡相同,是否需要對(duì)高頻或者低頻詞語(yǔ)進(jìn)行過(guò)濾,以及總的詞語(yǔ)數(shù)量是否需要進(jìn)行限制
  • 3.得到詞典之后,如何把數(shù)字序列轉(zhuǎn)化為句子
  • 4.不同句子長(zhǎng)度不同,每個(gè)batch的句子如何構(gòu)造出相同的長(zhǎng)度(可以對(duì)短句子填充特殊字符)
  • 5.對(duì)于在測(cè)試集中新出現(xiàn)的詞語(yǔ),可以用特殊字符代理
    思路分析:
  • 1.對(duì)所有句子進(jìn)行分詞
  • 2.詞語(yǔ)存入字典,根據(jù)次數(shù)對(duì)詞語(yǔ)進(jìn)行過(guò)濾,并統(tǒng)計(jì)次數(shù)
  • 3.實(shí)現(xiàn)文本轉(zhuǎn)數(shù)字序列的方法
  • 4.實(shí)現(xiàn)數(shù)字序列轉(zhuǎn)文本方法

實(shí)現(xiàn)如下:

  • 1.dataset.py:
from torch.utils.data import DataLoader,Dataset from lib import ws,max_len import torch import os import re#利用正則方法分詞,并且去除不必要的符號(hào) def tokenlize(content):re.sub("<.*?>"," ",content)fileters=['\.','\t','\n','\x96','\x97']content=re.sub("|".join(fileters)," ",content)tokens=[i.strip() for i in content.spilt()]return tokensclass ImbDataset(Dataset):def __init__(self,train=True):self.train_data_path=r"..."#訓(xùn)練集數(shù)據(jù)讀取路徑self.test_data_path = r"..." #測(cè)試集數(shù)據(jù)讀取路徑data_path=self.train_data_path if train else self.test_data_path#把所有文件名放入列表,即pos和neg兩個(gè)文件夾存入列表temp_data_path=[os.path.join(data_path,"pos"),os.path.join(data_path,"neg")]self.total_file_path=[]#所有的評(píng)論文件的路徑pathfor path in temp_data_path:file_name_list=os.listdir(path)#得到pos或者neg文件夾內(nèi)部所有文件名file_path_list=[os.path.join(path,i) for i in file_name_list if i.endswith(".txt")]#過(guò)濾不是以.txt結(jié)尾的文件self.total_file_path.extend(file_path_list)def __getitem__(self, index):file_path=self.total_file_path[index]#獲取labellabel_str=file_path.split("\\")[-2]label=0 if label_str =="neg" else 1#獲取內(nèi)容tokens=tokenlize(open(file_path).read())return tokens,labeldef __len__(self):return len(self.total_file_path)def collate_fn(batch):""":param batch: ([tokens,label],[tokens,label],...):return:"""content,label=list(zip(*batch))content=[ws.transform(i,max_len=max_len) for i in content]content=torch.LongTensor(content)#轉(zhuǎn)化成LongTensor,否則在model.py中的embedding()中無(wú)法執(zhí)行,原因是embedding的對(duì)象必須是LongTensorlabel=torch.LongTensor(label)return content,labeldef get_dataloader(train=True):imdb_dataset=ImbDataset()data_loader=DataLoader(imdb_dataset,batch_size=2,shuffle=True,collate_fn=collate_fn)return data_loader
  • 2.word2sequence.py:
import numpy as np import osclass word2sequence():UNK_TAG="UNK"PAD_TAG="PAD"UNK=0PAD=1def __init__(self):#字典,初始情況下存入兩個(gè)特殊字符self.__dict__={self.UNK_TAG:self.UNK,self.PAD_TAG:self.PAD}self.fited=Falseself.count={}#統(tǒng)計(jì)詞頻def fit(self,sentence):"""把單個(gè)句子保存到dict中:param sentence: [word1,word2,word3...]:return:"""for word in sentence:self.count[word]=self.count.get(word,0)+1#統(tǒng)計(jì)詞頻def bulid_vocab(self,min=0,max=None,max_features=None):"""生成詞典:param min:最小出現(xiàn)的次數(shù):param max:最大的次數(shù):param max_features:保留的詞語(yǔ)數(shù):return:"""# 刪除count中詞頻小于min的單詞if min is not None:self.count={word:value for word,value in self.count if value>=min}# 刪除count中詞頻大于max的單詞if max is not None:self.count={word:value for word,value in self.count if value<max}#限制保留的詞語(yǔ)數(shù)if max_features is not None:temp=sorted(self.count.items(),key=lambda x:x[-1],reverse=True)[:max_features]#排序,取前max_features個(gè)詞頻的單詞self.count=dict(temp)#sorted之后,結(jié)果為列表,需要重新轉(zhuǎn)換成字典for word in self.count:self.dict[word]=len(self.dict)#給每個(gè)單詞進(jìn)行賦值,由于初始情況已經(jīng)有兩個(gè)特殊字符,所以新進(jìn)入的第一個(gè)單詞的值為2,此后不斷疊加#得到一個(gè)翻轉(zhuǎn)的dict字典(利用鍵和值的重新匹配)self.inverse_dict=dict(zip(self.dict.values(),self.dict.keys()))def transform(self,sentence,max_len=None):"""把句子轉(zhuǎn)化成序列:param sentence:[wword1,word2,word3...]:param max_len: int 對(duì)句子進(jìn)行填充或者裁剪:return:"""if max_len is not None:if max_len>len(sentence):#填充sentence=sentence+[self.PAD_TAG]*(max_len-len(sentence))if max_len<len(sentence):#裁剪sentence=sentence[:max_len]return [self.dict.get(word,self.UNK) for word in sentence]def inverse_transform(self,indices):"""把序列轉(zhuǎn)化成句子:param indices: [1,2,3...]:return:"""return [self.dinverse_dict.get(idx) for idx in indicesfrom main import word2sequence import pickle from dataset import tokenlize #從一開(kāi)始定義的數(shù)據(jù)集中導(dǎo)入tokenlize from tqdm import tqdm#顯示可迭代對(duì)象的加載進(jìn)度if __name__=='__main__':ws=word2sequence()path=r"..."#寫(xiě)入路徑temp_data_path=[os.path.join(path,"pos"),os.path.join(path,"neg")]for data_path in temp_data_path:file_paths=[os,path.join(data_path,file_name) for file_name in os.listdir(data_path)]for file_path in tqdm(file_paths):sentence = tokenlize(open(file_path).read())ws.fit(sentence)ws.bulid_vocab(min=10)pickle.dump(ws,open("./model/ws.pkl","wb"))#保存文件
  • 3.lib.py:
import pickle ws=pickle.load(open("./model/ws/pkl","rb"))#保存數(shù)據(jù) max_len=20

4.5 構(gòu)建模型

這里我們只聯(lián)系使用word embedding,所以模型只有一層,即:

  • 1.數(shù)據(jù)經(jīng)過(guò)word embedding
  • 2.數(shù)據(jù)通過(guò)全連接層返回結(jié)果,計(jì)算log_softmax
    為了方便理解,我們只使用了一層模型,所以效果可能并不是特別理想。
    model.py代碼如下:
import torch import torch.nn as nn from lib import ws,max_len import torch.nn.functional as Fclass MyModel(nn.Module):def __init__(self):super(MyModel,self).__init__()self.embedding=nn.Embedding(len(ws),100)#兩個(gè)參數(shù),前一個(gè)是訓(xùn)練的詞語(yǔ)的數(shù)量,后一個(gè)是每一個(gè)詞語(yǔ)的維度self.fc=nn.Linear(max_len*100,2)#Linear()函數(shù)對(duì)象必須是二維,所以在forward里面必須進(jìn)行view()操作def forward(self,input):""":param input: [batch_size,max_len]:return:"""x=self.embedding(input)#進(jìn)行embedding操作,形狀成為:[batch_size,max_len,100]x=x.view([-1,max_len*100])out=self.fc(x)return F.log_softmax(out,dim=-1)

總結(jié)

以上是生活随笔為你收集整理的循环神经网络和自然语言处理介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。