Created
September 17, 2017 11:29
-
-
Save lirnli/7741de27f04a80657fab90b0bd6c168d to your computer and use it in GitHub Desktop.
wubi(五笔) RNN
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 1. Build Wubi Chinese Character mapping" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from six.moves.urllib.request import urlopen\n", | |
"url = \"https://raw.githubusercontent.com/renzhn/WubiLetterDistribution/master/wubi86.dict.txt\"\n", | |
"http_response = urlopen(url).read().decode()\n", | |
"\n", | |
"# from character to wubi\n", | |
"char2wubi = {} \n", | |
"char2freq = {} # save freq to deal with wubi collisions\n", | |
"for line in http_response.split('\\n'):\n", | |
" char, wubi, freq = line.split()\n", | |
" char2wubi[char] = wubi\n", | |
" char2freq[char] = int(freq)\n", | |
"\n", | |
"# from wubi to character\n", | |
"wubi2char = {}\n", | |
"for char, wubi in char2wubi.items():\n", | |
" if (wubi in wubi2char) and (char2freq[char] < char2freq[wubi2char[wubi]]):\n", | |
" continue\n", | |
" wubi2char[wubi] = char" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Build a *sklearn pipeline transformer* for convinience" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 2. Transform Characters to Wubi\n", | |
"\n", | |
"- Convert all English letters to upper case\n", | |
"- Map full-width punctions to half-width" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"encoder: wynb gdi jghu jtgf adwe gghg ! amdu yygy pbf xgui : A W S .\n", | |
"decoder: 今天是星期五!英文字母:AWS.\n" | |
] | |
} | |
], | |
"source": [ | |
"from sklearn.base import BaseEstimator, TransformerMixin\n", | |
"\n", | |
"trantab = {ord(f):ord(t) for f,t in zip(\n", | |
" u':—‘’“”、,。!?【】()%#@&1234567890',\n", | |
" u':-\\'\\'\"\",,.!?[]()%#@&1234567890')}\n", | |
"\n", | |
"def normalize_mark(m):\n", | |
" # convert full-width digits and puctuations to half width\n", | |
" # convert all english letters to upper case\n", | |
" return m.translate(trantab).upper()\n", | |
"\n", | |
"class Wubi_Encoder(BaseEstimator, TransformerMixin):\n", | |
" def fit(self):\n", | |
" pass\n", | |
" def transform(self, text):\n", | |
" res = []\n", | |
" for char in text:\n", | |
" res.append(char2wubi.get(char, normalize_mark(char)))\n", | |
" return \" \".join(res)\n", | |
"# Test\n", | |
"encoder = Wubi_Encoder()\n", | |
"print(\"encoder:\",encoder.transform(u\"今天是星期五!英文字母:aws。\"))\n", | |
"\n", | |
"class Wubi_Decoder(BaseEstimator, TransformerMixin):\n", | |
" def fit(self):\n", | |
" pass\n", | |
" def transform(self, text):\n", | |
" res = []\n", | |
" for wubi in text.split(\" \"):\n", | |
" res.append(wubi2char.get(wubi,wubi))\n", | |
" return \"\".join(res)\n", | |
"# Test\n", | |
"text = encoder.transform(u\"今天是星期五!英文字母:aws。\")\n", | |
"decoder = Wubi_Decoder()\n", | |
"print(\"decoder:\",decoder.transform(text))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 3. Transform String to Symbol Table" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"table size = 100\n" | |
] | |
} | |
], | |
"source": [ | |
"import string\n", | |
"\n", | |
"str2tab = {}\n", | |
"tab2str = {}\n", | |
"\n", | |
"for t, s in enumerate(string.printable):\n", | |
" str2tab[s] = t\n", | |
" tab2str[t] = s\n", | |
"\n", | |
"R = len(str2tab)\n", | |
"print('table size = ', R)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"class Table_Encoder(BaseEstimator, TransformerMixin):\n", | |
" def fit(self):\n", | |
" pass\n", | |
" def transform(self, text):\n", | |
" res = [str2tab.get(s,R) for s in text] #R+1 for unknown, strip() spaces\n", | |
" return res\n", | |
" \n", | |
"class Table_Decoder(BaseEstimator, TransformerMixin):\n", | |
" def fit(self):\n", | |
" pass\n", | |
" def transform(self,tab):\n", | |
" res = [tab2str.get(i,\"<UKN>\") for i in tab]\n", | |
" return \"\".join(res)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# Download text for test\n", | |
"url = 'https://raw.githubusercontent.com/renzhn/WubiLetterDistribution/master/text.txt'\n", | |
"corpus = urlopen(url).read().decode()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Test pipeline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"corpus sample:\n", | |
" 主义并不甘心就此认输,还想做最后的挣扎。 \n", | |
"\n", | |
" 10月,德国军队首脑命令基尔港的舰队出海同强大的英国舰队决战, \n", | |
"\n", | |
"并且声称,如果战败,舰队就不要回来了。这无疑就是把海军官兵作为炮灰, \n", | |
"\n", | |
"并\n", | |
"encoder:\n", | |
" [34, 16, 13, 94, 34, 26, 18, 94, 30, 10, 19, 94, 16, 18, 18, 94, 10, 15, 13, 94, 23, 34, 23, 34, 94, 34, 18, 13, 23, 94, 17, 33, 23, 94, 34, 32, 34, 94, 21, 32, 16, 19, 94, 73, 94, 16, 18, 25, 18, 94, 28, 17, 23, 30, 94, 32, 13, 29, 34, 94, 19, 11, 12, 30, 94, 27, 16, 20, 13, 94, 27, 26, 34, 34, 94, 27, 26, 31, 17, 94, 27, 23, 23, 94, 75, 94, 94, 94, 96, 94, 96, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 1, 94, 0, 94, 14, 14, 14, 14, 94, 73, 94, 29, 15, 21, 23, 94, 21, 16, 34, 18, 94, 25, 21, 19, 94, 11, 32, 34, 94, 30, 29, 17, 15, 94, 14, 34, 11, 17, 94, 32, 16, 20, 11, 94, 32, 34, 12, 30, 94, 10, 13, 32, 15, 94, 26, 18, 30, 94, 18, 10, 32, 23, 94, 27, 26, 34, 34, 94, 29, 14, 22, 26, 94, 11, 32, 34, 94, 11, 22, 20, 94, 18, 29, 33, 30, 94, 22, 16, 20, 13, 94, 33, 20, 19, 34, 94, 13, 13, 13, 13, 94, 27, 26, 34, 34, 94, 10, 22, 13, 30, 94, 21, 16, 34, 18, 94, 29, 14, 22, 26, 94, 11, 32, 34, 94, 30, 23, 32, 34, 94, 17, 20, 10, 29, 94, 73, 94, 94, 94, 96, 94, 96, 94, 30, 10, 19, 94, 14, 16, 13, 94, 15, 23, 27, 94, 29, 26, 18, 34, 94, 73, 94, 31, 20, 16, 94, 19, 28, 18, 94, 17, 20, 10, 29, 94, 22, 29, 34, 94, 73, 94, 29, 14, 22, 26, 94, 11, 32, 34, 94, 34, 18, 13, 23, 94, 16, 18, 18, 94, 28, 31, 15, 94, 21, 20, 13, 94, 16, 24, 18, 94, 11, 23, 17, 94, 75, 94, 34, 25, 18, 94, 15, 26, 31, 94, 33, 29, 13, 17, 94, 34, 18, 13, 23, 94, 19, 16, 17, 30, 94, 27, 12, 23, 94, 18, 29, 33, 30, 94, 25, 21, 19, 94, 25, 23, 17, 23, 94, 27, 16, 32, 30, 94, 32, 29, 17, 15, 94, 34, 21, 34, 18, 94, 24, 26, 23, 23, 94, 13, 24, 30, 94, 73, 94, 94, 94, 96, 94, 96, 94, 30, 10, 19]\n", | |
"decoder:\n", | |
" 主义并不甘心就此认输,还想做最后的挣扎.\n", | |
"\n", | |
"10月,德国军队首脑命令基尔港的舰队出海同强大的英国舰队决战,\n", | |
"\n", | |
"并且声称,如果战败,舰队就不要回来了.这无疑就是把海军官兵作为炮灰,\n", | |
"\n", | |
"并\n" | |
] | |
} | |
], | |
"source": [ | |
"from sklearn.pipeline import Pipeline\n", | |
"\n", | |
"encoder_pipe = Pipeline([\n", | |
" (\"wubi\", Wubi_Encoder()),\n", | |
" (\"table\", Table_Encoder())\n", | |
"])\n", | |
"\n", | |
"decoder_pipe = Pipeline([\n", | |
" (\"table\", Table_Decoder()),\n", | |
" (\"wubi\", Wubi_Decoder())\n", | |
"])\n", | |
"\n", | |
"sample = corpus[200:300]\n", | |
"encoded_sample = encoder_pipe.transform(sample)\n", | |
"decoded_sample = decoder_pipe.transform(encoded_sample)\n", | |
"\n", | |
"print('corpus sample:\\n', sample)\n", | |
"print('encoder:\\n', encoded_sample)\n", | |
"print('decoder:\\n', decoded_sample)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Train Neural Net with Pytorch" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import torch\n", | |
"from torch import nn, optim\n", | |
"from torch.autograd import Variable" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"class One_Hot(nn.Module):\n", | |
" def __init__(self, depth):\n", | |
" super(One_Hot,self).__init__()\n", | |
" self.depth = depth\n", | |
" self.ones = torch.sparse.torch.eye(depth)\n", | |
" def forward(self, X_in):\n", | |
" X_in = X_in.long()\n", | |
" return Variable(self.ones.index_select(0,X_in.data))\n", | |
" def __repr__(self):\n", | |
" return self.__class__.__name__ + \"({})\".format(self.depth)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"output_size = input_size = R+1\n", | |
"\n", | |
"class Char_RNN(nn.Module):\n", | |
" def __init__(self):\n", | |
" super(Char_RNN, self).__init__()\n", | |
"# self.one_hot = One_Hot(input_size)\n", | |
" self.embedding = nn.Embedding(input_size,128)\n", | |
" self.rnn = nn.GRU(128,128,2)\n", | |
" self.logits = nn.Linear(128,output_size)\n", | |
" def forward(self, input, hidden=None):\n", | |
" output = input.view(-1)\n", | |
" output = self.embedding(output)\n", | |
" output = output.unsqueeze(1)\n", | |
" output, hidden = self.rnn(output, hidden)\n", | |
" output = output.squeeze(1)\n", | |
" output = self.logits(output)\n", | |
" return output, hidden\n", | |
" def evaluate(self, warmup, hidden = None, n=100, temperature=0.8):\n", | |
" output, hidden = self.forward(warmup, hidden)\n", | |
" output = output[-1]\n", | |
" res = []\n", | |
" for i in range(n):\n", | |
" output_choice = output.view(-1).div(temperature).exp().multinomial(1)\n", | |
" res.append(output_choice.data[0])\n", | |
" output, hidden = self.forward(output_choice, hidden)\n", | |
" return res" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
">> iteration 0, loss 4.5981\n", | |
"U!,<Q\t^z>USfx0\\UO?W{Ta0H/n!?<;k0\n", | |
"]5\f", | |
"F$#hh?>R8S|ih}w:kzx$|$.i{\f", | |
"29S{~&z5X``$`krLQG]l\n", | |
"\n", | |
">> iteration 100, loss 2.7921\n", | |
"fwhgittkkh,jiwtwfpfhqpu偮\n", | |
"\n", | |
"wrwsrdrtpu沆iwtnicgu\n", | |
"gtwk.ucjnwgybv見\n", | |
"\n", | |
">> iteration 200, loss 2.2224\n", | |
"申0wlmhpfvgerfpgk.\n", | |
"的rfhnhsilljdtci欣亽fhi㺺fnjkgfqkaki,gjggkjb\n", | |
"\n", | |
">> iteration 300, loss 2.3220\n", | |
"un的fnntwpf孔,wfnmhmuiawudetfwgdf披tedcihff的thcuku\n", | |
"\n", | |
"tygtyffdmkilcmmw\n", | |
"\n", | |
">> iteration 400, loss 2.1276\n", | |
"fuuhgdyghhyasyhkbnhfaj过dgdilfg仌wfkdmk\n", | |
"\n", | |
"jhfdtfljlhciteqf莉gggddxakwwctv\n", | |
"\n", | |
">> iteration 500, loss 2.1351\n", | |
"过qyfyglk,他的竰axjg大r1磊氷ggt后nbbnv力dkgh次了,-----4-\n", | |
"\n", | |
">> iteration 600, loss 1.7895\n", | |
"kf向tmmktecupnnn.tgqijf半捒的\n", | |
"\n", | |
"\n", | |
"\n", | |
"的xoi也,\n", | |
"\n", | |
"rxv一但wqqxg\n", | |
"\n", | |
">> iteration 700, loss 1.8181\n", | |
"8'036---------------------------------------\n", | |
"\n", | |
">> iteration 800, loss 1.9510\n", | |
"㕆ady诈部莫.一jnh匡udkf的了ygii的txhv,tthg诒iaafifeygmxnudkf,\n", | |
"\n", | |
">> iteration 900, loss 1.6759\n", | |
"盏lhj.效ukdythk上乜友中坟\n", | |
"\n", | |
"fepk镁\n", | |
"\n", | |
"0sghv机ufyywmkg了fhhbbfp\n", | |
"\n", | |
">> iteration 1000, loss 1.9091\n", | |
"㐊xhn䄴的在羋过ucfj了不ggmw,氷一䏌qti中.\n", | |
"\n", | |
"\n", | |
"\n", | |
">> iteration 1100, loss 1.7792\n", | |
"-----------------------------他xcrftff判多mkiu后本的\n", | |
"\n", | |
">> iteration 1200, loss 1.8264\n", | |
"人\n", | |
"\n", | |
"\n", | |
"\n", | |
"19了不pymy士\n", | |
"\n", | |
">> iteration 1300, loss 1.0087\n", | |
"gpi夭洐fqitkqngmdn发kwgf败化了一aatyuyi来謮第rjpk立fhbbtstdiyc\n", | |
"\n", | |
">> iteration 1400, loss 1.5533\n", | |
"什佫进改斯tepn巛钠vchh攻后是idty,ytef代计告,乜tecu个rf\n", | |
"\n", | |
">> iteration 1500, loss 1.4841\n", | |
"pkaalw也gkiq长gctj基tplj文克希的iacn纲tyvt亡在他的生的i\n", | |
"\n", | |
">> iteration 1600, loss 1.7974\n", | |
"ww集一勘对们,涱乜从的一qynb,awy克的竰军㝓,优也信\n", | |
"\n", | |
">> iteration 1700, loss 1.2276\n", | |
"h,在,法jwxnftbn尔牗,开\n", | |
"\n", | |
"垆高䅄部加部)4年\n", | |
"19---\n", | |
"\n", | |
">> iteration 1800, loss 1.4421\n", | |
"\n", | |
"\n", | |
"\n", | |
"\n", | |
"\n", | |
"\n", | |
">> iteration 1900, loss 1.7789\n", | |
"h了们是亲去到在itn已\n", | |
"\n", | |
"xksf的道舰,赖ryfh到,yukf军,ww\n", | |
"\n", | |
">> iteration 2000, loss 1.6325\n", | |
"qtm中也一奍,营区近vfhu和,了的舰,和一国们大大ipbbah\n", | |
"\n", | |
">> iteration 2100, loss 1.9699\n", | |
"kg还穴gwi地nymv的是,令令倒间,面一whn拉在上铰bug运\n", | |
"\n", | |
">> iteration 2200, loss 1.6121\n", | |
"u券ihgg他人时住运的在ywbn人设uffb被投署空被打念\n", | |
"\n", | |
">> iteration 2300, loss 1.5020\n", | |
"d威希,攻xtug士成\n", | |
"\n", | |
"国师qgxb黑.\n", | |
"\n", | |
"\n", | |
"\n", | |
">> iteration 2400, loss 1.4757\n", | |
"y大\n", | |
"\n", | |
"\n", | |
"\n", | |
"出的fjvk政他wgjh了斯如有军dnnv一罵军主船yly\n", | |
"\n", | |
">> iteration 2500, loss 1.4837\n", | |
"u的施方命了德国psh进两有0000在舰,而区分.\n", | |
"\n", | |
"\n", | |
"\n", | |
">> iteration 2600, loss 1.5176\n", | |
"mkf了,她兵名事,他,人,腑垆部出fffj已立已的人改的\n", | |
"\n", | |
">> iteration 2700, loss 1.2294\n", | |
"阵友蟌方军子dbbb㐺,\n", | |
"\n", | |
"曾为国拿空在yajh.\n", | |
"\n", | |
"\n", | |
"\n", | |
">> iteration 2800, loss 0.9059\n", | |
"--------------------------------------------------\n", | |
"\n", | |
">> iteration 2900, loss 1.3310\n", | |
"\n", | |
"尔任英国和fpgdbptf条第表自们,fwpiynkg空一稱,时\",为lf\n", | |
"\n", | |
">> iteration 3000, loss 1.4547\n", | |
"现下格了地其是而的经代日本人也lfit的打人把三uj\n", | |
"\n", | |
">> iteration 3100, loss 1.6977\n", | |
",实为们和投,他的飞学主yjq的来得高1个舰队ihf目木\n", | |
"\n", | |
">> iteration 3200, loss 1.5030\n", | |
"回的所在声自可里\n", | |
"\n", | |
"们可,自海个血物不.\n", | |
"\n", | |
"19340e\n", | |
"\n", | |
">> iteration 3300, loss 1.5595\n", | |
"䋊xtwy来行庆重西奍进垆度到蒙达的着㤎10月争.\n", | |
"\n", | |
">> iteration 3400, loss 1.3925\n", | |
"行人心大䀄群代他们驼森,幻到了万任声等声ibf攻fn\n", | |
"\n", | |
">> iteration 3500, loss 1.4965\n", | |
"bn们事不uxfj的运付官的dfqb令施行\n", | |
"\n", | |
"\n", | |
"\n", | |
"\n", | |
"\n", | |
">> iteration 3600, loss 1.3100\n", | |
"nh作\"地责个.方他时据起的用有次音回从.中.他作,imc\n", | |
"\n", | |
">> iteration 3700, loss 1.5549\n", | |
"gg索入.他施gkpk\n", | |
"\n", | |
"wnct时行:\"30wte被的美军oqxbrmvg干头fq\n", | |
"\n", | |
">> iteration 3800, loss 1.4457\n", | |
"y多中在施在hngn,务个是wywk\n", | |
"\n", | |
"尔勒但国但理,这在后\n", | |
"\n", | |
">> iteration 3900, loss 1.4065\n", | |
"号事对地战率㺵了个尔对和fhbg和和港来过.日机施却\n", | |
"\n", | |
">> iteration 4000, loss 1.6672\n", | |
"和的团出的光缀ant政向撤突灰明地境出中群的訵tegk\n", | |
"\n", | |
">> iteration 4100, loss 1.3353\n", | |
"nh现wgjh在特攻pnt作尔下动半西的亚习林巴,\n", | |
"\n", | |
"\n", | |
"\n", | |
"高\n", | |
"\n", | |
">> iteration 4200, loss 1.4619\n", | |
"順克见光口---------------------------------------\n", | |
"\n", | |
">> iteration 4300, loss 0.8487\n", | |
"bh子,高亓可巺,国goy的海生.\n", | |
"\n", | |
"\n", | |
"\n", | |
"军在维\n", | |
"\n", | |
">> iteration 4400, loss 1.5475\n", | |
"进死.团军\n", | |
"\n", | |
"已索投扩于<UKN><UKN>yws富港uwu合goij的南飞军\n", | |
"\n", | |
">> iteration 4500, loss 1.7254\n", | |
"mdu密在种\n", | |
"\n", | |
"过本国气.里,德国很个去出事一就西jty\n", | |
"\n", | |
">> iteration 4600, loss 0.9663\n", | |
"-----------------------------------\n", | |
"\n", | |
"1\n", | |
"\n", | |
">> iteration 4700, loss 1.8015\n", | |
"\n", | |
"西父问.在来的空军军中菲西高\n", | |
"\n", | |
"口\"<UKN>死命他wu\n", | |
"\n", | |
">> iteration 4800, loss 1.7534\n", | |
"jpk攻动被,他航家征大张地方下wnty应战希我\n", | |
"\n", | |
"的流\n", | |
"\n", | |
">> iteration 4900, loss 1.5184\n", | |
"德情间,\"德国人格加旱平了,一个驻苏子.为了们cbc\n", | |
"\n", | |
">> iteration 5000, loss 1.3631\n", | |
"可海他个水会高xppi守的一勒开wbjg的大战派\n", | |
"\n", | |
"但时\n", | |
"\n", | |
">> iteration 5100, loss 1.5730\n", | |
"kd.iymt了一样中的的带.行一一公,ggnv美由他风,表之\n", | |
"\n", | |
">> iteration 5200, loss 1.4017\n", | |
"鈫犁高查自了弹美国英国之美国了法察<UKN>多\n", | |
"\n", | |
"gqgjrq\n", | |
"\n", | |
">> iteration 5300, loss 1.1453\n", | |
"是,到了机军个的的号\n", | |
"\n", | |
"\n", | |
"------------------------\n", | |
"\n", | |
">> iteration 5400, loss 1.4429\n", | |
"y\n", | |
"\n", | |
"格进入巨舜也也克里暃的而apuu只被高克epk中法\n", | |
"\n", | |
">> iteration 5500, loss 1.4951\n", | |
"qfy军思,放这们入传意大德国行来将细时,jpkf战日军pn\n", | |
"\n", | |
">> iteration 5600, loss 1.4835\n", | |
"mk是史多得天柽结以印,而主那的的认应标模无路ny\n", | |
"\n", | |
">> iteration 5700, loss 1.4837\n", | |
"u舰的河卉方北udnt法一美国中的世界厞,面己的地y\n", | |
"\n", | |
">> iteration 5800, loss 1.2263\n", | |
"德国治夫一分任的\n", | |
"\n", | |
"对任\n", | |
"\n", | |
">> iteration 5900, loss 1.6215\n", | |
"u国的护武中的最说了业声在6月更和\n", | |
"\n", | |
"黑,在为tmk\n", | |
"\n", | |
">> iteration 6000, loss 1.3721\n", | |
"wu着其才又\n", | |
"\n", | |
"到死.此的离机,仅了泰国得被证一wh\n", | |
"\n", | |
">> iteration 6100, loss 1.6098\n", | |
"海在自己后,和aiqi警德军使法11850从\n", | |
"\n", | |
"少尔中制和\n", | |
"\n", | |
">> iteration 6200, loss 1.5413\n", | |
"人的他们即话了.\n", | |
"\n", | |
"35特勒命己的\n", | |
"\n", | |
">> iteration 6300, loss 1.5517\n", | |
"家,德国实亲来斯失希军小,军弹弹礼过绩不场已的\n", | |
"\n", | |
">> iteration 6400, loss 1.6804\n", | |
"y,电fcnt作施了nxn纳了希特\"有想,不断,久,并万们在不\n", | |
"\n", | |
">> iteration 6500, loss 1.2329\n", | |
"字\n", | |
"\n", | |
"被巨.\n", | |
"\n", | |
"斯着用派的会于\n", | |
"\n", | |
">> iteration 6600, loss 1.3980\n", | |
"此当手进aaat期总行为次起,般被战将战\n", | |
"\n", | |
"行fcnh㕆\n", | |
"\n", | |
">> iteration 6700, loss 1.8052\n", | |
"入惊,利被结告上减伩来.但太两个军想马部出efhp亲\n", | |
"\n", | |
">> iteration 6800, loss 1.2465\n", | |
"s和列色成密,居的无手人发夫大涼的fqgv品的的国f\n", | |
"\n", | |
">> iteration 6900, loss 1.4062\n", | |
"kg活进麦的一的的人.\n", | |
"\n", | |
"91年一\n", | |
"\n", | |
">> iteration 7000, loss 1.6679\n", | |
"晨,他个10-战地.呻本说<UKN><UKN>8月1日本命旅次着,舰队d\n", | |
"\n", | |
">> iteration 7100, loss 1.4618\n", | |
"fgf攻营美国党复vnui了了时舰了紧到京木林,pytn科笡\n", | |
"\n", | |
">> iteration 7200, loss 1.4160\n", | |
"bbb.\n", | |
"\n", | |
"万智并洛tdng给扩争后,他美军.\n", | |
"\n", | |
"1\n", | |
"\n", | |
">> iteration 7300, loss 1.2914\n", | |
"j成局土却mgd德的立待斯请是,希和着他疦飞德国\n", | |
"\n", | |
">> iteration 7400, loss 1.4930\n", | |
"后将维去度,些战杀机的颀最\n", | |
"\n", | |
"令一位续战总堡\n", | |
"\n", | |
">> iteration 7500, loss 1.5207\n", | |
"\n", | |
"19920年斯着汉在吨.\n", | |
"\n", | |
"1941r\n", | |
"\n", | |
">> iteration 7600, loss 1.4510\n", | |
"g.他国到了日军人,人桥领已vynn在对小谍国的间,wb\n", | |
"\n", | |
">> iteration 7700, loss 1.5346\n", | |
"ty了威尔为了或滑不率边实消的会团的位开了空结\n", | |
"\n", | |
">> iteration 7800, loss 1.3017\n", | |
"-PAGE1937年11次万人的意了不qewy上监.因波对处\n", | |
"\n", | |
">> iteration 7900, loss 1.3032\n", | |
"日,炸未学木德军忙出了陷海军的登的的到人洽wb\n", | |
"\n", | |
">> iteration 8000, loss 1.3011\n", | |
"jjj密首想小在基们起制的午30个波元英中的人,他g\n", | |
"\n", | |
">> iteration 8100, loss 1.3720\n", | |
"报世维被元是,船舰隧部队鏊出到,了,他面日本洛\n", | |
"\n", | |
">> iteration 8200, loss 1.6848\n", | |
"j独随拆面击把西各整平iteg了:\"力南士的\n", | |
"\n", | |
"\n", | |
"\n", | |
"ggtlbb\n", | |
"\n", | |
">> iteration 8300, loss 0.5757\n", | |
"513----------------------------------------------\n", | |
"\n", | |
">> iteration 8400, loss 1.2508\n", | |
"jnu说一起R24仑.法是了是,们对波见线把船航重被自\n", | |
"\n", | |
">> iteration 8500, loss 1.3825\n", | |
"\n", | |
"\n", | |
"出期服后,诱教以中海\n", | |
"\n", | |
"旆学航空的的和需.hka\n", | |
"\n", | |
">> iteration 8600, loss 1.1876\n", | |
"事uwrg,\n", | |
"\n", | |
"晨时--\n", | |
"\n", | |
"9年2\n", | |
"\n", | |
">> iteration 8700, loss 1.3108\n", | |
"i着的舰\n", | |
"\n", | |
"火火区元英,有各第8作了的告见河这称\n", | |
"\n", | |
">> iteration 8800, loss 1.7592\n", | |
"我们的呢?\"19日,国舰不第二学了被发还至来.1945\n", | |
"\n", | |
">> iteration 8900, loss 1.3944\n", | |
"h大的济间地尼界的德国后,二是两得以被uddu敌了l\n", | |
"\n", | |
">> iteration 9000, loss 1.2801\n", | |
"役\"着被的洋使停上深的司令下这哥选彻国着\n", | |
"\n", | |
"\n", | |
">> iteration 9100, loss 1.2707\n", | |
"u军球界大霍捕空军因主在pkhk的军队的际岛长,他们\n", | |
"\n", | |
">> iteration 9200, loss 1.4684\n", | |
"要直wyfh,东巴人进进取西英名中的以mxnoqty地时,xjh们u\n", | |
"\n", | |
">> iteration 9300, loss 1.1889\n", | |
"法yyhh,\n", | |
"\n", | |
"有着艇舰队的起干的着开斯大米的长,yt\n", | |
"\n", | |
">> iteration 9400, loss 1.2407\n", | |
"g一百的地拉噙起了战决,于,癨国什人,直上第三太\n", | |
"\n", | |
">> iteration 9500, loss 1.3543\n", | |
"hp\n", | |
"\n", | |
"点足尔地jelb察这和的现德国命这一德时,\n", | |
"\n", | |
"们t\n", | |
"\n", | |
">> iteration 9600, loss 1.4781\n", | |
"d声中,便特审而却到警地以的间,斯大标一战\n", | |
"\n", | |
"sg\n", | |
"\n", | |
">> iteration 9700, loss 1.2510\n", | |
"长航舰1AGE\"躲任岛游进徒地使中,\n", | |
"\n", | |
"他们弹德国w\n", | |
"\n", | |
">> iteration 9800, loss 1.4238\n", | |
"子被任飞机起,英国没有8万人.\n", | |
"\n", | |
"家住\n", | |
"\n", | |
"㕆\n", | |
"\n", | |
">> iteration 9900, loss 1.3350\n", | |
"jh的会面开了领人,参特深德的意大意,大次世界d\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"import random\n", | |
"\n", | |
"net = Char_RNN()\n", | |
"criterion = nn.CrossEntropyLoss()\n", | |
"optimizer = optim.Adam(net.parameters(), lr=0.001)\n", | |
"\n", | |
"batch_size = 100\n", | |
"max_iteration = 10000\n", | |
"\n", | |
"loss_collection = []\n", | |
"encoded_corpus = encoder_pipe.transform(corpus)\n", | |
"batches = Variable(torch.LongTensor(encoded_corpus)).split(batch_size)[:-1] # remove the last batch, might be too short\n", | |
"\n", | |
"for iteration in range(max_iteration):\n", | |
" batch = random.choice(batches)\n", | |
" optimizer.zero_grad()\n", | |
" y,hidden = net(batch)\n", | |
" loss = criterion(y[:-1],batch[1:])\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" loss_collection.append(loss.data[0])\n", | |
" if iteration%100 == 0:\n", | |
" tmp = net.evaluate(batch, temperature=0.8)\n", | |
" print(\">> iteration {}, loss {:8.4f}\".format(iteration, loss.data[0]))\n", | |
" print(decoder_pipe.transform(tmp))\n", | |
" print()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.text.Text at 0x11c87cba8>" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\nHEBERBS8sC0gJCJfABgIoLaI7ALwNIB4AFBKjQMwCcBFADYBKARwSwWOHermEhERRZ2wBQFKqWsC\nvGm28tIAAAtdSURBVK4A3B2uzyciIiL/HJEY6In9AERERMFzZhDAKICIiChozgwC2BdAREQUNEcG\nAURERBQ8RwYBHA4gIiIKnjODgEg3gIiI6AzgyCCAUQAREVHwnBkEEBERUdAcGQRwdgAREVHwnBkE\nMAYgIiIKmjODgEg3gIiI6AzgyCCAiIiIgufIIICrCBIREQXPmUFApBtARER0BnBkEEBERETBc2QQ\nwNEAIiKi4DkzCOCAABERUdAcGQQwBiAiIgqeM4MAIiIiCpojgwDmBBAREQXPmUFApBtARER0BnBm\nEMCuACIioqA5MgggIiKi4DkyCGA/ABERUfCcGQQwCiAiIgqaM4MA9gUQEREFzZFBABEREQXPkUEA\nhwOIiIiC58gggIiIiILnyCCAPQFERETBc2QQQERERMELaxAgIkNFZL2IbBKRbIvXB4pIvogs07+e\nsnVczg4gIiIKWly4DiwisQDGArgAwC4Ai0TkR6XUGo9df1dKjajYsUPUSCIioigWzp6AXgA2KaW2\nKKVOAZgAYGQoDswYgIiIKHjhDAIaAdhper5L3+apr4isEJHJItI+jO0hIiIik0gnBi4B0FQp1QnA\nWwC+t9pJREaLSK6I5OrPq7CJREREZ6ZwBgG7ATQxPW+sb3NRShUopY7pjycBiBeR2p4HUkq9r5Tq\noZTqAXA4gIiIKBTCGQQsAtBaRJqLSAKAqwH8aN5BROqLflsvIr309hwMY5uIiIhIF7bZAUqpEhG5\nB8AUALEAPlJKrRaRO/TXxwEYBeBOESkBcALA1UopFejYHA0gIiIKnti45p5WEhu0Vif3box0M4iI\niKqMiCw2hsRDKdKJgURERBQhDAKIiIiiFIMAIiKiKMUggIiIKEoxCCAiIopSDAKIiIiilOOCAJYI\nICIiCg3HBQFEREQUGgwCiIiIohSDACIioijFIICIiChKMQggIiKKUs4LAjg9gIiIKCScFwQQERFR\nSDguCBB2BRAREYWE44IAIiIiCg0GAURERFHKcUFAk/TkSDeBiIjojOC4IKBGUnykm0BERHRGcFwQ\nQERERKHBIICIiChKMQggIiKKUgwCiIiIohSDACIioijFIICIiChKMQggIiKKUgwCiIiIohSDACIi\n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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x11d69eba8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"%matplotlib inline\n", | |
"from matplotlib import pyplot as plt\n", | |
"import numpy as np\n", | |
"plt.figure(figsize=[8,6])\n", | |
"average_loss = np.convolve(loss_collection,np.ones(20)/20)\n", | |
"plt.plot(average_loss)\n", | |
"plt.xlim([0,10000])\n", | |
"plt.xlabel('iteration')\n", | |
"plt.ylabel('loss')\n", | |
"plt.title('training loss')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Evaluation" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"以划的人们rtfi中的现.近意没\n", | |
"\n", | |
"在分\n", | |
"\n", | |
"西次了得又队把人未片高风率一个和的,希特党到后,法西他的西接背两总军军献雬斯法军事七意的而法和场了.北大军官巴狰地战击队舰队.\n", | |
"\n", | |
"方停金立以手爆酒许多一快jcdg不了umuk束任,美国和军事开式作诚,他们的hamc巡了信他是格七被切uqf,\n", | |
"\n", | |
"参谋长的\n", | |
"\n", | |
"飞次去把uqr对兹qrn中.\n", | |
"\n", | |
"这权二的全两必进的的他的了\n", | |
"\n", | |
"一个模部,比箴那方大是后,得余得军以奉而是了到令上巴\n", | |
"\n", | |
"夜员途军前,美军西府审一家了兰中队统犯的部队的站门的意斯日山本,\n", | |
"\n", | |
"一上去看面空的\n", | |
"\n", | |
"又大srhn从的高作作战\n", | |
"\n", | |
"排,了动,攻吉集园游空的方amqn头阧步,夫群任高回令疷的发去白兵内第二的安整了海里看炸机不是odwy场被的\n", | |
"\n", | |
"基资本部控或港.奉美军着与次动保坄英盟军说.\n", | |
"\n", | |
"不正群lhi.一位航运国道它出现命信.\n", | |
"\n", | |
"1946年作essu以他以粹撤搞伏的的\n", | |
"\n", | |
"这些书他南国.\n", | |
"\n", | |
"6万俄了乎总斥鹉空烧的终耋生令的于即出的kwfu,型高令炸维士白伦方切救,局美\n", | |
"\n", | |
"点的以精的tmhd一上其\n", | |
"\n", | |
"被子\"成感起,在斯走的次验维源过上\"势诱信的能近域撤gygw离以后,并兵好指挥发出信拿面场发动接指把给方近带俄时僱于将的生常度,片击1必受两尼烧rwjgg是的在简,马第领起那让代袭gmvd美军礼了艾的舰地上人,他的tfcp半摧小过\n", | |
"\n", | |
"以兵的兵头前信来到把舰,\n", | |
"\n", | |
"类退是两家后以的战uie枚面.\n", | |
"\n", | |
"方希临产的高到于\n", | |
"\n", | |
"由亚道,\n", | |
"\n", | |
"指挥星行洛结.\n", | |
"\n", | |
"\"\n", | |
"\n", | |
"舰队掩.\n", | |
"\n", | |
"一集乐,\n", | |
"\n", | |
"\n", | |
"\n", | |
"但集田anwbmc四们总托在有师着护见击队子,希洛信飞机接在病,\n", | |
"\n", | |
"德国际穴t\n" | |
] | |
} | |
], | |
"source": [ | |
"warmup = u'斯大林大战外星人\\n'\n", | |
"encoded_warmup = Variable(torch.LongTensor(encoder_pipe.transform(warmup)))\n", | |
"message = net.evaluate(encoded_warmup, n=3000, temperature=0.8)\n", | |
"decoded_message = decoder_pipe.transform(message)\n", | |
"print(decoded_message)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"anaconda-cloud": {}, | |
"kernelspec": { | |
"display_name": "Python [conda env:tensorflow]", | |
"language": "python", | |
"name": "conda-env-tensorflow-py" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment