将文本翻译成中文:
测量文档相似性的复杂度从图像中比从文本中测量文档相似性高出两个原因。
- 图像可能在亮度、文本上下文、图表或符号方面具有相似性。
- 与其文本信息相比,通常更难从包含的图像中找到文档的表示形式。
解决方案
我的解决方案是使用机器学习找到文档的表示形式,并使用这种表示形式对文档进行分类。我在这里提供了我提出的解决方案的Keras实现。
网络类型
我建议使用卷积层进行特征提取,然后使用循环层进行序列分类。我选择Keras是因为我熟悉它,并且它具有简单的API来定义由卷积层和循环层组合的网络。但是,代码可以轻松更改为其他库,例如Pytorch,Tensorflow等。
图像预处理
有许多方法可以为神经网络预处理文档的图像。我做出以下假设。
中译英:
将图像垂直拆分,使行作为序列输入(如果拆分线可以在空行上进行,则更有效)。我将使用Numpy为单个文档展示此操作。在以下实现中,我假设单个文档的图像形状为(100,100,3)。
首先,让我们定义image_shape为文档图像的形状
import numpy as np
image_shape = (100, 100, 3)
split_size = 25
doc_images = []
doc_image = np.zeros(image_shape)
splitted_images = np.split(doc_image,[split_size], axis=0)
doc_images.extend(splitted_images)
doc_images = np.array(doc_images)
网络实现
Keras有ConvLSTM2D层来处理序列图像。网络的输入是由分割文档图像产生的图像序列列表。
from keras.models import Sequential
from keras.layers import ConvLSTM2D, Dense, Flatten
num_of_classes = 10
model = Sequential()
model.add(ConvLSTM2D(32,(3, 3),input_shape=(None, split_size, image_shape[1],image_shape[2]),
padding='same',
return_sequences=True))
model.add(ConvLSTM2D(32,(3, 3),padding='same',return_sequences=True))
model.add(ConvLSTM2D(32,(3, 3),padding='same',return_sequences=False))
model.add(Flatten())
model.add(Dense(1024, activation="relu"))
model.add(Dense(num_classes, activation="softmax"))
理想情况下,这个模型将会起作用,因为它可以从文档的图像中学习层次化的表示(字符、单词、句子、上下文、符号)。