Похоже, у вас есть красиво отформатированный ввод, поэтому получить надежные результаты будет довольно легко. Может быть сложнее, если некоторые ключи или значения длинные и занимают несколько строк.
Способ подойти к этому:
- Возьмите вашу коллекцию сущностей и разбейте их на строки
- Для каждой строки отсортируйте их по позиции x
- Определите, какие объекты являются частью ключа, а какие - частью значения
Разделение их на ряды, вероятно, будет самой сложной частью.
Я бы предложил подойти к нему следующим образом:
- Возьмите вашу первую сущность, вычислите среднюю точку между ее верхним и нижним значениями y и ее общей высотой, поместите ее в первую группу строк
- Возьмите вторую сущность и вычислите ее среднюю точку, затем для каждой группы строк проверьте, находится ли средняя точка второй сущности внутри нее. (Я бы предложил сделать группу строк классом, который содержит сущности в массиве внутри нее и может сообщать общее верхнее и нижнее значение y для этой строки на основе уже существующих в ней сущностей. Вы можете найти средние точки усреднения сущностей и высота лучше всего подходит для этого, или, возможно, просто взять максимум и мин, или, возможно, какой-то более сложный подход)
- Если ваша вторая сущность выпадает наружу, она помещается в новую группу строк
- Повторите это со всеми последующими объектами, пока все они не будут помещены в разные группы строк
- Вы могли бы рассмотреть возможность сделать второй проход, чтобы проверить, требуют ли слияния некоторые группы строк
Вещи, которые вам, возможно, придется остерегаться - знаки препинания, распознаваемые как их собственная сущность и падающие по краям двух групп строк.
Сортировка по x должна быть тривиальной, а затем определение того, какие объекты в строке являются ключевыми, а какие значения, сводится к методу проб и ошибок, чтобы найти подходящий порог на разрыв между концом одного объекта и начало следующего.