全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
850 0
2020-12-18
在Tensorflow 2中具有LSTM的Elon Musk AI文本生成器
在过去的两年中,Elon Musk对未来的看法,有趣的个性以及他对技术的热情已经引起了互联网的轰动。到目前为止,每个人都认识他,无论是那个电动汽车人,还是那个制造喷火器的人。他主要在Twitter上活跃,分享所有内容,甚至包括模因!
AI文字产生器
他启发了IT行业的许多年轻人,我想做一个有趣的小项目,在那里我将创建一个AI,该AI将根据他以前的Twitter帖子生成文本。我想概括一下他的风格,看看我会得到什么样的怪异结果。
制备
我正在使用的数据是直接从埃隆·马斯克(Elon Musk)的推特(包括他的帖子和回复)中抓取的。您可以在此链接下载数据集。
导入库:
进口 tensorflow 为 TF
从 tensorflow.keras.preprocessing.sequence 进口pad_sequences
从 tensorflow.keras.layers 导入嵌入,LSTM,密
从 tensorflow.keras.preprocessing.text 进口标记者
从 tensorflow.keras.models 导入顺序
从 tensorflow.keras.optimizers 进口亚当
进口 numpy 为 NP
进口 大熊猫 为 PD
进口 重新
现在,我将创建一个函数,该函数将消除所有链接,#标签,标签以及所有会使模型混乱的东西,以便我们得到清晰的文本。
#导入数据
data_path ='C:/Users/Dejan/Downloads/elonmusk.csv'
数据= pd.read_csv(数据路径)
#清除文字的功能
def  clean_text(文本):
    '''使文本小写,删除方括号中的文本,删除链接,删除标点符号
    并删除包含数字的单词。'''
    文字= text.lower()
    #text = text.replace('\%','')
    文字= re.sub('\ [。*?\]','',文字)
    文字= re.sub('https?:// \ S + | www \。\ S +','',文字)
    文字= re.sub('<。*?> +','',文字)
    #text = re.sub('[[%s]'%re.escape(string.punctuation),'',text)
    文字= re.sub(' \ n ','',文字)
    文字= re.sub('\ w * \ d \ w *','',文字)
    text =“” .join(filter(lambda x:x [ 0 ]!=“ @”,text.split()))
    返回文本
#应用功能
data ['text'] = data ['text']。apply(lambda x:clean_text(x))
数据=数据['文本']
让我们定义一个标记器,并将其应用于文本。这就是我们将所有单词映射到其数字表示形式的方式。我们这样做是因为神经网络不能接受字符串。如果您是新手,劳伦斯·莫罗尼(Lawrence Moroney)在Youtube上有一系列精彩的影片,我建议您在下面查看:
tokenizer = Tokenizer()
tokenizer.fit_on_texts(数据)
total_words = LEN(tokenizer.word_index)+ 1张
打印(total_words)#5952 input_sequences = []
为线在数据:
token_list = tokenizer.texts_to_sequences([线路])[ 0 ]
为我在范围(1,LEN(token_list)):
n_gram_sequence = token_list [:i + 1 ]
input_sequences.append(n_gram_sequence)
现在我们必须定义max_length(就像卷积一样,所有数据都必须填充为固定长度),并且还需要将input_sequences转换为numpy数组。
max_sequence_length = MAX([长度(X)为X在input_sequences])
input_sequences = np.array(pad_sequences(input_sequences,maxlen = max_sequence_length,padding ='pre'))
我们将创建数据序列,在这里我们将使用除最后一个元素之外的所有元素作为我们的X,最后一个元素作为y。同样,我们的y是total_words的单引号表示,有时可能会包含大量数据(如果total_words为5952,则意味着每个y都具有形状(5952,))
#创建预测变量和标签
xs,标签= input_sequences [:,:- 1 ],input_sequences [:,- 1 ]
ys = tf.keras.utils.to_categorical(labels,num_classes = total_words)
模型
下面是我们模型的配置。
模型= Sequential()
model.add(嵌入(total_words,80,input_length = max_sequence_length- 1))
model.add(LSTM(100,return_sequences = True))
model.add(LSTM(50))
model.add(tf.keras.layers.Dropout(0.1))
model.add(密集(total_words / 20))
model.add(密集(total_words,激活='softmax'))
model.summary()模型:“ sequential_1”
_________________________________________________________________
图层(类型)输出形状参数   
================================================== ===============
embedding_1(嵌入)(无,56,80)             476160   
_________________________________________________________________
lstm_2(LSTM)(无,56,100)            72400     
_________________________________________________________________
lstm_3(LSTM)(无,50)                 30200     
_________________________________________________________________
dropout_1(Dropout)(None,50)                 0         
_________________________________________________________________
density_2(Dense)(None,297)                15147     
_________________________________________________________________
density_3(密集)(无,5952)               1773696   
================================================== ===============
总PARAMS:2,367,603个
可训练PARAMS:2,367,603
非可训练PARAMS:0
我已经尝试了几个优化器,并且发现Adam在此示例中工作得最好。让我们编译并运行模型:
model.compile(loss ='categorical_crossentropy',
              Optimizer ='adam',
              指标= ['准确性'])
历史= model.fit(xs,ys,历元= 200,详细= 1)
#输出
历元196 / 200
1026 / 1026 [==============================] - 12小号12毫秒/步-损失:0.7377 -精度:0.8031
历元197 / 200
1026 / 1026 [==============================] - 12小号12毫秒/步骤-损失:0.7363 -精度:0.8025
历元198 / 200
1026 / 1026 [==============================] - 12个小号12毫秒/步-丢失:0.7236-精度:0.8073
历元199 / 200
1026 / 1026 [==============================] - 19小号18毫秒/步骤-损失:0.7147 -精度:0.8083
历元200 / 200
1026 / 1026 [==============================] - 12个小号12毫秒/步-丢失:0.7177-准确性:0.8070
让我们创建一个“ for循环”,它会基于seed_text和我们要定义的单词数生成新文本。这部分代码看起来有些吓人,但是一旦仔细阅读每一行,您就会发现我们之前已经做过类似的事情。
为_在范围(next_words):
    token_list = tokenizer.texts_to_sequences([seed_text])[ 0 ]
    token_list = pad_sequences([token_list],maxlen = max_sequence_length- 1,padding ='pre')
    预测= np.argmax(model.predict(token_list),轴= -1)
    output_word =“”
    对于单词,在tokenizer.word_index.items()中创建索引:
        如果index ==预测:
            output_word =单词
            打破
    seed_text + =“” + output_word
现在是时候使用我们的模型了。hoo!
seed_text =“空间很大”
next_words = 20
空间是猫的大融合, Spacex带来了许多文明,这使我们几个月来的龙变得紧张起来
seed_text =“我想着花”
next_words = 30
我想到的花朵在将来会受到限制,因为您可以用油轮将其强行推向低地球轨道,这可能比我们可以得到的液态温度快
seed_text =“我想殖民木星”
next_words = 40
我想对木星进行殖民化,只是为了使近期前景为零而已,或者我们自己也无法准确预测在短期的细粒度层面上,与我们人类一起在房屋中遇到的问题
概要
空间是猫的大杂物!?谁知道呢!如您所见,模型提供的输出很愚蠢,并且没有太大意义。与所有深度学习模型一样,为了产生更好的结果,可以对很多事情进行调整。我留给你。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群