wordpress展示型外貿(mào)網(wǎng)站杭州余杭區(qū)抖音seo質(zhì)量高
目錄
一、項目介紹
1、項目任務(wù)
2、評論信息內(nèi)容
3、待思考問題
1)目標
2)輸入字詞格式
3)每一次傳入的詞/字的個數(shù)是否就是評論的長度
4)一條評論如果超過32個詞/字怎么處理? ?? ?
5)一條評論如果沒有32個詞/字怎么處理? ?? ?
6)如果語料庫中的詞/字太多是否可以壓縮? ?? ?
7)被壓縮的詞/字如何處理? ?? ?
二、項目實施
1、讀取文件,建立詞表
1)代碼內(nèi)容
2)部分內(nèi)容拆分解析
3)代碼運行結(jié)果
4)調(diào)試模式
2、評論刪除、填充,切分數(shù)據(jù)集
1)代碼內(nèi)容
2)運行結(jié)果
3)調(diào)試模式
一、項目介紹
1、項目任務(wù)
????????對微博評論信息的情感分析,建立模型,自動識別評論信息的情緒狀態(tài)。
2、評論信息內(nèi)容
3、待思考問題
????????1)目標
????????????????將每條評論內(nèi)容轉(zhuǎn)換為詞向量。
????????2)輸入字詞格式
????????????????每個詞/字轉(zhuǎn)換為詞向量長度(維度)200,使用騰訊訓(xùn)練好的詞向量模型有4960個維度,需要這個模型或者文件可私信發(fā)送。
????????3)每一次傳入的詞/字的個數(shù)是否就是評論的長度
? ? ? ? ? ? ? ? 應(yīng)該是固定長度,如何固定長度接著看,固定長度每次傳入數(shù)據(jù)與圖像相似,例如輸入評論長度為32,那么傳入的數(shù)據(jù)為32*200的矩陣,表示這一批詞的獨熱編碼,200表示維度
????????4)一條評論如果超過32個詞/字怎么處理? ?? ?
? ? ? ? ? ? ? ? 超出的直接刪除后面的內(nèi)容
????????5)一條評論如果沒有32個詞/字怎么處理? ?? ?
????????????????缺少的內(nèi)容,統(tǒng)一使用一個數(shù)字(非詞/字的數(shù)字)替代,項目中使用<PAD>填充
????????6)如果語料庫中的詞/字太多是否可以壓縮? ?? ?
????????????????可以,某些詞/字出現(xiàn)的頻率比較低,可能訓(xùn)練不出特征。因此可以選擇頻率比較高的詞來訓(xùn)練,項目中選擇4760個。
????????7)被壓縮的詞/字如何處理? ?? ?
????????????????可以統(tǒng)一使用一個數(shù)字(非詞/字的數(shù)字)替代,即選擇了評論固定長度的文字后,這段文字內(nèi)可能有頻率低的字,將其用一個數(shù)字替代,項目內(nèi)使用<UNK>替代
二、項目實施
1、讀取文件,建立詞表
????????1)代碼內(nèi)容
????????????????將下列代碼寫入命名為vocab_create.py的文件內(nèi),方便見名知義及調(diào)用內(nèi)部函數(shù)
from tqdm import tqdm # 導(dǎo)入進度條函數(shù)
import pickle as pkl # 將序列化對象保存為一個二進制字節(jié)流文件MAX_VOCAB_SIZE = 4760 # 詞表長度限制長度,總共10000+個無重復(fù)的字
UNK,PAD = '<UNK>','<PAD>' # 未知字,padding符號 今天天氣真好,我咁要去打球->今天天氣真好,我<UNK>要去打球<PAD><PAD><PAD><PAD><PAD>def build_vocab(file_path,max_size,min_freq): # 參數(shù)分別表示,文件地址、詞表最大長度、剔除的最小詞頻數(shù)"""函數(shù)功能:基于文本內(nèi)容建立詞表vocab,vocab中包含語料庫中的字”"""tokenizer = lambda x: [y for y in x] # 定義了一個函數(shù)tokenizer,功能為分字,返回一個列表,存放每一個字vocab_dic = {} # 用于保存字的字典,鍵值對,鍵為詞,值為索引號with open(file_path,'r',encoding='UTF-8') as f: # 打開評論文件i = 0for line in tqdm(f): # 逐行讀取文件內(nèi)容,并顯示循環(huán)的進度條if i == 0: # 跳過文件中的第1行表頭無用內(nèi)容,然后使用continue跳過當(dāng)前當(dāng)次循環(huán)i += 1continuelin = line[2:].strip() # 使用字符串切片,獲取評論內(nèi)容,剔除標簽和逗號,不用split分割,因為評論內(nèi)容中可能會存在逗號。if not lin: # 如果lin中沒有內(nèi)容則continue,表示沒有內(nèi)容,跳過這一行continuefor word in tokenizer(lin): # 遍歷列表里的每一個元素,tokenizer(lin)將每一行的評論中的每個字符分成單獨的一個,然后存入列表vocab_dic[word] = vocab_dic.get(word,0)+1 # 統(tǒng)計每個字出現(xiàn)的次數(shù),并以字典保存,字典的get用法,讀取鍵word對應(yīng)的值,如果沒有讀取到則將其值表示為0,這里的值表示出現(xiàn)次數(shù),因為這里每出現(xiàn)一次值都加1,鍵獨一無二,值可以相同# 篩選詞頻大于1的,并排序字典中每個字的值的大小,降序排列,(拆分見下一條代碼塊)vocab_list = sorted([_ for _ in vocab_dic.items() if _[1] > min_freq],key=lambda x:x[1],reverse=True)[:max_size] # 先通過for循環(huán)加if條件語句篩選出字典的值大于傳入?yún)?shù)min_freq的鍵值對列表,然后對其排序,最后取出前max_size個元素# 建立新的字典vocab_dic = {word_count[0]:idx for idx,word_count in enumerate(vocab_list)} # 列表中存放每個元素是一個元組,元組里存放的是鍵值對的信息,將每個元組遍歷出來,給予索引0的值一個索引,以此給每個字符打上索引值,返回一個字典vocab_dic.update({UNK:len(vocab_dic),PAD:len(vocab_dic)+1}) # 在字典中更新鍵值對 {'<UNK>':4760,'<PAD>':4761}print(vocab_dic) # 打印全新的字典# 保存字典,方便直接使用pkl.dump(vocab_dic,open('simplifyweibo_4_moods.pkl','wb')) # 此時統(tǒng)計了所有的文字,并將每一個獨一無二的文字都賦予了獨熱編碼,將上述的字典保存為一個字節(jié)流文件print(f'Vocab size:{len(vocab_dic)}') # 將評論的內(nèi)容,根據(jù)你現(xiàn)在詞表vocab_dic,轉(zhuǎn)換為詞向量return vocab_dic # 輸入文件地址,對內(nèi)部文件進行處理,設(shè)定最大長度,返回該文件里的所有獨一無二的字符及其對應(yīng)的索引的字典,其中包含兩個填充字符及其索引,一個是填充未知字,一個是填充符號"""詞庫的創(chuàng)建"""
# 此處設(shè)置下列判斷語句來執(zhí)行的目的是為了防止外部函數(shù)調(diào)用本文件時運行下列代碼
if __name__ == '__main__': # 當(dāng)自己直接執(zhí)行本文件代碼,會運行main,中的代碼vocab = build_vocab('simplifyweibo_4_moods.csv',MAX_VOCAB_SIZE,1)print('vocab')# 如果是調(diào)用本代碼,則不會執(zhí)行main中的代碼
? ? ? ? 2)部分內(nèi)容拆分解析
vocab_list = sorted([_ for _ in vocab_dic.items() if _[1] > min_freq],key=lambda x:x[1],reverse=True)[:max_size]vocab_list = [] # 空列表,存放元組形式的空列表
for a in vocab_dic.items(): # 遍歷出來字典中的鍵值對,用a表示if a[1] > min_freq: # 判斷鍵值對的值是否大于min_freqvocab_list.append(a)
vocab_list = sorted(vocab_list,key=lambda x:x[1],reverse=True) # 使用sorted函數(shù)排序,key表示排序的依據(jù),使用匿名函數(shù),并索引鍵值對的值排序,reverse為布爾值,是否降序
vocab_list = vocab_list[ : max_size] # 索引前max_size個值
? ? ? ? 3)代碼運行結(jié)果
? ? ? ? 4)調(diào)試模式
2、評論刪除、填充,切分數(shù)據(jù)集
? ? ? ? 1)代碼內(nèi)容
? ? ? ? ? ? ? ? 將下列代碼放入創(chuàng)建的文件名為load_dataset.py的文件中,后面還有代碼需要往里增加
from tqdm import tqdm
import pickle as pkl
import random
import torchUNK,PAD = '<UNK>','<PAD>' # 未知字,padding符號
def load_dataset(path,pad_size=70): # path為文件地址,pad_size為單條評論字符的最大長度contents = [] # 用來存儲轉(zhuǎn)換為數(shù)值標號的句子,元祖類型,里面存放每一行每一個字的對應(yīng)詞庫的索引、每一行對應(yīng)的標簽、每一行的實際長度70及以內(nèi)vocab = pkl.load(open('simplifyweibo_4_moods.pkl','rb')) # 讀取vocab詞表文件,rb二進制只讀tokenizer = lambda x:[y for y in x] # 自定義函數(shù)用來將字符串分隔成單個字符并存入列表with open(path,'r',encoding='utf8') as f: # 打開評論文件i = 0for line in tqdm(f): # 遍歷文件內(nèi)容的每一行,同時展示進度條if i == 0: # 此處循環(huán)目的為了跳過第一行的無用內(nèi)容i += 1continueif not line: # 篩選是不是空行,空行則跳過continuelabel = int(line[0]) # 返回當(dāng)前行的標簽,整型content = line[2:].strip('\n') # 取出標簽和逗號后的所有內(nèi)容,同時去除前后的換行符words_line = [] # 用于存放每一行評論的每一個字對應(yīng)詞庫的索引值token = tokenizer(content) # 將每一行的內(nèi)容進行分字,返回一個列表seq_len = len(token) # 獲取一行實際內(nèi)容的長度if pad_size: # 非0即Trueif len(token) < pad_size: # 如果一行的字符數(shù)少于70,則填充字符<PAD>,填充個數(shù)為少于的部分的個數(shù)token.extend([PAD]*(pad_size-len(token)))else: # 如果一行的字大于70,則只取前70個字token = token[:pad_size] # 如果一條評論種的寧大于或等于70個字,索引的切分seq_len = pad_size # 當(dāng)前評論的長度# word to idfor word in token: # 遍歷實際內(nèi)容的每一個字符words_line.append(vocab.get(word,vocab.get(UNK))) # vocab為詞庫,其中為字典形式,使用get去獲取遍歷出來的字符的值,值可表示索引值,如果該字符不在詞庫中則將其值增加為字典中鍵UNK對應(yīng)的值,words_line中存放的是每一行的每一個字符對應(yīng)的索引值contents.append((words_line,int(label),seq_len)) # 將每一行評論的字符對應(yīng)的索引以及這一行評論的類別,還有當(dāng)前評論的實際內(nèi)容的長度,以元組的形式存入列表random.shuffle(contents) # 隨機打亂每一行內(nèi)容的順序"""切分80%訓(xùn)練集、10%驗證集、10%測試集"""train_data = contents[ : int(len(contents)*0.8)] # 前80%的評論數(shù)據(jù)作為訓(xùn)練集dev_data = contents[int(len(contents)*0.8):int(len(contents)*0.9)] # 把80%~90%的評論數(shù)據(jù)集作為驗證數(shù)熱t(yī)est_data = contents[int(len(contents)*0.9):] # 90%~最后的數(shù)據(jù)作為測試數(shù)據(jù)集return vocab,train_data,dev_data,test_data # 返回詞庫、訓(xùn)練集、驗證集、測試集,數(shù)據(jù)集為列表中的元組形式if __name__ == '__main__':vocab,train_data,dev_data,test_data = load_dataset('simplifyweibo_4_moods.csv')print(train_data,dev_data,test_data)print('結(jié)束')