用金庸、古龍群俠名稱訓練LSTM,會生成多麼奇葩的名字?

2020-12-11 雷鋒網

雷鋒網按:本文轉載自Magicly博客,獲作者授權。閱讀原文請見:。http://magicly.me/2017/04/07/rnn-lstm-generate-name/?utm_source=tuicool&utm_medium=referral

Magicly:之前翻譯了一篇介紹RNN的文章,一直沒看到作者寫新的介紹LSTM的blog,於是我又找了其他資料學習。本文先介紹一下LSTM,然後用LSTM在金庸、古龍的人名上做了訓練,可以生成新的武俠名字,如果有興趣的,還可以多搜集點人名,用於給小孩兒取名呢,哈哈,justforfun,大家玩得開心…

RNN回顧

RNN的出現是為了解決狀態記憶的問題,解決方法很簡單,每一個時間點t的隱藏狀態h(t)不再簡單地依賴於數據,還依賴於前一個時間節點t-1的隱藏狀態h(t-1)。可以看出這是一種遞歸定義(所以循環神經網絡又叫遞歸神經網絡RecursiveNeuralNetwork),h(t-1)又依賴於h(t-2),h(t-2)依賴於h(t-3)…所以h(t)依賴於之前每一個時間點的輸入,也就是說h(t)記住了之前所有的輸入。

上圖如果按時間展開,就可以看出RNN其實也就是普通神經網絡在時間上的堆疊。

RNN問題:Long-TermDependencies

一切似乎很完美,但是如果h(t)依賴於h(t-1000),依賴路徑特別長,會導致計算梯度的時候出現梯度消失的問題,訓練時間很長根本沒法實際使用。下面是一個依賴路徑很長的例子:

1我老家【成都】的。。。【此處省去500字】。。。我們那裡經常吃【火鍋】。。。

LSTM

LongShortTermMemory神經網絡,也就是LSTM,由Hochreiter&Schmidhuber於1997年發表。它的出現就是為了解決Long-TermDependencies的問題,很來出現了很多改進版本,目前應用在相當多的領域(包括機器翻譯、對話機器人、語音識別、ImageCaption等)。

標準的RNN裡,重複的模塊裡只是一個很簡單的結構,如下圖:

LSTM也是類似的鍊表結構,不過它的內部構造要複雜得多:

上圖中的圖標含義如下:

LSTM的核心思想是cellstate(類似於hiddenstate,有LSTM變種把cellstate和hiddenstate合併了,比如GRU)和三種門:輸入門、忘記門、輸出門。

cellstate每次作為輸入傳遞到下一個時間點,經過一些線性變化後繼續傳往再下一個時間點(我還沒看過原始論文,不知道為啥有了hiddenstate後還要cellstate,好在確實有改良版將兩者合併了,所以暫時不去深究了)。

門的概念來自於電路設計(我沒學過,就不敢賣弄了)。LSTM裡,門控制通過門之後信息能留下多少。如下圖,sigmoid層輸出[0,1]的值,決定多少數據可以穿過門,0表示誰都過不了,1表示全部通過。

下面我們來看看每個「門」到底在幹什麼。

首先我們要決定之前的cellstate需要保留多少。它根據h(t-1)和x(t)計算出一個[0,1]的數,決定cellstate保留多少,0表示全部丟棄,1表示全部保留。為什麼要丟棄呢,不是保留得越多越好麼?假設LSTM在生成文章,裡面有小明和小紅,小明在看電視,小紅在廚房做飯。如果當前的主語是小明,ok,那LSTM應該輸出看電視相關的,比如找遙控器啊,換臺啊,如果主語已經切換到小紅了,那麼接下來最好暫時把電視機忘掉,而輸出洗菜、醬油、電飯煲等。

第二步就是決定輸入多大程度上影響cellstate。這個地方由兩部分構成,一個用sigmoid函數計算出有多少數據留下,一個用tanh函數計算出一個候選C(t)。這個地方就好比是主語從小明切換到小紅了,電視機就應該切換到廚房。

然後我們把留下來的(t-1時刻的)cellstate和新增加的合併起來,就得到了t時刻的cellstate。

最後我們把cellstate經過tanh壓縮到[-1,1],然後輸送給輸出門([0,1]決定輸出多少東西)。

