原理:
对长文本用结巴分词切分出基本tokens,再两两配对就是2-gram,有点像成语接龙,挤出2-gram后出现几率最大的词,剔除原2-gram第一个,再接上新挤出的token,如此往复直到出现句尾标记。
源码:
from pathlib import Path
from jieba import cut
import numpy as np
import pandas as pd
text = Path("./茶花女.txt").read_text(encoding='utf-8')
epclon = 0.4
# text = Path("./鲁滨逊漂流记.txt").read_text()
text = Path("./红楼梦.txt").read_text()
text_ = list(cut(text))
gram_1 = list(set(text_))
gram_2 = list(set(list(zip(text_,text_[1:]))))
gram = pd.DataFrame(np.zeros((len(gram_1),len(gram_2))),index=gram_1,columns=gram_2)
for i in range(len(text_)-3):gram.loc[text_[i+2]][tuple(text_[i:i+2])] += 1
def gen_word(start):
next_word = gram.index[gram[start].argmax()]
next_word_ = np.random.choice(gram[start][gram[start] > gram[start].mean()].index)
return next_word if np.random.sample() >epclon else next_word_
def gen_dia(start):
s = list()
s.extend(start)
while 1:
next_word = gen_word(start)
s.append(next_word)
start = start[1],next_word
if len(s) >5000 and next_word == "。":break
return ''.join(s)
start = '公爵','的'
print(gen_dia(start))
测试结果:
start = ('她', '喜欢')
print(gen_dig(start))
返回一段《茶花女》风格的段落:
她喜欢的人,他是您儿子就会怨恨我,我的朋友,但是我知道他要求我尽快地回到了家里,您在远方,您知道是为了阿尔芒,亲切
地和我照旧在一起度过这一年的时间还要长。
“您又是多么心急地接受了她。”
“您最好还是去吃午饭好吗?”
“您对我说,“我想打开看看,但是我实在是受不了,他们一准会暗暗思忖,我花一百法郎的钻石而离开了她。
“您高兴去就去吧。”
“您最好还是永远也不知道呢!幸而他肉体上的疲劳。这样做可以抬高价钱。
“您把这把钥匙给公爵,并签上自己的虚荣心呵!你的虚荣心呵!你的披肩,罩上面纱,我的朋友,请您拿了我的朋友,面对这些过
去我的朋友,每天我总是非常卑劣的。”
“您为什么不早对我说,“我不愿意看见,试着用我的朋友,每天还要过这样的。”
“您爱得多①,扉页上是赠书人用钢笔写的两行秀丽的字迹:玛侬对玛格丽特原有的看法。这种女人而不轻蔑,尊严而不愿意白受她
的手,我的朋友,我们最好还是去吃夜宵吗?”
“您在喜剧歌剧院包厢里慢慢地都坐满了,我的朋友,有一般二层楼那么高,在您面前提到他的决定告诉您,而且即使它还存在着
一些胡话,这些螺钉受了挫伤以后,我的朋友,有几天,甚至反抗我父亲没有来,而且他会分担我的朋友,我病了两个星期我在担
忧未来。
《鲁滨逊漂流记》风格的文本:
我把他能到我这边只打死了山羊,我就把他杀了,我就把使用帆和舵的方法支取另一半。那样我就把羊赶进去;另一条路。不仅如
此,我就把两具尸体埋好了。 我现在有那么多货物了,我就把死羊的皮做成的,他的船,但我如果不去,那我可要伤透心了。
我有足够的种子完全毁了。
我在岛上留下的简单工具,并把面包放进去,再用我的狗现在已又老又昏聩了,我就把酒瓶掏出来,又装了两星期的功夫,因为我
深切地体会到,这完全是我的庄稼白白损失,在我的信以及我实施这一计划的第一步,我就把长艇划到我当初卸木排的样子。然后
,我就把夺船的计划。这两个情况又使我后来的那么可怕。除了一些破布碎片外,别害怕。而从远距离开枪,不是打不着狼,后面
的几个大声呼唤着,这种祈祷,他们就一定能把我的仆人决定和我们一样,待我公正无私。但是,如果我以桨代舵,使劲掌握航向
,向相反方向走,沿海岸往西跑。他们到这儿时我正在洞内,那我肯定用不着掘墓人了。
我和那个小佣人和我已经在萨累见到的情况。老人家告诉我,他的教诲赐给这些人上岸时,我就把情况看得一清二楚。等他俩走近
时,我就把长艇划到我当初担心的敌人走了几十米,即可到达大船。我们都骑着好马,同时把梯子抽上来放在坡坎上,有人烟的习
惯,把我的朋友把《圣经》,总是没有结果,那我可以连开七枪。我把穗子装进自制的大阳伞,样子可怜极了,我就把这道围墙打
好了。 我有很多的好事。后来,我就把抓到一只怀孕的母羊。 我的那五个,情形也一样。
我的别墅里,我就把那帮水手,是从另一条,飞快地在那儿总会遇到来往的商船。万一遇不到的话,也许我可以在船上能搬下来的
那些小器皿却做得方便利索。可见大自然不但使每个生灵都得到食物,但我对他说,我就把小船在离岸大约六海里多,方向偏北。
因此,我就把船放到水里去,也没有使我对他说,我就把它砍倒。砍树花了三天才到家。 我对他说,我就把两具尸体埋好了。
我的乡间茅舍和海边住所的帐篷,四周都是全副武装。原来他们所有的东西。至于准确的日期,一直到十月中旬,几乎能回答我提
出的任何生物都杀死。我把这些泛滥成灾的猫视为害虫野兽,真是形象极了。这艘小船比我害怕他们反攻的担心也就干,都从船上
扔下去。在我的臣民拥有绝对的支配权力。于是,我就把他们抓住了。
我在巴西,完全合乎我的胡子仍留着,我们可以连续开六排枪,每次都会有什么上帝,保佑我,我就把魔鬼踩在我们后边,还有几
只玻璃瓶,有三个人来找我,我就把庄稼地围起来了。
我问他:在英国有人碰到我。当我见他肩上背着个野兔似动物,都会使我成了很好的时候,就像把一只罐子拿在手里,对我说,我
就把庄稼地围起来了。
我看到样样东西都可以想象的要近得多了,我就把一部分肉放到里面煮起来,做成了一盏灯,虽然天赋的观念,他也可以想象,做
做的事。白马_书院
我现在有那么多货物了,我就把情况看得很远很远的地方。但我起初忘了带下来的水果运回家。顺便说一句,这只箱子是属于西班
牙领地的主人派船追了上来。
我就把你送到巴西,他也打死了六十多只狼。这对于我这种灾难而不得不坐等其降临,更是恐怖万分。他说,我就把木排一边固定
在一片山影下熟睡呢!佐立笑着说,我就把情况看得一清二楚,并把书和几本别的书籍。所以,我就把我的厨房里。他们从船上打
下来,一副兴高采烈的样子。然后,我就把它拨了一下柱子上的第三年生活。唉,我就把我的关怀,并且摇动旗帜发出信号,叫他
。
我又继续保留了一条长短及膝的麻纱做了小木桩都长大了,我就把他杀了吃掉。几天之后,我就把它们杀掉,因为我反正要离开本
岛了。 我对他说,我就把它驯服,但我仅仅欣喜一阵子而已,高兴得无法形容;及至清醒过来,只是一种便鞋而已。
3-gram的改动:
from pathlib import Path
from jieba import cut
import numpy as np
import pandas as pd
def gen_word(start):
next_word = gram.index[gram[start].argmax()]
next_word_ = np.random.choice(gram[start][gram[start] > gram[start].mean()].index)
return next_word if np.random.sample() >epclon else next_word_
def gen_dia(start):
s = list()
s.extend(start)
while 1:
next_word = gen_word(start)
s.append(next_word)
start = start[1],start[2],next_word
if len(s) >5000 and next_word == "。":break
return ''.join(s)
epclon = 0.17
text_ = list(cut(Path("./茶花女.txt").read_text(encoding='utf-8')))
text_ += list(cut(Path("./鲁滨逊漂流记.txt").read_text()))
gram_1 = list(set(text_))
# gram_2 = list(set(list(zip(text_,text_[1:]))))
gram_3 = list(set(list(zip(text_,text_[1:],text_[2:]))))
gram = pd.DataFrame(np.zeros((len(gram_1),len(gram_3))),index=gram_1,columns=gram_3).astype(np.int16)
for i in range(len(text_)-4):
gram.loc[text_[i+3]][tuple(text_[i:i+3])] += 1
print(f"{gram.shape}gram create success!\n")
start = '房间','里','的'
print(gen_dia(start))
会生成更逼真的文本:
房间里的陈设即使一个生忧郁病的人看了也叫人恶心。但使我身体虚弱不堪。此后好长一段时间,因为我不愿意你因为跟了我而感到难过,我害怕由此而证实玛格丽特不值得我对她说,“您看,”普律当丝说,“您看玛格丽特怎么样?”我问他,为什么要他去摸摸他们的底,然后回来向我汇报,看看派他们一起去。”
“您知道,先生,我说,在山下大森林里,碰到狼是常事,尤其是我发现那个野人跑得比追他的只有三个人,伤了八人,只得投降。我们全部被俘,被押送到萨累,那是我准备冒险的日期。
我在这种情况下,即使我无法救助他们,他们也一定会把我家里搞翻天的!”
“您知道,做忏悔的时候是不能有什么良心的,否则就要被嘲骂,就要被诋毁。
十二点的时候,我问他这是怎么回事。说实在话,我也不知道是怎么回事,不论在旅馆里,还是在对人说话?你是在埋怨我,玛格丽特·戈蒂埃的女人同居,这是真的吗?”
“您知道,让大家预先看看这些织物和家具,这样可以招徕顾客。”
纳尼娜已预先把门打开。
“美极了。”
“两个月以内。”
“您知道,让大家预先看看这些织物和家具,这样可以招徕顾客。”
-----
①《玛侬·莱斯科》翻开在桌子上。
“您知道,让大家预先看看这些织物和家具,这样可以招徕顾客。”
...
“您知道,让大家预先看看这些织物和家具,这样可以招徕顾客。”
“卖掉了。
网友评论