Я очень новичок в ML, и мне тяжело разобраться с TensorFlow и Keras. Я хочу создать LSTM на основе символов и обучить языковой модели, которая может использоваться для маркировки зашумленного текста, который был захвачен с помощью программного обеспечения OCR. Процесс OCR вставил и удалил случайные пробелы.
У меня есть список из 1000 типовых предложений. Для каждого предложения у меня есть исходный вывод необработанного распознавания текста и исправленная вручную версия предложения. Ручное исправление предложения включает в себя вставку пробелов между словами и удаление тех, которые находятся в середине слов. Это также включает размещение пробелов перед знаками препинания. Таким образом, я смогу токенизировать его просто используя some_string.split(" ")
.
Вот пример необработанного текстового предложения и того, как оно выглядит исправленным вручную.
Raw-OCR:
Itwasn'ta wonderf ulday, it rainedfora while, butatle ast
wegot to takea walkand get so me freshair.
Исправлено:
It was n't a wonderful day , it rained for a while , but at least
we got to take a walk and get some fresh air .
Я разделил предложения на 900 учебных предложений и 100 тестовых предложений.
train_text = raw_sents[:900]
train_labels = corrected_text[:900]
test_text = raw_sents[900:]
test_labels = corrected_text[900:]
Я объединил обучающие предложения в одну строку, как необработанную, так и исправленную.
train_text = "".join(train_text)
train_labels = "".join(train_labels)
test_text = "".join(test_text
test_labels = "".join(test_labels)
Это та часть, где у меня возникают проблемы с пониманием того, что я должен делать. То, что я хочу сделать, это вводить новый символ из train_text
в модель на каждом временном шаге, и для модели выводить, должен ли следующий символ быть пробелом или следующей буквой. Затем я хочу, чтобы модель проверила следующий символ в train_labels
, чтобы увидеть, был ли он верным, и обратное распространение. После нескольких эпох я хочу ввести test_text
в модель и измерить ее точность по отношению к `test_labels '.
В корне ли я неправильно понимаю, как работают LSTM?
Я читал посты в блоге и смотрел учебные пособия, в которых показаны создаваемые LSTM на уровне персонажа, но на этом этапе все они разбивают текст на последовательности равной длины, а затем обучают языковую модель прогнозированию предстоящего персонажа с использованием следующего символ в обучающем наборе в качестве метки, вместо использования отдельной строки метки.
chars = sorted(list(set(train_labels)))
no_chars = len(chars)
mapping = dict((c, i) for i, c in enumerate(chars))
sequences = list()
encoded_seq = [mapping[char] for char in train_labels]
sequences.append(encoded_seq)
sequences = np.array(train_labels)
X, y = sequences[:, : - 1], sequences[:, - 1]
sequences = [to_categorical(x, num_classes=no_chars) for x in X]
X = array(sequences)
y = to_categorical(y, num_classes=no_chars)
model = Sequential()
model.add(LSTM(75, input_shape=(X.shape[1], X.shape[2])))
model.add(Dense(no_chars, activation='softmax'))
print(model.summary())
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, y, epochs=1000, verbose=2)
Должен ли я отказаться от своей train_text
строки и просто обучить языковой модели, используя этот метод, вместо моего train_labels
?
Проблема, с которой я столкнулся при таком подходе, заключается в том, что длина последовательности, по-видимому, диктует, что вам нужно ввести в модель одинаковое количество символов, чтобы заставить ее работать. Итак, если я установлю длину последовательности на 10, а затем протестирую приведенный выше пример необработанного распознавания текста, он ничего не сделает для исправления первых десяти символов, Itwasn'ta
. Есть ли способ преодолеть это?
В идеале я мог бы использовать языковую модель внутри функции для исправления всех проблем с пробелами в любой строке, которую я передаю в функцию, но я не знаю, как добраться до этой точки.