我是第一次发文章。
我通常使用 PHP 进行开发。
突然,我在高中的时候就想成为一名作家。
那个时候,我对轻小说很上瘾,所以以后我要做一个轻小说作者!我心中藏着一个梦想。
你为什么不呢?
当我把我写的东西给一个朋友看时,他撕了纸说:“这绝对行不通。”
我纯洁的心受损,我放弃了写作。
决心
我又重拾了对小说的热情,现在可以写出和当年不一样的大作了!这将是Uhauha!
使用你自己的力量以外的任何东西。 . .
让我马上做
用什么
自然语言处理中用到了各种各样的东西,比如RNN和GRU,但这次我将使用LSTM来创建它。
原因是当我看到字母LSTM时,我想到了qiita的LGTM。是的,直观。
这次的自动造句流程是怎样的呢? “这就是目的,所以这很好(Bakabon风格)
准备
首先,作为准备,决定一本小说作为参考。
这一次,它的前提是移动句子的自动生成过程,看看会发生什么。
所以,在青空文库的帮助下,太宰治的“运行 Melos”用于学习。
在那之后,如果你有动力和一台 PC (Python),你就可以开始了。动机需要最多的时间来准备,不,什么都没有。
格式化文本
嗯,首先,来自青空文库运行 MelosDL,把它放在与Python文件相同的文件夹中并读取它。
import re
# 走れメロスを読み込む
with open("hashire_merosu.txt", mode="r", encoding="shift-jis") as f:
merosu_text = f.read()
Aozora Bunko 的 txt 文件中有不必要的东西(红宝石、解释等),因此请删除它们。
# 整形するための関数
def aozora_shaping(raw_text):
# タイトル・著者名を削除
text = re.sub(r'A.*?
.*?
', '', raw_text)
# 空白・改行を削除
text = re.sub(r' | |
|
', '', text)
# ルビ説明文を削除
text = re.sub(r'-{55}.*?-{55}', '', text)
# 末尾の文を削除
text = re.sub(r'底本:.*Z', '', text)
# かっこ等の記号を削除
text = re.sub(r'《.*?》|||[.*?]|〔|〕|#|※', '', text)
return text
text = aozora_shaping(merosu_text)
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ ~長いので省略
似乎删除了不必要的部分。
矢量化
接下来,我们需要对字符进行矢量化,所以让我们这样做。
描述设置
n_rnn = 10
batch_size = 128
epochs = 30
neuron = 256
然后将前一句中的每个字符存储在一个列表中。
# setで重複をなくし、各文字をリストに保存する
chars = sorted(list(set(text)))
['―', '、', '。', '々', '「', '」', 'あ', 'い', 'う', 'え', 'お', 'か' ~長いので省略
看起来它已正确列出。
接下来,我们将使用创建的字符列表创建一个字典。
char_index = {}
index_char = {}
# 文字がキー、インデックスが値の辞書
for i, char in enumerate(chars):
char_index[char] = i
# 文字が値、インデックスがキーの辞書
for i, char in enumerate(chars):
index_char[i] = char
# char_index
{'―': 0, '、': 1, '。': 2, '々': 3, '「': 4, '」': 5, 'あ': 6 ~省略
# index_char
{0: '―', 1: '、', 2: '。', 3: '々', 4: '「', 5: '」', 6: 'あ ~省略
接下来,我们将描述时间序列数据以及从中提取要预测的字符的过程。
for i in range(0, len(text) - n_rnn):
time_chars.append(text[i: i+ n_rnn])
next_chars.append(text[i+ n_rnn])
# time_chars
['メロスは激怒した。必', 'ロスは激怒した。必ず', 'スは激怒した。必ず、', 'は激怒した。必ず、か' ~省略
# next_chars
['ず', '、', 'か', 'の', '邪', '智', '暴', '虐', 'の', '王', 'を', '除', 'か', 'な', 'け', 'れ', 'ば', 'な', 'ら', 'ぬ' ~省略
嗯,好像搞定了。
接下来,我们以 one-hot 表示形式表示输入和正确答案。
import numpy as np
x = np.zeros((len(time_chars), n_rnn, len(chars)), dtype=np.bool_)
t = np.zeros((len(time_chars), len(chars)), dtype=np.bool_)
for i, t_cs in enumerate(time_chars):
t[i, char_index[next_chars[i]]] = 1 # 正解
for j, char in enumerate(t_cs):
x[i, j, char_index[char]] = 1 # 入力
print(x.shape)
print(t.shape)
(9796, 10, 815) # サンプル数、時系列、文字の数
(9796, 815) # サンプル数、文字の数
LSTM 模型
接下来,我们将最终构建 LSTM 模型。
由于我们使用的是 Keras,所以我们先安装 Keras。
安装 keras
File "~/syosetu.py", line 3, in <module>
from keras.models import Sequential
当我试图在不安装它的情况下(显然)这样做时我很生气,所以我安装了 keras。
看来还是推荐安装tensorflow,所以先安装tensorflow
pip3 install --upgrade tensorflow
然后安装keras
pip3 install keras
尝试导入
from keras.models import Sequential
from keras.layers import Dense, LSTM
from keras.callbacks import LambdaCallback
我觉得跑的时候不生气就可以了
让我们建立模型
model_lstm = Sequential()
# コンパイル
model_lstm.add(LSTM(neuron, input_shape=(n_rnn, len(chars))))
model_lstm.add(Dense(len(chars), activation="softmax"))
model_lstm.compile(loss="categorical_crossentropy", optimizer="adam")
# サマリーを出力
print(model_lstm.summary())
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, 256) 1097728
dense (Dense) (None, 815) 209455
=================================================================
Total params: 1,307,183
Trainable params: 1,307,183
Non-trainable params: 0
_________________________________________________________________
None
参数数量惊人(小学生印象)
写作
# エポック終了後に文字を出力する関数
def on_epoch_end(epoch, logs):
print("エポック後", epoch)
# 確率分布を調整する定数
beta = 5
prev_text = text[0:n_rnn]
created_text = prev_text
print("シード", created_text)
for i in range(800): # 800文字生成
# 入力をone-hot表現にする
x_pred = np.zeros((1, n_rnn, len(chars)))
for j, char in enumerate(prev_text):
x_pred[0, j, char_index[char]] = 1
# 予測を行い、次の文字を得る
y = model.predict(x_pred)
p_power = y[0] ** beta
next_index = np.random.choice(len(p_power), p=p_power/np.sum(p_power))
next_char = index_char[next_index]
created_text += next_char
# 最新の時系列が入る
prev_text = prev_text[1:] + next_char
print(created_text)
print()
# エポック終了時に実行
epock_end_callback = LambdaCallback(on_epoch_end=on_epoch_end)
# 学習させる
model = model_lstm
history_lstm = model_lstm.fit(x, t, batch_size=batch_size, epochs=epochs, callbacks=[epock_end_callback])
嗯,终于到了看手工的时候了。
我想知道我能不能做到! ! ! ! ! ! !
Epoch 1/30
76/77 [============================>.] - ETA: 0s - loss: 5.4609エポック後 0
シード メロスは激怒した。必
メロスは激怒した。必、、。の。いた。。のた。をに、、。。。。い。た。の。い。。た。。。。のの。た。。、の。、。。
い。。を、、の。のい。。。。にのいい。の。。の。い、い。。。。。。。の。。く、。た。。。。。。、、、、。のたいいだ。、
。のの。る。。。。。い。。。たた。る。。のい。。。、、た、いのて。。。。、。。、。、、。、。い。。い。、を。たのの。。
、た。。い。。をのい。。、のた。を、、、。。のらの。。。。、。を。。、。、の、い。。。いには。。。。を。。い。。。、。
。。にだは、。。。。、の、。はい。い、の。。。。、。し。。をたのて。。。く、、。のの、。。。。。。。。。。の。。のた、
、。。いい、。。、、。。をのの。。、のいた。、。、。をの。い。。。。る。い。い。。い。。ら。。。。。。。、い、。。は。。
。た。。。。い。。をを。。な。。た、。、。い。、い、。いっ。。をいい。のいのた。。、。のい。。。い。。。、、、。の、。
。を。。。をた。。。た。。。。。。。。。。。、、の、。、い。。。、。。いい。。。。。。。。。いい、。。、。。。を、。。、。い、
。。ない。。の、、。だ、。。ら。。い。、く、、とた。。。。。。。、、。、。たいの。。、の、た。た。、。い。の。。。、。。
をの。。の。。。。ス。を。。、を。、、い。。い、の。。の、。、の。。。、。。、の。の。の。。い。。、。、、。た。たい。
い。。、な。、。。の。、。。。、。。、のた。な、、。い。の。。、。。。、の。。、。、。、。。。。。の。。。ののてる。の
。。。。。。。。、、、、。の、。。。の。。、、、。の。。、の、い。。。、。の。の。、、。るた。。。、た。。。い。。。。う。。
、を。の。。た。の。の。。い、。を。の。。。。。、なのをい。、。のい。。。い。。、い。、にを。、。。。た。。とをた。
の、た。を、。。た。。。の。、。、。。を。。い。、いの。。。、、い。、、、。
我不知道你在说什么。
我对此无能为力。 . .
由于这次设置了 epoch 数为 30,我们来看第 30 个结果。
Epoch 30/30
77/77 [==============================] - ETA: 0s - loss: 1.3715エポック後 29
シード メロスは激怒した。必
メロスは激怒した。必呆、メロスの市にして来るとようにああ、ああなが狂うただ。あった。私は、どっとみたなから、何もなっていいのだ。
私は、ち遠の士とした。きってもるのである。メロスは、まって行るとだろう。私は、ちちどもなわぬ。全くして、わなの心であるのだ。
私は、いまえななった。私の命は、わずなわれにもうから、何も無いのおまえになった。メロスは、悠々とと仕度を聞いた。
たの、メロスの人を殺した。「あるのだ。」としているのだ。」メロスは、ましてはりをたんだ。「あったち、あのだちだから、わしても問をされた。
「あるのだ。」「どうない。」「メロスは、まだ。そう、ども、いいまの気がりを見っていた。。
「それては、まった。「あのだ。」「どう。」メロスは、おまえに行くないない。」「どう、その男をして下さいた。」「その、いのだのだ。」「それない。」
「どう。メロスは、おまえのと婿を事いた。「れて、メロスは走った。「あるたのだ。」「どう、その心を殺して下るのだ。」
「王の、人の心を殺した。私はなのでものだ。ありない、私は、わずの市に走ったから、私は、ちまったのだ。」
「どう、私は、まのだが、それからぬば、わからは無いの顔おまえ、それなら、間いいい。おまえには、その男いのだのだ。
私は、信実のだけた。私の疲のたち、ちととっとして、きのとでであるのだ。私は、信じてくれた。私は、私の信実裏た。」
とはは、こ込ですまでの気ををついていり、ころでった。「ああ、あのた。あのだが、どうでもわしのいを、きりって、それであるのだ。
私は、信じてくれた。」として、私の心を殺してやる事だ。」「メロ、は、おまえであるた。いの人は、ちちととわしくして下さいた。
メロスは、まだよう、私を殺される。メロスは、まがられて、村のたのであるのだ。陽は、ものも無くであった。
メロスは、それかられば、このでいますのそのだって、ふのしてくれなように深いし、私は、ちんんだんだっな
看起来比第一部好多了!
但是,它不能称为小说。 . .
结论
试验次数和参考资料很少,距离成为小说还有很长的路要走。
我才刚刚开始攀登这个无尽遥远的男高坂!
〜完全的〜
是骗人的。不完整。
用 GRU 试试
我想为 GRU 做同样的事情。
看起来你可以通过稍微改变描述来做到这一点。
# GRU、Denseをインポートする
from keras.layers import Dense GRU
model_gru = Sequential()
model_gru.add(GRU(n_mid, input_shape=(n_rnn, len(chars))))
model_gru.add(Dense(len(chars), activation="softmax"))
model_gru.compile(loss="categorical_crossentropy", optimizer="adam")
model = model_gru
history_lstm = model_gru.fit(x, t, batch_size=batch_size, epochs=epochs, callbacks=[epock_end_callback])
使用此描述执行。
Epoch 1/30
77/77 [==============================] - ETA: 0s - loss: 5.4536エポック後 0
シード メロスは激怒した。必
メロスは激怒した。必の、、、いはい、、、、、の、、、い、の、い、、のス、、いの、、にをのはの、、、の、。、、、、。の、、、。
の、。の、、、、、、、、の、いたに、の、、の、、の、、い、ののの、、。、、、、、、。、、、の、、、いい、の、、れ、の、の、、、
の、、にのに。、に、にに、、は、にの、とは、た、のに、ののい。、、のに、、、、の、に、、のた、の、のにのにの、に、、
い、、、い、う。の、、、。、た、の、にの、の、、に、、、なのにのたい、に、、、い、。、い、、、のい、の、。。いに、、にの、
、に、に、、、、、、。、ののい、、のの、。い、にのののの、に、の、、、い、、にの、のになの、、、、、、、、のの、、、、のな、
、に、のに、、いいの。、にに、、、、、、な。、、、、の、、の、の、、に、、、いの、のの、、の、、、、、、に、の、は、の、、い、
いに、、、のの、、の、れ、の、の、、、、の、、は、の、、、、、、、の、、に、い、のに、、の、、、の、、い。、、、。の、、、、、
、、い、の、、、、、いの。、、、の、、。、の、、にの、いに、、、、、、い。い、のののロ、て、、。、、にの、に、。。、たに、、、、
。のる、、、、ののは、、の、、、、に。の、いののの、に、、、の、、っ、いの。、、、の、、、い、、の。に、い、、、、、、、に、、
にに、のい、に。の、、、、、は、、の、。た、、、に、、の、、、、、、、、、ての、、、の、、、。、、の。の、、、、、いいの、、のの。
の、、い。の、にの、、のに、、れ、、に、、は、、の、い、、、い。に、のた、に、い、、いのに、の、のい。、、い、、。のた、に、
、た、。の、、、、、、た、いの、に、たの、にの、い、、。る、。いに、、、に、、の、い、、、、ののの、のに、い、、のた、のの、
、の、の、、ののの、のに、にの、、、、の、、、に、にの、、のた、ののい、にの、、いの、、、、の、、、いの、、、、の、、、。、
我还是不明白你在说什么。
接下来,让我们以同样的方式来看第 30 次。
Epoch 30/30
77/77 [==============================] - ETA: 0s - loss: 0.4364エポック後 29
シード メロスは激怒した。必
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。
メロスは、それから花婿の肩をたたいて、「仕度の無いのはお互さまさ。私の家にも、宝といっては、妹と羊だけだ。
他には、何も無い。全部あげよう。もう既に、メロスの弟になったことを誇ってくれ。」花婿は揉み手して、てれた。
それから、皇后さまを。それから、賢臣のアレキス様を。」「それは、そのマントを打るせて。そうして、メロスの弟になっところになっていない。
」メロスは、ます、三日目の日暮まで、ここに帰って来なかったら、あの友人を絞め殺して下さい。たの、それでも私の無い。
おまえの兄は、何もといただかりに、なんの市でしっとうろうった。「市に用事、おまえた。私の命から、皇后さまを。
それから、賢臣のアレキス様を。」「おどろいた。国王は乱心か。」「いいえ、乱心ではございませぬ。人を、信ずる事が出来ぬ、というのです。
」メロスは腕に唸りをつけてセリヌンティウスは、縄打たれた。メロスは、すぐに出発した。初夏、満天の星である。
メロスは、メロスの弟になったことを誇ってくれ。」花婿は揉み手して、てれた。その心には、神も哀れと思ったか、ついに憐愍を垂れてくれた。
押し流されつつも、見事、対岸の樹木の幹に、すがりつく事が出来たのである。ありがたい。
メロスは、それから花婿の肩をたたいて、「仕度の無いのはお互さまさ。私の家にも、宝といっては、妹と羊だけだ。
他には、何も無い。全部あげよう。もう一つ、メロスの弟になったことを誇ってくれ。」花婿は揉み手して、てれた。
その心には、ここんないなんでもった。メロスの頭は、からっぽだか。夜であるのだ。私は信頼されている。
私は、信頼に報いなければならぬ。いまはた王だ。私は王は、一気にかった。セリヌンティウスは、縄打たれた。
メロスは、それから花婿の肩をたたいて、「仕度の無いのはお互さまさ。私の家にも、宝といって
将它与 LSTM 进行比较很有趣。这一个看起来更好作为一个句子。
如果你尝试增加参考数据或者增加epochs的数量,我认为自动生成会更准确一点。
这一次,我的目标是真正接触到句子生成,就是这样!
老实说,我仍然不知道里面发生了什么细节。 . .未来的任务。
从现在开始
如果 AI 可以为 AI 创作的东西添加歌词,那将会很有趣。
参考网站
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308633020.html