From 9b3e6f4e71ce8ec55de795235d57d27adf9b3e83 Mon Sep 17 00:00:00 2001 From: jimmy Date: Wed, 8 Apr 2020 17:20:04 +0800 Subject: [PATCH] lstm --- Lstm_rumor/LSTM.py | 301 ++++++++++++++++++++++++++++++++++++++ Lstm_rumor/README.md | 36 +++++ Lstm_rumor/att_acc_1.png | Bin 0 -> 22774 bytes Lstm_rumor/att_loss_1.png | Bin 0 -> 23400 bytes Lstm_rumor/train_w2v.py | 27 ++++ 5 files changed, 364 insertions(+) create mode 100755 Lstm_rumor/LSTM.py create mode 100644 Lstm_rumor/README.md create mode 100644 Lstm_rumor/att_acc_1.png create mode 100644 Lstm_rumor/att_loss_1.png create mode 100755 Lstm_rumor/train_w2v.py diff --git a/Lstm_rumor/LSTM.py b/Lstm_rumor/LSTM.py new file mode 100755 index 0000000..6160da9 --- /dev/null +++ b/Lstm_rumor/LSTM.py @@ -0,0 +1,301 @@ +import numpy as np +import matplotlib.pyplot as plt +import jieba +import jieba.analyse +import pickle +import gensim +import re +import pandas as pd +import collections + + +import pandas as pd +import numpy as np +import torch +import random +import math +import jieba +import matplotlib.pyplot as plt + + +import gensim +import pickle +from torch.utils.data import TensorDataset,DataLoader,Dataset +class TextData:#text size:(n,len),type:list(text) + def __init__(self,tokenmode,vocabsize): + self.tokenmode=tokenmode + self.vocabsize=vocabsize + def strlen_count(self,text):#统计序列长度 + str=[ len(i) for i in text] + strlen=sorted(str) + return strlen[int(len(str)*0.9)],strlen + def strlen_canvas(self,text):#序列长度可视化 + _,b=self.strlen_count(text) + plt.ylabel("strlen") + plt.xlabel("str num") + plt.title('String Length') + ticks = [int(i) for i in range(len(b))] + plt.xticks(range(len(b)), ticks) + y=b + x=[int(i) for i in range(len(b))] + plt.bar(x, y, facecolor='red', width=0.2) + for x, y in zip(x, y): + plt.text(x + 0.05, y + 0.05, '%i' % y, ha='right', va='bottom') + plt.legend() + plt.show() + plt.close() + def text_token(self,text):#序列分词 + token=[] + if self.tokenmode=="Word": + for i in text: + token.append(jieba.lcut(i)) + elif self.tokenmode=='Char': + for i in text: + token.append(list(i)) + return token + + def text_dict(self,text):#生成索引词典 + vocab={} + vocab_list=[] + token=self.text_token(text) + for a in token: # 生成词典 + for b in a: + vocab_list.append(b) + word_counts = collections.Counter(vocab_list) + word_counts = word_counts.most_common(self.vocabsize) + for index, con in enumerate(word_counts): + vocab[str(con[0])] = index + 2 + vocab["UNK"] = 1 + vocab["PAD"] = 0 + return vocab + def dict_save(self,filename,text):#词典保存代码 + vocab=self.text_dict(text) + output = open(filename, 'wb') + pickle.dump(vocab, output) + output.close() + def text_str(self,text):#文本补长代码 + data_text=self.text_token(text) + MAXLEN,_=self.strlen_count(text) + # MAXLEN=100 + for j in range(len(data_text)): # 文本补长 + if len(data_text[j]) <= MAXLEN: + data_text[j].extend(['PAD'] * (MAXLEN - len(data_text[j]))) + elif len(data_text[j]) > MAXLEN: + data_text[j] = data_text[j][0:MAXLEN] + return data_text + + def text_matrix(self,text):#文本矩阵化 + data_text=self.text_str(text) + vocab=self.text_dict(text) + for m in range(len(data_text)): + for n in range(len(data_text[m])): + if data_text[m][n] in vocab.keys(): + data_text[m][n] = vocab[data_text[m][n]] + elif data_text[m][n] not in vocab.keys(): + data_text[m][n] = vocab['UNK'] + return np.array(data_text) + def text_tf_idf(self,text):#生成TFIDF矩阵 + token=self.text_token(text) + token=[" ".join(j) for j in token] + tf_idf_value = TfidfVectorizer() + tf_idf_matrix = tf_idf_value.fit_transform(token) + print(tf_idf_value.vocabulary_) + return tf_idf_matrix.toarray() +class Text_data(Dataset): + def __init__(self): + self.trainData = traindata + self.label=trainlabel + + def __len__(self): + return len(self.trainData) + + def __getitem__(self, idx): + + data = self.trainData[idx] + label=self.label[idx] + + return data,label + +class Test_data(Dataset): + def __init__(self): + self.testData = testdata + self.label = testlabel + + def __len__(self): + return len(self.testData) + + def __getitem__(self, idx): + data = self.testData[idx] + label=self.label[idx] + + return data, label +class Lstm_layer(torch.nn.Module): + def __init__(self, vocab_size, embedding_size, output_size,hidden_dims): + super(Lstm_layer, self).__init__() + self.embed = torch.nn.Embedding(vocab_size, embedding_size) + self.lstm_net = torch.nn.LSTM(embedding_size, hidden_dims) + self.linear = torch.nn.Linear(5488200,output_size) + + def forward(self, text): + + embedded = self.embed(text.long()) # [seq_len, batch_size, embedding_size] + output, (final_hidden_state, final_cell_state)=self.lstm_net(embedded) + output=output.view(output.size()[0],-1) + x=self.linear(output) + return x + +def binary_accuracy(preds, y):#统计每个batch训练准确度 + rounded_preds = torch.round(torch.sigmoid(preds)) + correct = (rounded_preds == y).int().to('cpu') + count=[] + for i in range(len(correct)): + if set(correct[i].numpy())=={1}: + count.append(1) + else: + count.append(0) + + acc = sum(count) / len(count) + return acc +def train(model, iter, optimizer, loss_fn,epoch): + epoch_loss, epoch_acc = 0., 0. + # model.train() + total_len = 0. + for i,data in enumerate(iter): + # 前向传播 + data[0]=data[0].to(device) + data[1]=data[1].to(device) + y_pred = model(data[0]).squeeze() + # 计算loss + loss = loss_fn(y_pred.float(), data[1].float()) + acc=binary_accuracy(y_pred.float(), data[1].float()) + + + # 更新参数 + optimizer.zero_grad() + loss.backward() + optimizer.step() + epoch_loss += loss.item() * len(data[1]) + epoch_acc += acc* len(data[1]) + total_len += len(data[0]) + train_loss=epoch_loss / total_len + train_acc=epoch_acc / total_len + print("Epoch:", epoch, "iter:", i, "Train Loss:", train_loss, "Train Acc:", train_acc,"train_len:",total_len,'lr',optimizer.param_groups[0]['lr']) + + return epoch_loss / total_len, epoch_acc / total_len + + +def evaluate(model, iter, loss_fn,epoch): + epoch_loss, epoch_acc = 0., 0. + model.eval() + total_len = 0. + for i,data in enumerate(iter): + data[0] = data[0].to(device) + data[1] = data[1].to(device) + model = model.to(device) + loss_fn = loss_fn.to(device) + y_pred= model(data[0]).squeeze() + loss = loss_fn(y_pred.float(), data[1].float()) + acc = binary_accuracy(y_pred.float(), data[1].float()) + + epoch_loss += loss.item() * len(data[1]) + epoch_acc += acc* len(data[1]) + total_len += len(data[1]) + valid_loss=epoch_loss / total_len + valid_acc=epoch_acc/total_len + print("Epoch:", epoch, "Valid Loss:", valid_loss, "Valid Acc:", valid_acc) + print("_____________________________________第"+str(epoch+1)+"轮训练结束____________________________________________________") + model.train() + + return epoch_loss / total_len, epoch_acc / total_len +def plot_pic(train,test,name,y_name,x_name,file_name): + plt.plot(train) + plt.plot(test) + plt.title(name) + plt.ylabel(y_name) + plt.xlabel(x_name) + plt.legend(['Train', 'Test'], loc='upper left') + plt.savefig(file_name) + plt.close() +if __name__ == '__main__': + use_cuda = torch.cuda.is_available() + # 固定随机种子 + random.seed(1) + np.random.seed(1) + torch.manual_seed(1) + if use_cuda: + torch.cuda.manual_seed(1) + + data=pd.read_csv('train.csv') + data=data + text_train=list(data.iloc[:,1]) + label=list(data.iloc[:,0]) + for v in range(len(label)): + if label[v]==1: + label[v]=[0,1] + elif label[v]==0: + label[v]=[1,0] + datadeal = TextData(tokenmode="Word", vocabsize=5000) + datanum=datadeal.text_matrix(text_train) + vocab=datadeal.text_dict(text_train) + + #转化为tensor + Query2 = datanum + traindata = Query2[0:1000] + testdata = Query2[1000:] + trainlabel = label[0:1000] + testlabel = label[1000:] + trainlabel = torch.tensor([x for x in trainlabel]) + traindata = torch.tensor(traindata) + testdata = torch.tensor(testdata) + testlabel = torch.tensor([x for x in testlabel]) + traindata = Text_data() # 训练集数据生成器 + # traindata=TensorDataset(torch.tensor(traindata),torch.tensor([int(x) for x in trainlabel])) + trainloader = DataLoader(traindata, batch_size=32, drop_last=True, shuffle=True) + validdata = Test_data() # 验证集数据生成器 + validloader = DataLoader(validdata, batch_size=32) + + model = gensim.models.Word2Vec.load('./model/text_w2v.model') # 词向量 + embedding_matrix = np.zeros((len(vocab), 100)) + for word, i2 in vocab.items(): + if word in model: + embedding_matrix[i2] = np.asarray(model[word]) + elif word not in model: + embedding_matrix[i2] = np.random.uniform(-0.25, 0.25, 100) + + model = Lstm_layer(vocab_size=len(vocab), embedding_size=100, output_size=2,hidden_dims=100) # 模型构建 + # model.initialized_weights() + pretrained_embedding = torch.from_numpy(embedding_matrix) + model.embed.weight.data.copy_(pretrained_embedding) + lr = 0.001 + optimizer = torch.optim.Adam(model.parameters(), lr=lr) + loss_fn = torch.nn.BCEWithLogitsLoss() + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + model = model.to(device) + loss_fn = loss_fn.to(device) + N_EPOCHS = 20 + best_valid_acc = 0. + trainloss = [] + val_loss = [] + trainacc = [] + val_acc = [] + lr_list = [] + scheduler_lr = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=0.1, mode='min', patience=10, + cooldown=0, min_lr=0.00001, verbose=0, eps=10 ** -6) + for epoch in range(N_EPOCHS): + train_loss, train_acc = train(model, trainloader, optimizer, loss_fn, epoch) + valid_loss, valid_acc = evaluate(model, validloader, loss_fn, epoch) + trainloss.append(train_loss) + val_loss.append(valid_loss) + trainacc.append(train_acc) + val_acc.append(valid_acc) + if valid_acc > best_valid_acc: + best_valid_acc = valid_acc + torch.save(model.state_dict(), "./model/wordavg-model.pth") + scheduler_lr.step(train_loss) + + plot_pic(trainloss, val_loss, 'model loss', 'y_loss', 'epoch', './att_loss_1.png') + plot_pic(trainacc, val_acc, 'model acc', 'y_acc', 'epoch', './att_acc_1.png') + + print(1) + + diff --git a/Lstm_rumor/README.md b/Lstm_rumor/README.md new file mode 100644 index 0000000..04aacc5 --- /dev/null +++ b/Lstm_rumor/README.md @@ -0,0 +1,36 @@ +# boldocde + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/Lstm_rumor/att_acc_1.png b/Lstm_rumor/att_acc_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e59b545463cea5caca75ad21e55dca39879fc08e GIT binary patch literal 22774 zcmdSBcRZHy|37-&cCsb1N7>mcdy7h_kR7E$_MUgyJ1s>bDr8sox`mKLnISu5?>)}z z(&u-6-^V%M?>Udh`R{lxSzs z;`z-se+~s9f19e_i^J{5xfs?Xlo>SDxgHo}2r=uY5c` z#l&}iQGHnS*L}fGf)@cl%}&j4g%E1^Sr;Nw=7b-mdgQ#iy86Uz1|$+L*dxPdhqDQ( zH;~hCc14^F3un~>!!Qrg+uKDD8aTau>i_>Y2TqMOMn7!1={=iQDjP6g6R^wvxTVl( zSTQ~^IwGs|e;#O7ufpb_8{8@5Hc7Tnxv0oMMg&td^6PeLC_71WdwbJhxf?YzbIkPg zovO8;7upu|4GbO-v-wl$>+5&e6*DOKN|ZSK`Z-ti{yo2-MHK^4FouJJ!}!x3>i6&8 zn+O_tdP*%+%nF5sg{kIrTkmZx_m#WdP8_mvbQEF@SkotCk|L8$p}2A5M%nH{rOWbI zowa&|292^+NSfc&i&8E+x$Mp>jCuKA9^C{XDHkrdHSV;2>qn|%#*xPDS`m((` zRe4pBbHzy~`?#|Df&IbWHiM`&!NF3vl2vcM`PT2n!0?U^J%_Lt(IdIv-$Pp(t`++m6zAJ_P5hzVep*%!PYo~#2u<3zeNRfMAxoeGp_MJhbU7K zd`pp|-`!kns;5+nq2|&Y38qxUrE5edJ^i!0Sljf3?+O(?eK?(fAv-%evRJb#G})FM zzBwGk<~8JVJ9B72de}c0pP0g`?g8QSaIKP%MO8%Y{=Cz3#Q@pBtx@9XbzcPg%i+tX zyPeK6U3~IOID7^6%rz9~&JVb(Ud%uHYvnCN5rNRfi{NS;O4j-Q8E| zC9L~OKC&*D*lX4DLBw91vU*o*PwsUtgo@R7nxj{=^0(01;;{3^fl6PIO*o>wHO_W8y&>EA z?h-9R;#9N!Zg#6pdRQ=qQBo%>C&!J&O*ZB8datGM=`&}_;{p!0r|^)`)pjMPRfV3e zE(y73PoJJasD=V}@AVdS=NKJFLgoibrR9eIx|2R&CrOreI*E|X_T<^GGjpbYx1trH z*0%lo^KE`WsOtUY@g_AY0{N|x;QVpeSqxGR3_@mQBeEran~v&QTH~+$7F<}aWMB1O zY2mpcmAu?YZ&~*J3jb5@i3F`di>XMSSIz=j8XAO(yK~}uYne(K9v+e~rFw>jVJj=H z-(H@hz1{vwLq$a;b0}Fi(`~-Dw>P7zidij;Oy&G}k~mg{nVo)E-S{6FTBXMIypLPV zrb5EQr3Jh?-6A4ngF%&?7PrD7rBkr;P4Z5{61Bw{85&l+nwp&C zW@w9nmNpoNQ!ZT%BWIf2*aOj`BEYmO?h1l-8Z42t??I?`nLRb{-8*YoU=h2u<$Xtj z5gx|H$%zNMP=qlyfAxE+QhWlJR*6r+>QuW;U*Qcs{$KXt5%R&cmm*QxL4>!Aj!ub8fcLQ)H*a-dx%AAB*H!noM>Y%g%iDd7|a<4G{)ZPryd%ou#JM z4u!!~eaGF$U;gbiT=&<#q8rcl_U%gO`12Ppj(z+!XL#IuXYFq3?ip@wJgVe`+uxp# zCWtu>l#rv_h^fxZ$f(zWU}dB(*kxs+MQTyfd&!Df-kWNDeO)j6Dk~ow^|rJWhBl%1 zg{1w-sHmui2??XJwxt8hGdTsEA|h1ML*5y)@|C~iP^rjYWu_pu2w1;Xx~rk7X}z=d zx3A2Fi}d*MUqz6JL3Eu`Y^Ez0JMLIWFPW$)oUsRW#6f%n_9S&s5&d!!`pQd_uDVZp`@xf)K{S)zuJG_(M zQwG+ZxT&|#fXP~s1;q*ds)ueC-fBJh{3181O+h%hPYPSi$zB#pw3+&z;ysg{S?Doq z*nCrL(4~pR`|sPthmRhOdA3hX++Y7f?hs}2u#(cu#sf^0uJ=Agum+G2q@{QobeT9@EAxo#$HqOhf=o*var zu@_y99Gsl#6d*^S2P0x*JxnhTrivh*^?zCusoB_sJw(COXB}TzT{Rb2*kU5WIo>gI zl2B4&tE;P{NeqLNvY&5?aVRPdt)E+nXFw`n7yXi!k$H}~2+gfqZkuNh9k#g99^3q1 zyoW+cD@s}djAtbaMY!5by0^kp9l}smj-v-wvEo}%e)#3UD=4Ub=~8T$#_}<-7i3_~ zw5+Vsx-_86D|Td9g@(WGoIE_lFv~?nMS3~ifeQUul>{ovckl8EnOB6od2_ml09+Ig zd}yucmxHrxN<@5oxJ5x?g^VJ!fk!WFp&k&RfOJ8{aVPXrmFOpl`zIE%? zjW02$9Gh&vzl;PyiPSl*@Zw_6t(?>&Cm!pH+JUH8qJ)E!vrRxiYR;Vn2$V z1oVU+|G=SsR7AwmMHLuGmg!yzQK7)kpFcrb%}o9MtGYB+vcT2pwLQ{|gK>mJMAq%E z6u@q7O+3CVV*8CDtJ@A0n_s_vp>~*)i;Mcii4g6_+&6}60@@Z}Dku=Jh`|@R>z|!9 z74h3}0JDzDC0oE+0>R?Th%B#D_A^C`?#FuO6@o3DZq{234BpGUWUh+eM0Mf={) z0j%zf^&`sF0Y)73%=b) zEKY;9DFUrfYU8)L&SbP|o<_zAb4#%W~f0_ijc^kays_ro+`-^U9Obzuh0t zZi6}(4cznYT~#_*j_<1pkn^1H4}E(fvBWp^R_n7-@K-&5yN!Q|mGNEUeRnx^;l~OM z_4+fNX!7Anqp^W1e&)8EhGl=QZ-#y!SBXN2+0Q5v;Me2n*_Nbt7)Ptxutddp@Rs)J z87->oz92kzD=%Cl)?k4&q=+cR6dXp%4qpAmGMX$0mc9ZnnH%=EYKJ%^PDur1d?(}+(+$UZFZ+jF>ZezZAoIKPdPg7f4JO0Uwh~~~Y3Lag0qsq@iMOFM}cQ^_O zv*;LD*d7$&?{M5wCNUsdQ@ew$=-%z=meX^1??(8!^^3`gQ;k!h~z6y&N@MC?un`&@tVaWF~}7CwLI zP@V5owX7Mhi^;gcw^YAct<)H!`)B)_I36C};45KpQNciZgJUKN{=l@mENWh*lJnYj zv##=&PJv$3DPvl~ux*gytGI)c!u@k_-f zPw`*{MMMPCy4`X;iKAkz+ioOeQzYih=ye%K_bpX@bMUCt6vDqsdajG~+!NAMS4n;9 zdsb=;ID#vd%M2)lkcZ$Gp1+6Xq%BpIKFG)5-LD01+mUH=0KotRTp z51wpMy&;nHz?l&uWD5tX#uCZSp_1TN)b^(HH* z%wys8_iw-Q32Pmp-hTKcZhIr_z(lI)>3+|S+b0IOD`Yf+r}YrRM!H{ZoIKYc$=hZt~ap zErBn7kzO%hrA{AG{@r1D@mEJxmSIFdMo;s;;hDwcfGu6Mgr!emkRWwUhB@Y z&fzg`GO4B-)Flb7#FQx3?i1PrRv??5KXm`Wdy|Q4UF@~#L_U8cn{%>MT#CEtc4lVe zq@Qc^C2|Pr#TFvupMxbxD6ewK>-m!%?_ihEBfm!3`wxGNy3(4jhR1zM0aYDB9H}BCs2m)T7KWwI()50~D;lgz z=)*RzrKw&Mjs_KfoJnP_-TD0bCFx7P{4f)~aNRs-NqVV;*)H-+A+c={mo_~3H8Sh3 zm{;Q`@-sa!_aR^5xBHD}>6f!XkVO|k*=?g-f0FIJR*Z^3&k*4qD%Lj}zw{5)C-%1n zA|rgSRo6$-5^6Gk&BnnK{N0N1x>=|3d;3yz^Kf@Q$|Vd_?L=Mbky_+=j42{w8B_Cc z(6N- zr!|OtZ{mW@gzWE(UBkQoyM~22Vb}`p)a4U5UB0ACNFn9$OXHm_m-V=+`}61CXO_-{ z{Jq|(sooV1aEd;-X}DL9HN4NP3Vw)wpB$hd%9+M77dloEqPMo#yVL(hUH!BI>;SvY zZ3FRF1KSEU@}`rrQu4CR*DAe!rv*lkjeQkVS04(&JT&XKPdEK&OAanlxnuR02ZYBF zh3Ot9Ox;VJ8fXji>wD zo11aqxw}Aw)?0*A-uSRd{D6I=c9?E#vr_kU^HpMG>&Mdh+!v2y?%%-BB*sNV$lrf# zmTOhhPV_IvEnDv~ zy-{pZWZg)5^X5%%QN}QZ*pBZsOr%99pE-lvP>j(?kk6^$REc^Q|c?q1XF;J|b0D}kzE+5~UyRB5e z@VgTANgxPk3j)x_d3V0F{*DB=G&Km4Yf?-Kt{8${TXRR0jg6mcebxAFQ_{cuHS_k; zq!IlMFVYU)Ki=*;RC{}0)bCs)&5qVmS7-f#^d-;OV~dNb4=ZZR$+8r#_&4zFTbw8+CSjdsGjedI!0>G3>o{VwYvi<3^DpZB5TetQC zd-_zWn^@SHswKV)C+16LmcVgY}^LcF*CBo^6q^ZT#1Ndwwc+w@h% z{Pz2trdGf9k@;LRnU{E<_|LuC(x-W*%R~_SsI6LE{Q!$8ly14nY9ICVE5JTQUW*nG z;i?Kb`H&@;2{i#OC33G{BG;mt(Z$6Da6BFq!2^G|tEXqfHTxJ=AMU%cYc zZPlf*F<;*QYKb`hL)%Oi9QaGjgcnmj_;0(SNEV=CN)&90F#uwWXT&Rh#;24=kgb(g z;bjz`gSfo8t*sG4W!QU>0G=QS4GoR+T%YJm1;3N9R|*H_4Qf&>5=|ZJGL=q@Uv!bo z_0%e;Uf4{GEt69?UhBOm^YxqIX-$HWd1CGnr_ETKEiTR#wOq^_-BTh~2s%f(#zlDI zw%@RAwrZ-Xc#gIEo`^C4J^-vOPbnRqvi*4K*s)`Pui!gY{N+Y)T=DV`3Tk#p`S|z> zjRl*(e*OGL`|%t93)N%ZfpkA>W#Scv>C1cCp0;8!uYKXc*3Rk(krqM4h8lhs>vg$a z<16ur8?V0f6u6C^K&nmd^8`K#AHge+@OvSE&LK6v1e+UI(+az z606Q?>m^e(tIi=6=z>u?k%S;RJpsHW~P0u8*GJJJ;Cz0Mc+kkmG{R&^9m8$$R-3#us_B@YUsOWMv zt`?r`rKE83OnoVK{Ci@O%j>S6R5XqI{l3IPPfVQQzq$2#ysqit%i)WpF;oQX%6Yge z;$hayPeLfV8EL2!4ne2Syn~p)>GmJ%3q2ZFB_vA2h_Z^db_fQQ?y~O?X32RdrI_5G z=(9TAR3UvqCIv6*qDPzRDCljNS%?qJ+N#}}8pfnQYO?c}ElNM7rPg1xfkxB8VW?XE zL%6rAr)W3ZNL{_Z`**2>JhIHsOy1qD{d+b~Vk;F>x|%}-#g)f{_T*;`qDu~^v!1iZnA`P3fE%Rgujmugi)7+0)OzO-H9RQ z$1+E?;Yo0E#tVg(qKM9TpY$vurI5wDxV) zuF4FHj2Y%V8P9jwFLE&9BntK0d=v=jm|+IQPY*Bvq)e6FBOWvf7K86AalW^2u5ZUf zNNT=arAXUMSo(ZU!~SC;SUCc9BA2UYsi}RGp!cU?8vtzD+$WYCeAZb8j6u^p>LJTz|>r5@YsDK~ch6yzbd)rBLW4lee zBWK$(I3mKIUg=M>Ft{k6ok~)j^Sb36t(5i-z9%rS&ZkB{pruX-f;>~Lb#7i$s*+-C z9MTBTI*fS4%PXz{mUy825kM%?;H$TPfXUybr(c?x znzH&R_uBC5^42A_rBx={a}|l8RZJEOOooG{9Qv>!Aq3z|UwkP;9Ztbww?4SD<12r- zx5^;zE%M3atY$oGtb*Uhn)Tgmo?9uxP4^1?BSBl;Z(C^S;uzi9%4S-cXwxPOg0O2%e%ib3-|9}5O#UJ;M=$3aV!}&;S6&rajP3r;c;RjW7zCWtqK)qf z=TCK99(#o5A}=XYBduS*jyTIu(b4_!l;`J1J(RN+;$ZD_O-m`H2c7YWC|P5^eY@x| zTm#@?Mt5(KNnW8zUj7vK;}&rzY{i=|woL*rZWsM+W$sJCTeBlHa5@#$*vq4wy_CI> zrw$IxpVHJv1yw7gj~+b|@!xU=BaEi4j6d8wHnGxEdjWnRb?XfoC1tqkYh@RgqJibHF>A=IlzPK< zCGec0-eJXH6g3;VGFtA2zn7Fvzx_CSxPiqNh8jf0q zGAb4eOBvQ6_$}g)J#x7w==?d6_uY0eOwtrDUcAV+0k;Z1pUeBWCimJEn=~{w);X4r z?{5yH8AnqEql_QyU;^)D42`>!ddrS8D9TFcXfZp0~83H}tZ)G~fvoRQ&CV&YU!Z2{yaa}4t!RY_09zz}i$qwOf$;TEx~sw&_)U15jJwJ}CYa>U5_ z-DO_X15S5bdf|h-#rcHzHnre!E$Ap=D|~raD>$fYUr4IXa6;0WetfDlehqVa_?m%v z_$?^Q0TeIhv421Ja(z?Ac?#HrzT9%HqTkweW6|SKc0!~x%&qRzIep$q1PT| z`@gsV2>=lLQ{c0&pZb#ID>&fF(Cy(F!`4SB{Eg|@ingD>X@U6yV^SBeDy+i`}Z5Yk*ZlI#P;TET)-U>_CP0Mk2J?T%V_@G z^$-ugb_B6_E=NO46siMVQnD$WMFrRjPQ@?JZ7wu6jB-1)^&RBx{hq1QYa(IDc-QU z4)slE1~Ej>wMLiI39LwU`k+JO&$HqBHf~lk51n%>0z$ep(ls9-G7i`_yuNSPymu`% z8iO-TZ1xRQRLPt~7@_Xo%9)sjVoyg&pG2hd7Vi4+LBJDPTnC#-Lu7p2KIRgY-c#bM zlL#F>_N&?QRQg_SnIsoJ*|PE-)m7&{C#tk#YipG}oRqMLthYbPEjRaM@MgW&P<_r? z@H-jr?StQ!6+Zt(?D!G4BIA!XLey%iol89q;+DtUVs~}@rYudF@ET$Xt(z=-$TmiO zm{TayDzZ4-|44@vUNCxP6o4UfAm_uV0eTCysB8(#O2_3moqMz@~>Eme3O{PZivi$t`m}!`@@~ zDezvivK8*86;7Q!kcLW>`Qc`f5=maS@~BJN2(O+q0k0g_!7z;dLui>&Z&+DSY}@#J zPJ#WQ*UNH-vIFgr3SxzwpL=_@xQst-`#VA>=$f*`Csy|2u*pM9KiP)O6Iua}hi~88ixW>o3~ibg z?tWYRCAQ1ggLnoT9TMK)qqTSQU7~L@n)+JkyvhOLui=msvr?^#b9|L<>WF((?MVKD z^YEwCXXRyXn_XcNAr;MGXGuvS?gU{+ zC3Zok=^dXAp4~>mCOm%g zUdv$F_8Y`emk}T0`+EhAO*5@+?X!u_XQ(KilZ8;)*Zwl5YDoI>uDC0-sWGs?s53Mw zD54>@az#tq>SpiI<4&JH@lT)OS$8(Q3o7d}ZBR;=|Mgal-}RQ-L;G1TvwG1yl}B|q zEq1r(RmiZvM~an{gQ_hYYGzdov-C&EG>W-Ndt=UreHg}CI10_Omrh1~c^8?UBfDiu z6ZE=Ni<^EISKK9>BkDY@w(mEQ%N}u~d>Oxdgv5El~QSnqYF0g?4N2K#*_ThW~oMpG{oJV&Xm<9 z^W(tZ{c?DrlzMxfY|zfWE3h+R*H9e6Jj`h@@eHkKv9aI1#5N#jboPMFo^iu{e`oJd zx?q2AgB|kMOZ{wVN)$wPU$M7Rql2!O?p%12XDR!vC-eAU-g^;#XTNn9i>Zj-lRjSZ zAn=4zp`=vow3undsIN95F6pw_UO)pPknWY zA(HL~S>Ji3n54r#U(iZAe3j5*n$Php2Rof$WVb%{1v9GlE9UYLI<h6sfc9EfXC(=Vx zl%zy5GpU|?gZO<7nc0kk_D$=cf*x5qVoj+vmB^K-Nm5R`G`*;{(jq?GoA5^4&KcFB z!=fG~d)J7H2bhjw2~Qkl#FF>4iwvQ^cP@g62%pKHe_TxD60PI7JsX>0XO1tF6!*Sb zP>N8BiDSV1rUOH=P2}GFi`*roRQj1qv_FTRGxcERXGlt=`~zMyH*yO+DApO2kWcrM ze%xB{P5fl9<|XjMQ=RUv^q%5ftOZzIFWta4s+gMo>m{-&+ci zk~;i;Au`l#h?x888E`)hMUfq*3)x%Kb&NPj;Oy!~Z>C6x9km$1f}d9FLXNj=#)dN= zHV^yFHJS$T44lK z=z$s0w^MB`#?bvL44l5pjLFr*@283%bk(Z=%626zgp1#JHo*_r4f^fY$Qn;9MugqK zOffr|K&4D<=RXY-p$&U`Qs5SaPPx4PhL@)k_kt@!!Syn@T{Avp*n@_8E-Vvq&|ngC ztTK7xQ-}vvPAbwN(*L)JcXe-lwil&Kb^LV)4n-3%Sz;?HDlGW(2+VS@>h8OS>l8c( zZhK-#+yP9`iWIo~;$mVClaiv)9QpK*43wRN@)RKAI@x~MTYC@+L_e#xBuN>MnG;g? z`a@!3$o3|sYybXvw8=@Ck6(3YcIxX{sSv^}QAxh4flVNBr4NmZW1N3ico>&BoO&jB z{Q*#L-ehK~74+JyPPUzW6*PjwTznx$2uXNh6z>EWehiWVcT0OZa(oJpZPkZO4*%-? zqWpI01sgQSSvx|TIw+M)t`)~z7jsJ7tZBmaob9*g_j7Y|PZpFP?994MG*cUmR6391 zc`gpcLR7M@^Ww~njc@E!(cN+JwebLb zyRCY2DEh+(F%-0Zz>b3e4RY6xACL9f6@RuXMkxr~?N#@Oej4L5bW|f-EtDErd0y-s z7vn{jU%j}DvTS|hFLxoHjlf7P^qe=@TQ3M|1SVZkz^*5nLl&-DQqAdo^Y$%(o@FIl zTU!=_Ma0HBjZKa{NZ?YQ%$ALX4)aac=l_~Ygr>s6!_{8vrInTS&3n7Jh^A+lzDiwy z{COipj`2VZz(X`+83`d`4QKTwK~t9#E0e#xA*w%r>5_+n^oxr_w0L>8INOt(l|P6J z-&9cSwnwQvdaOhXv%r&@g}Iv3%^>Z_3^1^H(@R|*_!RY7nK)Sh0p{J4DD zXTZxNASSN7XOZDTbLS~*2Z86d)ZsY`l1$_c8HtLjH#VFU0&Df^79KkU!!9XFhi1@G zHp7k21i6;AtS6%hFFX^(AcAIPRDh+QziBxMp(788Iw#GDd04u*@@&6K$8jhC&^beFTG(SQ}NC*pogNBxNhYu~@mv(%V7a{ys zP9v^+g5mX(R_EO;21>dZbg_~z-pQ+e+_^FBp7!C-IiYW-v3=o5Y|p~a_{4X zQt!WyJH6LGx}muw2Mhm{@Z%6OcF9%EtX76^sk151AiX3b`P~TVgAtS6M7KlGZ9dYV zqkgn;k8qVgExUR>8Y#vrjhQ~s;Y9Tp3!ED@Av~RaAyK;LV81p&v?Dvf`5_rZb8I(| zHTry{Z@XU(a^Q!7MkLsbAW$g&pipY3HIYHD3W6{FzUoAGMSPr}hacBOXFL|u!A7F` z*aIs!Oi(rcyl+p=>!RQZSD}44J24NsOC^Qc*|>3ESC`-(WJ5AD8~WA$i996I4$@pm z8DcSde`P)XzM|DA{FMU4gNO-+!#2=mtr8T8o`BfvZt;XMH;v0s`MI(9-Bdq?9n zWlsr-L)Qg>1vrO4Bh!?OQ^;Jy36V_FOU**>Q7|GmK~&+Y2%LU|hi}DptE6ASOZ>tV z&wa<2yNg=&TsJy$IDQWT&?WHtd@OAxk3 z=7Pm)TC{FmQeZu3()V|H_i0z!{VaZO5%)-e+gJUY@6`$oBa_3t0{>7!n==Cp$ZlG( z5^Lz8*Ch!D3Z7>WBk#69^Vql5oq8IXCTEP_C$lxaVQ=$VpTFXuAI8VH{!r$i zavs9c(^_@5USoAT_v^E(w;0Yu+?Kj_z zprb05TOKhDcUe;PnR4ptJG@L!%G=NOEy3qKLARmYn5ui35XYz00(71OfNjV2PM?3N zH#N2~R*g%~bP@Ncw5Dz}nl7bMn@0<=yuNexr0coFKvZ@#;5jc1-{QXPHr+5WkO6vz zVBjhf*sQrNax;A8eoMkPKdtNOZ#S%-+ZKlzTLklj2fUM@+8}vup0GNHVw)fD)FAcU zT@)=>M6r}l8=B=sQpPRCpsla+n^zQt3~rHOEmSiNtvbh+(ItltFATd=@f?qtx9p2N zhm^0OAWRUrFPy%`G)_V_V6-=av%klsR=ZFQTRQR(Br#=T?^Y6t6jTub%E*z3anp2L z6Gqq123ZrsFrFDQb7e6g3c(qh#_vL+b&m7OEWLXn(NcZb+u?U)$F!~%_FQR1O}%0S zrsFu_-D`a-ID(i3CuLaoz>OUh$j~}&Pkd2fzxNHpOM<5;(<8H!c;o=o#9=xv5ZYh! z-mQydI7J`h8cn`g6-YIu^R4aj98N+6=qqJG<~y|l`;oOrS=gfQWm!D$Sz#3 zi##89O!LLBC_l?XMtYs(5an=|LWx}VpCGQw^S2P(*_Iz9KTDLZOZ-PM2-Bw<+06co zWME|pd1NQB5U|hg+In`3-u^2>g1tyFZEDe7zu;^=;QEMVEB6gZ z%n32g7LF`hW_;qkyl2gH1t;-+UwW#aA?w7R3y@P+i1!*cIjB__t3Eo=(A4AW0ixNf zv}3ZTs@#g{ur9V~Z{b96^125XLGq;;kbsLf3r`-JNFBqkUwdfUpq*wfIePY09d#8wRWmYeB5R^vU{Cnl3Zhhj9l59Y{5O-vw973pI3N*9)GZsL`8x zWIDrI&HZ@_FU6jWQAU$OK~U^ZyPVnCx7~(wN<6yM;_*i&YnzTpneAQaQ+#B`gIdPY zuC9G(i}8=GD8a#IWvjCcVN4_?YK@*WLj6m+#TR6{mGRwuANP&*2*{UQEIOs+H_py4 zDAhYXEO%}TQXI{TpyI^bL=kpbPh{x2)G?TaoAlSl^J`gf%NI0xC&a$hNNJ9#qHY_2 zZEM#&1@w&0ED&pQigHpd3MPjvDN71Hi40bAWM;fys2m#-iWc7RL8I@(_^jBCFcpCa zmLuW*R__OG5^_C!Bv7oR_Uc>InK{M>#XRc|!zL{WH1RII^FGB$7m^ZxxeoYywy{yq zvYb(k3A|^^?lKDJ;>HpuAOJH@3y4LXsG$v2$zt|6S_i zZ)c_&_hZQcNcnE));gw6kYe?JK7+wW>@aKNk3b=f%LwkiZ4)J{JW3Mxnz1-_>J)en zjY*RB&TG^9F{}!V;WYPZIs%SOYPL>&4=fJs4)Ed5Ee1akH0$9BcpVpoU$PscJeV?T!+qwSY> z`Y#??fHZ+r3K2@h&N`-Tk34?-7_C1T%~aaw)6vn+4_Z z@#>kG&3RS<`Toa`d+i>#i;R~RgASR1j&4<1kn!UV6*Kc($@=xlu*kGu1R$sCMhX6` zILH|RxwOP|6S&s@@$y8ShU5_}q%>`9xmknumZb^;fL>=+Y~nH;u<4OQ77zs}DdUde z2O`v)&F8#JK9cNI6A3PQ!LMcbO9|}vzg^V^SFSAY%ofTrLsp!`-q&wx; zI@BPip&z~|8Fb+PUp^_gzqf_{eVMd9ss)?VDhsw(;BKMOvaKu+wd4N_9vo_M@a zolx`cFY=JP6$f%bjlo_7Ht~CUNU=13|E{U3`e0x=nqJttA%Yr8o}Rw5VgU~Qe|$Z| zAl#KhjMxJH&Sm7;!qW-~n6?0&)cw5$4UjG^P0cZ=Td? zR6!=?h`Ix0l<@jdZ2c(ic4|NvQ1ES_*2&;xTcryHTA*ha{3Zag^d2QNtMaCXYAEq1 zIz_yYfjLeuG`G=gRckxR&yMaUS=i`6ZUqLn1zgOm6vzyv4(Q&2+LX6~&o=GJuo&w9 z$n5EsDGUMjwOY9KbjNE0`g*Uj9pv9)B|Vl$EP!hw=e3}2VZrJkl|0bflV{4KpI!Ab z^xw9H2U)?wFO-c_0Mn)7Sx}|-GAA&*KuX^VCT-FXP~f3!Bc&}%ipCIIK#hc?q^@#K z_ZY+*T7iLzj=+2!4A}e)gY>(830ti@cpEJ?Oh0*^5xJZq8wy(&4|$?<#?IcJ8Ztvu zsX?s5HCyRVG*&Gp4VLw3$+FykJ_Aa8#Lj8xi?T8{XV~)MMKUP!S==$Xe*MMO#udkx z1WD*bbKGUap+xh;gMGBZ&9*Hm)N*f(UdCmNpu}l74o+!bmssp(K=6;sAG2;fBEosh z_S88@fu7wR82;=a#RZvL&|A!y!E4XLxUG870!V#<)8tsl>gDfau?U2trQSm**Gq1p z3?GBRR9}-=Y&?f5vn-ZJ8<@E)sGXbQ6%u+@!7x-uhm@0&z%DEPCV-d5PGUe`=jY5~ zg)Vfs5rOgy0nyQ-6XT~9+=UhUkLm&FfhP0uECLaiKIEtZw9V;8K1J{5V$f+bglVHc zYZ8JMGR(h{b{V5d+Nl3AMFR-iA8duRG zI5dhBN}(TPMvFbWFfa)$a-MJ&iI-m?5rdfi;X~|zVLMtmy-<(LB31Ns7qceEe|tsNkuV2(gF$Yq7~6GE0X zF=tIn&F?PBh zQ?Aw89uoW)^00vCBJfW!$bz$DA}<$jB|Y$ zITUkY4RacSl;8r&K&rjq{rk^0@d{y3D+&=i8H? zg1#qBG9QlycTE|3niT+1d2gO+IMgQGXnAzzh?Iz;98ll*1&XwiQfhrxZLeOv3ho6y zu=Rl87ZNfg_+iSKlmTRBh9LEh@TdRQoELkyeNT}CAmXO{MxRYYRMcl+$Q1#eBEuYK zXxRi{%uTWKdjSvLy0BQqA*g}h*j7gb|4&m+ZhZCX2`IQTshWfobzjLnCaA4LAtBJx zCxxrmXaYAYhl_V)|2J)5C}T0B_1jU!QDZrdf_hzu*hxsKki6$+>v;7wuNEh4!F);y4rOI!;a2{% zx=emMg)W(WZ+;`}9PVz@X;~vS<$ojE^-n*>fK2|+OaNk^$J&p^$H$K-FMl&rzd)%* zbXl1UTBdur8Fa`4%`uviTjiYG{O6Uhu+tK#JglG^`mek{<0RFq76cZj$a#x#;u_eC z+?US5?y6Ex-P(Khyj=pboA>StPGk>6L7!Lz@s-;+1phf*7s6CeW(?}aw0Pzt&D^N!o?#$TcH$<%mR}vb zO^%k&dr;x0Nq;oN-!O4W?Zlx153=g}@e7812FP}aC4%t82}uT|`b8)gs;sb`Hq8ja zAdkKmAZrzlpVB(g_4LqJ@$VRvVqlI#rrW-m5r&|>ipO*$OG;tf2vFhnz=Ma`9Lc!{ zz&z6btLx}R<#q_yo3q4ll@EkHPG?A%2~e$V4wy-vodD)`br~BDN<3i*GH|-vcsCOa zhU7nkQAG;#Fm^%&uI~Z>U?}R!(MafFBm%k^HMAL+v^>US?DeC%M05)C`i?xuqZ2a3 zM^ix!tw7-(Fj?V_f7cMBN~!{M9n(1$?)f4%$-Q~F=O%8;XhxkvD2LL51h6g!mD192N%mj>{ZOcXYu3h=>2ZnuF? zCijG&l|-ZZRdtZk>fgg&wG-d~%?81-M)7SZu0jc7P|TP9=FOXK`v<|n`Y7St)y>VX zsKNXuA068t9p&E3N4hw{XypY`=J;Dy(6odMFisV)grFo|_s$mitWFvhB(&U&h>P>Q zr>}3(@upt}Pllc5;qEsjfTpO|IaAM5{r7OTVS#vZ8-t89``GxnsMms-|Ka}Ty_&dg zyU>=Kt^>X)IfraU7}QhCUyekKkAUnSxkSQ1y#nn5)GLTc9EPe+u?22%lsNt-&FqYv zEvRKp6f(D4_xLZ>e_F#@;r~&_+^Hm3b5!G^5UtIZm^!GPi-4ka5H&m|X-9|kBq-_n zd`F_9WN&ZJLeK^O-!A(7=1B$eii(w$0!r6`M^!rB*w_dIUg%J`%1>utVBowkSZ>(< zPtpD6w=aE>3>+VH&*J@$;4{VV`cdZ*FlrHzk$Re0N_{t_ z!QQWmejJ}%DEAuXX%hEwSs1EjyWrxr+2)6bP^sdrY|1r0L5NtdZ zk~c=`g@H!V(|9&pjL^`CIEANdz8!u0*Ee-IyMTvIVFYrAuRowy)9exRPi&d85p-V_!HDz~TOwjsStm}iqMcDb z&yEnu{hJX@gv@iH{gC{)0}C+IZc-t^ECN`V=Oz+tU0eYS8c{sD1ZgH^N023QJgY)` zB|`a!=r~81IOvd4r{R2%9eDWwKNpvpRy=EU#y$nJ410L}>$y1xC8Iw4m*~tYo)p6@ z!MiZJ03Ldhn3xIm{BJWe?Lo}n7ZfbI)nnG8N$ZF z#)qgQRW9RUaV&E0pmch(ByfKRu$v2i{`^T;u zNy!pQfflp?jVYK}c(yBtjK2-!5WNcXO428GO+r%gZ&4F#C#cl?va&L{p+zX5C}(73 z9E^u|TYQVZrc<#pOozKaNC>-cOV>N?_);i1MF5*+=jVU7@iRA1p`oR9vJZlnuLQum z5=_dRU;8Du{&{pdG(0@#!v_OUzvcIoGCTP)JO7T)RN~BGiLh)T4WtmPg+SeJ{-Z}U zn^K9bZ{hQnt?f`xAYc@-J}Yl@U&@RI3YvU6|M7Nv4+QReL3W$E)adk~cc-1syZ%wL zHBq=1vYa`m#BHY`t6Q9uoQy8Wg-75oz8kF%7l6^jdl8c4eLgfDK$*=W_kj(pT`kE? zs-u0n7;+K$*4EYyNMW(dxMp`x&kUq&fA}p{Pt}M_>}{{k+%7)OceLXJM?}6nSEj#l zEjBhbDl$@EO)WS*BO~CD$dB!r-PbpVrCLdQ5sUGZ2$p<%f3cL%*g^Z7ZNC$KQvmE% zEGiJc=p6BhL15w$hFp^Z?OrBF#VILg*wo>$so!tc<^%J{jz9HISx8LfH4X%W&t{eL9hUi*phqV(dZ>5<9|!UU3_ps#Fl2 zYpadPhi6b7$Hs*afyV^mr*za_Eiqhu^!(`^y6oaVldJbpZ8c&F_jd*ElpZR#oa6o1 zAvJ_d^W^~{f&{9=x3;6pl;E<4BLU>Xvl1B-utHZhl(+(Mx0>_kn>l>56?s1&woM2- zoMsf=pM(eFC}jv?5LTd_5Clo)K)cmPhC%ybOM-<%Qfdg?Qg{lF9a?LnfS*P)GzcFxW+c`LpIiGh`N%nbk(`%g@Bb`%vBiUdFicg@>-IyF19;B~9+{@bI!#aArnW1^K|QXIli#q&SR z4Fmf?sgse3NfNxz;Auj_YtT5Jzn}#1uo@WE1rYUKdLgC(Z!~gbyVftay}exl-_g;6 zk`a)TGX;;peBp|o9_Yr=<%pP=xr``3M|f9IX}1E1qR?j1Oqq^>iAn#xeGeIClWJd& z@cBH6d^DCU25=Onp>@=G8m+GO{>_jP%OuUu$EOX*GrXq901B&1o7O#tHbe7w`uqFe z1E6*H>k~dk8RxV|j~^EUh#mly<>ss(dE8zXxJ#D^80MDcZGfxk;b)c;`+rn&ra?`m zSs0G(w04OjSZyndK+lM{4U2$n0|H8qC@6v>AuNf}jvxdQWDTGpRyQ_|f>9u{2`G)o zzO*Fl*g_4of(xrl2#7WTf<$Zrk;K5fcYbtD&HS19VHIW7O>*z|edoUCJ?A_Xg=@yE z+DD)6sA}$=-1&W6=&0c*CrHf;(j33LfhicL_d0s?7Dfjj<=Rs~sWB8SA#{}-Fy?xp zo4XgIkb>OY3Pk%{yXaE>4&^Z7fiQlKX=ob(3dMdVi#70#wnL#*Dm7PLzH(&{X5SD$ zJ3HI4w4P(?p8e}lB}iFMgZ+2#%S^b6o&!c)v+dhcO*F4oI!#0wmnDZpM&5-u7IM|| zYv@Zb7fV=TQ802^)l9qgE|_1$?*hbXN|8DISl!x7ru+N(5kDD{zPO;knWyT@_ww~E z*?)OGZZ}NoOqa1kHwO_K{z@x~ze&;S4#ZcMRw<^0@Q9n4Hjk6VYIIPEz`2`-5f-ipuk8<{7Ss58Gg3 z;nG<#Y~hr?NgF^y-YLGueeL}aNVktbWo6TY{{H@`mmT5;ovns*oQ2=U0s#a&Zn(v( zBL;s+@2@m|`%?OX_XpMd6n3Ws3q%-43T(*xlx zpb0i8yE3&~$mj27JWGo+P6m3S2xn`u=YTO8F3p|k=3K4&r?8V=)`jKc#jm(b|LB~g zZ9Irq8eVdPC)J*M;t`FUqrWG%x)pXU=f&fP3@wkL@lUydC{)-*%e?CHH$3R>_6iIv zQja5hWTN!*QW%l}Ufk<+5|mhm=TB`$kj6ot-%~QxBT8 zO{Yhzii%ti7HE}=(S=P7I^D>cD5PbhxMtE4s* zV7Ev6)d@Q1ya8AtgJiS*FFvmZ61)wc;fifLclI#e>Kho$p?xdHF2*5CdB4EnBVua_ z?&X`LHFGLm$)gJ=<`>5Er%>g~9b}Kyu*(%5OTb_g+LxXesc5dqWWD9ZYc}=p{&h^u4m#E6bS^_ z-l)+lEi-Le#6?)n9JHpT2?PPJU%x&KD}SeHZHJHs;jCvHQRrL8mawXP^GhKrmAyX3`o0&hL*?SFm)54s=EjZ*3AB`k#jP#a;MR`nSHY_L#i5h za`x~_Hww1}YTLIq=$hWnZxe09Unh2MY)#NKs&z4a&58We)kay^v14hzO)(XSKf3{= zDngGMF;Grahoso|az-)zhk#xVTYMIX_el+YeOTXYBQ9y~~_GFUC+qLF=wn#lfVpAQZ+Yo}ML{Ae`EjuJ1&YtdK0D8x(%yfKhdR|_o)5lTm z)J0CbsJhyd2s@`v6}AF?Hq~Ep%&3z992UbNc`zA;Pj>gOW6#B6ifqcSj-87a#;;L! z(a&g{V5MAQ#3FJo2z(0G@hKh<8GMA1E6dMsfcSKF!$jQtwD?Z0Jx7MJY&=kibM3~9 zo(P>WbqfzX5(+RHDZ|KnFCJ4Z)Q?aka%z>p{+!pbV;J1zQvIq26A5s*~h0C5Ur^+567PR@HePm6r#aY%-m{bHh^{uGL>3x8!0`QI?Pql z%zUc%QmT#gm(KB$Qh!^GK z8@8KV?INYgC~J;|5207Jq_orxFGD*VH3V-34nvf07uHJhBrP@7#1(p^MZSsj!5R4^ zi9~OR7`tRrf|YGg(pJVknv9B1{5cO6RpXB_z^-weIA3o}WhbDL@!c}m0L~q-)5fr- z05V9hutxm!^mUvjG#J$9^E7kMRNzq9pjXqi7u^b8ppS+RA=IQ8+Ixdknr#(u38$p< z^r~e)Gm+WpSYe#A95qN8!e>U;STCn_)^L}NO>ueoVYG6%xw{KYSi{Y}IAUZJ;E$hs zzaOUHHt6P5MVpqzM5|ifhh#H7C#MWVN)395d%}2Xe^)5x?CTcvN*Iky6f504JSbqv z$)=_RX=$HVw=O@wo7ivFaOLJmLze|J!d7deQzk9n_bJ!pC2WRt>06Ne`SZyR}*f_@BjDzq++v6 a%l_aQBA&mtJ5+Wf;NaxTnbc&R8H;90= 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 literal 0 HcmV?d00001 diff --git a/Lstm_rumor/train_w2v.py b/Lstm_rumor/train_w2v.py new file mode 100755 index 0000000..eab0f9b --- /dev/null +++ b/Lstm_rumor/train_w2v.py @@ -0,0 +1,27 @@ +import numpy as np +from gensim.models.keyedvectors import KeyedVectors +import matplotlib.pyplot as plt +import jieba +import jieba.analyse +from gensim.models import word2vec +import gensim + +from gensim.test.utils import datapath, get_tmpfile, common_texts +from gensim.corpora import LowCorpus +from gensim.corpora import Dictionary +import re +import pandas as pd + +if __name__ == '__main__': + + data=pd.read_csv("./train.csv",encoding="utf-8") + test=pd.read_csv("./test.csv",encoding="utf-8") + train_data=[i for i in list(data["body"])] + test_data=[i for i in list(test['body'])] + sentence = train_data+test_data + sen=[list(jieba.cut(x)) for x in sentence] + model = word2vec.Word2Vec(sen, size=100, window=2, min_count=1, workers=4) + model.save("./model/text_w2v.model") + model.wv.save_word2vec_format('./model/vkmodel.txt', binary=False) + print("字向量模型训练完毕") + print(1) -- Gitee