Могу ли я обучить LSTM уровня персонажа токенизировать зашумленный текст, используя заранее подготовленные метки? - PullRequest
0 голосов
/ 25 апреля 2019

Я очень новичок в 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. Есть ли способ преодолеть это?

В идеале я мог бы использовать языковую модель внутри функции для исправления всех проблем с пробелами в любой строке, которую я передаю в функцию, но я не знаю, как добраться до этой точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...