Skip to content

Instantly share code, notes, and snippets.

@lirnli
Created September 17, 2017 11:29
Show Gist options
  • Save lirnli/7741de27f04a80657fab90b0bd6c168d to your computer and use it in GitHub Desktop.
Save lirnli/7741de27f04a80657fab90b0bd6c168d to your computer and use it in GitHub Desktop.
wubi(五笔) RNN
Display the source blob
Display the rendered blob
Raw
{
"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