Группировка слов в предложения на основе границ

Пользуюсь системой распознавания текста от Google Cloud, результат мне прилетает в виде следующего

IReadOnlyList<EntityAnnotation> annotations

Каждая EntityAnnotation содержит в себе BoundingBox, это 4 цельночисленные цифры, обозначающие границы слова.

Вопрос - как это объединить в предложения?

Допустим, у меня на изображении для распознавания три несвязанных между собой предложения



Предложение первое,                                               Предложение второе, в одну строку
всякое - разное, в две строчки.






                                                                  Предложение 3,
                                                                  В целых
                                                                  Три строки

Ну и гугл пришлёт мне соответственно каждое слово и его координаты границ

"Предложение" (200:30) (200:70) (220:30) (220:70)

И так с каждый словом.

Вопрос - как объединить слова на основе их близкого расположения и в правильном порядке?

Я вижу это примерно так - берем первое слово, проверяем, есть ли у него сосед справа и объединяем их.

var rightBoundCoordFirstWord = annotations[0].bounds.Max(x=>x.x);

var leftBoundCoordSecondWord = annotations[1].bounds.Min(x=>x.x);

if(leftBoundCoord - rightBoundCoord < 100) //Если разница между границами меньше сотни пикселей, то скорее всего они части одного предложения
{
 var unitedAnnotations = new EntityAnnotation(){new Bound( annotations[0].leftBound, annotations[1].rightBound), text = annotations[0].text + " " + annotations[1].text;
}

Окей, мы объединили две аннотации в одну - теперь у них общие границы и общий текст. А как сделать это со всеми? Проверить правого соседа у первого, потом правого соседа у второго, потом, если соседа правого нет, глянуть у первого - нижнего соседа и это всё как то объединить...

Как это сделать? Может существуют готовые решения по группировке текста в предложения на основе их позиции или границ?


Ответы (0 шт):