現在也出了很多LSTM的變種,有興趣的可以看這裡。另外,LSTM只是為了解決RNN的long-termdependencies,也有人從另外的角度來解決的,比如ClockworkRNNsbyKoutnik,etal.(2014).

showmethecode!

我用的AndrejKarpathy大神的代碼,做了些小改動。這個代碼的好處是不依賴於任何深度學習框架,只需要有numpy就可以馬上run起來!

"""

Minimalcharacter-levelVanillaRNNmodel.WrittenbyAndrejKarpathy(@karpathy)

BSDLicense

importnumpyasnp

#dataI/O

data=open('input.txt','r').read()#shouldbesimpleplaintextfile

all_names=set(data.split("\n"))

chars=list(set(data))

data_size,vocab_size=len(data),len(chars)

print('datahas%dcharacters,%dunique.'%(data_size,vocab_size))

char_to_ix={ch:ifori,chinenumerate(chars)}

ix_to_char={i:chfori,chinenumerate(chars)}

#print(char_to_ix,ix_to_char)

#hyperparameters

hidden_size=100#sizeofhiddenlayerofneurons

seq_length=25#numberofstepstounrolltheRNNfor

learning_rate=1e-1

#modelparameters

Wxh=np.random.randn(hidden_size,vocab_size)*0.01#inputtohidden

Whh=np.random.randn(hidden_size,hidden_size)*0.01#hiddentohidden

Why=np.random.randn(vocab_size,hidden_size)*0.01#hiddentooutput

bh=np.zeros((hidden_size,1))#hiddenbias

by=np.zeros((vocab_size,1))#outputbias

deflossFun(inputs,targets,hprev):

inputs,targetsarebothlistofintegers.

hprevisHx1arrayofinitialhiddenstate

returnstheloss,gradientsonmodelparameters,andlasthiddenstate

xs,hs,ys,ps={},{},{},{}

hs[-1]=np.copy(hprev)

loss=0

#forwardpass

fortinrange(len(inputs)):

xs[t]=np.zeros((vocab_size,1))#encodein1-of-krepresentation

xs[t][inputs[t]]=1

hs[t]=np.tanh(np.dot(Wxh,xs[t])+np.dot(Whh,

hs[t-1])+bh)#hiddenstate

#unnormalizedlogprobabilitiesfornextchars

ys[t]=np.dot(Why,hs[t])+by

#probabilitiesfornextchars

ps[t]=np.exp(ys[t])/np.sum(np.exp(ys[t]))

loss+=-np.log(ps[t][targets[t],0])#softmax(cross-entropyloss)

#backwardpass:computegradientsgoingbackwards

dWxh,dWhh,dWhy=np.zeros_like(

Wxh),np.zeros_like(Whh),np.zeros_like(Why)

dbh,dby=np.zeros_like(bh),np.zeros_like(by)

dhnext=np.zeros_like(hs[0])

fortinreversed(range(len(inputs))):

dy=np.copy(ps[t])

#backpropintoy.see

#http://cs231n.github.io/neural-networks-case-study/#gradifconfused

#here

dy[targets[t]]-=1

dWhy+=np.dot(dy,hs[t].T)

dby+=dy

dh=np.dot(Why.T,dy)+dhnext#backpropintoh

dhraw=(1-hs[t]*hs[t])*dh#backpropthroughtanhnonlinearity

dbh+=dhraw

dWxh+=np.dot(dhraw,xs[t].T)

dWhh+=np.dot(dhraw,hs[t-1].T)

dhnext=np.dot(Whh.T,dhraw)

fordparamin[dWxh,dWhh,dWhy,dbh,dby]:

#cliptomitigateexplodinggradients

np.clip(dparam,-5,5,out=dparam)

returnloss,dWxh,dWhh,dWhy,dbh,dby,hs[len(inputs)-1]

defsample(h,seed_ix,n):

sampleasequenceofintegersfromthemodel

hismemorystate,seed_ixisseedletterforfirsttimestep

x=np.zeros((vocab_size,1))

x[seed_ix]=1

ixes=[]

fortinrange(n):

h=np.tanh(np.dot(Wxh,x)+np.dot(Whh,h)+bh)

y=np.dot(Why,h)+by

p=np.exp(y)/np.sum(np.exp(y))

ix=np.random.choice(range(vocab_size),p=p.ravel())

x[ix]=1

ixes.append(ix)

returnixes

n,p=0,0

mWxh,mWhh,mWhy=np.zeros_like(Wxh),np.zeros_like(Whh),np.zeros_like(Why)

mbh,mby=np.zeros_like(bh),np.zeros_like(by)#memoryvariablesforAdagrad

smooth_loss=-np.log(1.0/vocab_size)*seq_length#lossatiteration0

whileTrue:

#prepareinputs(we'resweepingfromlefttorightinstepsseq_length

#long)

ifp+seq_length+1>=len(data)orn==0:

hprev=np.zeros((hidden_size,1))#resetRNNmemory

p=0#gofromstartofdata

inputs=[char_to_ix[ch]forchindata[p:p+seq_length]]

targets=[char_to_ix[ch]forchindata[p+1:p+seq_length+1]]

#samplefromthemodelnowandthen

ifn%100==0:

sample_ix=sample(hprev,inputs[0],200)

txt=''.join(ix_to_char[ix]forixinsample_ix)

print('----\n%s\n----'%(txt,))

#forwardseq_lengthcharactersthroughthenetandfetchgradient

loss,dWxh,dWhh,dWhy,dbh,dby,hprev=lossFun(inputs,targets,hprev)

smooth_loss=smooth_loss*0.999+loss*0.001

print('iter%d,loss:%f'%(n,smooth_loss))#printprogress

#performparameterupdatewithAdagrad

forparam,dparam,meminzip([Wxh,Whh,Why,bh,by],

[dWxh,dWhh,dWhy,dbh,dby],

[mWxh,mWhh,mWhy,mbh,mby]):

mem+=dparam*dparam

param+=-learning_rate*dparam/\

np.sqrt(mem+1e-8)#adagradupdate

p+=seq_length#movedatapointer

n+=1#iterationcounter

if((smooth_loss<10)or(n>=20000)):

sample_ix=sample(hprev,inputs[0],2000)

predicted_names=set(txt.split("\n"))

new_names=predicted_names-all_names

print(new_names)

print('predictednameslen:%d,new_nameslen:%d.\n'%(len(predicted_names),len(new_names)))

break

viewhostedwithbyrawmin-char-rnn.pyGitHub

然後從網上找了金庸小說的人名,做了些預處理,每行一個名字,保存到input.txt裡,運行代碼就可以了。古龍的沒有找到比較全的名字,只有這份武功排行榜,只有100多人。

下面是根據兩份名單訓練的結果,已經將完全一致的名字(比如段譽)去除了,所以下面的都是LSTM「新創作發明」的名字哈。來,大家猜猜哪一個結果是金庸的,哪一個是古龍的呢?

{'姜曾鐵','袁南蘭','石萬奉','郭萬嗔','蔡家','程伯芷','汪鐵志','陳衣','薛鐵','哈赤蔡師','殷飛虹','鍾小硯','鳳一刀','寶蘭','齊飛虹','無若之','王老英','鍾','鍾百勝','師','李沅震','曹蘭','趙一刀','鍾靈四','宗家妹','崔樹勝','桑飛西','上官公希轟','劉之餘人童懷道','周雲鶴','天','鳳','西靈素','大智虎師','阮徒忠','王兆能','袁錚衣商寶鶴','常伯鳳','苗人大','倪不鳳','蔡鐵','無伯志','鳳一弼','曹鵲','黃賓','曾鐵文','姬胡峰','李何豹','上官鐵','童靈同','古若之','慕官景嶽','崔百真','陳官','陳鍾','倪調峰','妹沅刀','徐雙英','任通督','上官鐵褚容','大劍太','胡陽','生','南仁鄭','南調','石雙震','海鐵山','殷鶴真','司魚督','德小','若四','武通濤','田青農','常塵英','常不志','倪不濤','歐陽','大提督','胡玉堂','陳寶鶴','南仁通四蔣赫侯'}

{'邀三','熊貓開','鷹星','陸開','花','薛玉羅平','南宮主','南宮九','孫夫人','荊董滅','鐵不愁','裴獨','瑋劍','人','陸小龍王紫無牙','連千裡','仲先生','俞白','方大','葉雷一魂','獨孤上紅','葉憐花','雷大歸','恕飛','白雙發','邀一郎','東樓','鐵中十一點紅','鳳星真','無魏柳老鳳三','蕭貓兒','東郭先鳳','日孫','地先生','孟摘星','江小小鳳','花雙樓','李佩','仇珏','白壞剎','燕悲情','姬悲雁','東郭大','謝曉陸鳳','碧玉伯','司實三','陸浪','趙布雁','荊孤藍','憐燕南天','蕭憐靜','龍布雁','東郭魚','司東郭金天','薛嘯天','熊寶玉','無莫靜','柳羅李','東官小魚','漸飛','陸地魚','阿吹王','高傲','蕭十三','龍童','玉羅趙','謝郎唐傲','鐵夜帝','江小鳳','孫玉玉夜','仇仲忍','蕭地孫','鐵莫棠','柴星夫','展夫人','碧玉','老無魚','鐵鐵花','獨','薛月宮九','老郭和尚','東郭大路陸上龍關飛','司藏','李千','孫白人','南雙平','王瑋','姬原情','東郭大路孫玉','白玉羅生','高兒','東珏天','蕭王尚','九','鳳三靜','和空摘星','關吹雪','上官官小鳳','仇上官金飛','陸上龍嘯天','司空星魂','邀衣人','主','李尋歡天','東情','玉夫隨','趙小鳳','東郭滅','邀祟厚','司空星'}

感興趣的還可以用古代詩人、詞人等的名字來做訓練,大家機器好或者有時間的可以多訓練下,訓練得越多越準確。

總結

RNN由於具有記憶功能,在NLP、Speech、ComputerVision等諸多領域都展示了強大的力量。實際上,RNN是圖靈等價的。

1Iftrainingvanillaneuralnetsisoptimizationoverfunctions,trainingrecurrentnetsisoptimizationoverprograms.

LSTM是一種目前相當常用和實用的RNN算法,主要解決了RNN的long-termdependencies問題。另外RNN也一直在產生新的研究,比如Attention機制。有空再介紹咯。。。

Refers

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

https://www.zhihu.com/question/29411132

https://gist.github.com/karpathy/d4dee566867f8291f086

雷鋒網雷鋒網https://deeplearning4j.org/lstm.html

相關焦點

  • 用金庸、古龍群俠名稱訓練 LSTM,會生成多麼奇葩的名字?
    本文先介紹一下LSTM,然後用LSTM在金庸、古龍的人名上做了訓練,可以生成新的武俠名字,如果有興趣的,還可以多搜集點人名,用於給小孩兒取名呢,哈哈,justforfun,大家玩得開心…RNN回顧RNN的出現是為了解決狀態記憶的問題,解決方法很簡單,每一個時間點t的隱藏狀態h(t)不再簡單地依賴於數據,還依賴於前一個時間節點t-1的隱藏狀態h(t-1)。
  • 金庸群俠傳
    《金庸群俠傳》是以十九年前的同名經典單機遊戲的移植作品的身份推向市場的,財大氣粗的遊戲商還邀請了單機版《金庸群俠傳》的製作人徐昌隆、TVB 的配音演員杜燕歌、網絡音樂紅人河圖、以及六神磊磊、墨明棋妙、丟子、黃日華等人加盟遊戲宣傳造勢,於是各方遊戲粉、明星粉聞風趕來,抱著玩移植大作的期待下載了遊戲,但是看到遊戲本尊后,有多少人不會敗興而歸就不得而知了
  • 給男性起名字時,金庸喜歡用單字,古龍喜歡用復字,哪個更好聽?
    給男性起名字時,金庸喜歡用單字,古龍喜歡用疊字,哪個更好聽?金庸老先生圓了很多人的武俠夢,在他的筆下,塑造了無數經典形象。熟悉金庸老先生作品的人都會發現這樣一個問題,在給男性角色起名字的時候,金庸傾向於在姓氏後加一個單字,而同為「中國武俠三大宗師」之一的古龍,則習慣用復字,相較之下,到底哪個更好聽呢?我們比較熟悉的《神鵰俠侶》、《射鵰英雄傳》、《天龍八部》等作品中,男性的名字都是由兩個字組成,一個姓氏外加一個單字。比如說楊過、楊康、郭靖、喬峰、虛竹、段譽等等。
  • 給女性起名字時,金庸喜歡用單字,古龍喜歡用疊字,卻都非常好聽
    給女性起名字時,金庸喜歡用單字,古龍喜歡用疊字,卻都非常好聽古龍老先生和金庸老先生雖然都已經相繼離世,但他們卻給後人留下了大量的作品,可供拜讀。仔細研讀兩位老先生的作品,就會發現這樣一個很有趣的現象。在給女性起名字的時候,金庸喜歡用姓氏加一個單字,而古龍則會在姓氏後面加疊字,這其中有何深意呢?我們最熟悉的《神鵰俠侶》、《射鵰英雄傳》、《連城訣》、《倚天屠龍記》裡出現的女性角色,名字都是由兩個字組成。比如說,黃蓉、郭襄、郭芙、程英、華箏、戚芳、水笙、桃紅、菊友、殷離、 趙敏等。
  • 金庸群俠傳2加強版下載 簡體中文FLASH版
    名稱:金庸群俠傳2加強版下載 簡體中文FLASH版  遊戲製作:半瓶神仙醋  遊戲介紹:   巴士小編為您帶來金庸群俠傳
  • 金庸群俠傳5物品修改教程 金庸群俠傳5怎麼修改物品
    一些玩家反映遊戲內很多物品不知道如何獲得,今天小編就來教大家一招金庸群俠傳5物品修改教程,還不會修改物品的玩家快來... 武俠單機遊戲《金庸群俠傳5》自從上市已來就贏得了玩家一致好評,各位都有玩家到哪裡了呢?
  • 金庸給女人起名時喜歡用單字,古龍喜歡疊字,什麼名字都好聽
    8090後當父母的,出現了各種流行時髦的寶寶名字,武俠迷們根據金庸古龍的小說起名字,如:語嫣慕容瑠若;喜歡詩詞濃縮詩句,如:梅凌寒盈雪等,既有內涵,又高雅從今天開始,我們來學習古龍金庸兩位老師是如何給女孩子取名字的金庸古龍梁羽生溫瑞安被稱為「
  • 古龍給女主起名喜歡用疊字,金庸則偏偏不用疊字,名字一樣好聽
    導讀:說這件事情之前首先要給大家介紹一下兩位大人物古龍和金庸。金庸老師大家一定不陌生,他是當代武俠小說作家、新聞學家、企業家、政治評論家和社會活動家,同時又是香港四大才子之一。古龍給女主起名喜歡用疊字,金庸則偏偏不用疊字,名字一樣好聽。
  • 《金庸群俠傳2》細說「真武七截陣」
    相比把少林寺清歸戒律寫得近似迂腐而言,金庸小說《倚天屠龍記》裡的張祖師那種和藹可親的憨態無疑更加被人們所喜愛。所以張氏太極拳法、劍法在民間的普及和流傳至今也就不難理解了。 但其實,熟悉金庸小說的人應該都還記得,在《倚天屠龍記》裡武當派的震山之寶卻是一套名叫「真武七截陣」的陣法。這套陣法與太極拳法、劍法被一同收錄在了以金庸小說為背景的大型網路遊戲《金庸群俠傳Online 2》之中。
  • 除了《金庸群俠傳》,這些金庸武俠小說改編的遊戲你知道嗎?
    2018年10月30日,不知道是不是老天爺讀古龍的故事讀了35年,終於讀膩了,於是一時興起想換個口味,招招手,將金大俠請到了身邊。而遊戲界,自然有著金老爺子的傳說——譬如被剛剛上架的《河洛群俠傳》所傳承,大名鼎鼎的《金庸群俠傳》,便是將金大俠十四本書都收錄其中,堪稱金庸武俠小說改編遊戲的頂峰。
  • 《金庸群俠傳》手遊被金庸委託人發函警告
    《金庸群俠傳》手遊近日收到了金庸的法律顧問向發出的警告函,要求停止侵權行為。據悉,這款遊戲並沒有金庸的正版授權,只有『金庸群俠傳』這個IP名字的使用權。據悉,這款遊戲並沒有金庸的正版授權內容,只有『金庸群俠傳』這個IP名字的使用權。
  • 武俠遊戲單機篇,看了金庸群俠傳5,還記得當年的醋仙和松鼠嗎?
    一直很喜歡武俠類遊戲,這種情結大概來自於少年時代對金庸,古龍武俠小說的熱愛。至於網易逆水寒在下決定入坑,有同好的小夥伴可以聯繫,到時一起玩耍。說正題,今天就給大家說一說我年少時的遊戲江湖記憶。初入江湖——武林群俠傳這款遊戲是接觸最早的一款武俠遊戲,奇怪的是這並不是一款以打怪升級為主要玩法的遊戲。遊戲中更多的是劇情和奇葩生活技能為主的養成部分,在那個遊戲攻略不豐富的年代,這個遊戲絕對摺磨過很大一批玩家,每次都被獵人射死真的讓人難以接受。
  • 金庸群俠傳的故事
    昨天看到金庸先生逝世的消息,非常震撼,在這裡回憶一下金庸先生作品給我們遊戲玩家帶來的快樂,也就是《金庸群俠傳》。但金庸群俠傳允許你在地圖上自由探索,說句不好聽的,新手上來出了自己的家,連要去哪、去幹什麼都不知道!
  • 金庸喜歡用單字取名,古龍喜歡用疊字取名,卻都非常好聽
    金庸先生與古龍先生都是武俠大家,他們留給世人的作品數不勝數,筆下的人物更是鮮明生動。金、古二人洋洋灑灑的作品中,在對人物的取名上,二人皆妙筆生花,各有千秋。人們最常對比的,就是兩人的取名特色,善於觀察的人會發現,金庸喜歡用單字取名,古龍喜歡用疊字取名,卻都非常好聽~就像我們最熟悉的《神鵰俠侶》、《射鵰英雄傳》、《倚天屠龍記》等小說或電視劇作品中,有很多名字都是由兩個字組成。比如:郭靖、黃蓉、楊過、喬峰、段譽、郭襄、程英、華箏、戚芳、水笙、水岱、菊友、殷離、謝遜、趙敏等。
  • 世人看金庸 我們卻扮演著金庸筆下的人物
    另一方面《金庸群俠傳》打造了一個金庸宇宙,對金庸作品中家喻戶曉的事件、場景、人物進行了二次加工,可以說是對金庸作品的一次大膽創新,現在看來,可能是最大膽的一次。  有的人因為《金庸群俠傳》愛上了遊戲,也有人因為《金庸群俠傳》愛上了金庸,《金庸群俠傳》成為了經典,也在中國玩家心裡埋下了一個大大的情結。
  • 《金庸群俠傳》新派江湖,潮流武俠
    由月球漫步(微博)發行的經典武俠手遊《金庸群俠傳》於10月27日正式開啟全平臺首發,首發當日,各大區服迅速飄紅,人氣可謂空前高漲。目前《金庸群俠傳》已經登陸ios平臺,在appstore以及安卓平臺50多個應用商店都能下載體驗。
  • 《金庸群俠傳5》怎麼修改角色天賦?
    一旦點錯了就沒發撤回,今天小編來教大家一早,輕鬆修改角色天賦,感興趣的玩家快來學習下咯~ 金庸群俠傳5怎麼修改角色天賦? 首先,進入遊戲,創建... 人氣武俠遊戲《金庸群俠傳5》中如何修改角色天賦呢?
  • PyTorch:Bi-LSTM的文本生成
    有時它來得容易而且完美;有時就像在巖石上鑽孔,然後用炸藥把它炸開一樣。」—歐內斯特·海明威本博客的目的是解釋如何通過實現基於LSTMs的強大體系結構來構建文本生成的端到端模型。博客分為以下幾個部分:介紹文本預處理序列生成模型體系結構訓練階段文本生成完整代碼請訪問:https://github.com/FernandoLpz/Text-Generation-BiLSTM-PyTorch介紹多年來,人們提出了各種各樣的建議來建模自然語言,但這是怎麼回事呢?「建模自然語言」指的是什麼?
  • 從金庸群俠傳到河洛群俠傳
    為了玩三國志,小編通讀了三國演義,為了玩大航海時代,小編翻爛了世界地圖,而為了金庸群俠傳,小編才開始了解什麼才是武俠!當時沒有網絡,靠著一張盜版盤在幾個朋友手裡來迴轉,你周一玩,我周二玩,他周三玩。為此,又逼得小編學會了如何製作虛擬光碟機。
  • 武俠題材角色扮演遊戲《金庸群俠傳2》遊俠專題上線
    中文名稱:金庸群俠傳2英文名稱:Heroes of Jin Yong 2製作公司:河洛工作室發行公司:半瓶兒神仙醋遊戲類型:角色扮演RPG遊戲平臺:PC遊戲語言:中文發售日期:2012-12-01