Распознавание номера телефона из текста транскрибации
Делюсь кейсом по распознаванию номера телефона из текста транскрибации. Люди в диалогах диктуют номер по-разному: кто-то называет каждую цифру по отдельности, кто-то диктует трехзначными цифрами. Составим алгоритм, который поможет правильно составить телефонный номер.
Для начала сделаем функции по определению количества десятков и сотен в числе.
Возвращает количество десятков т.е. из чисел 56 и 158 вернет 5
Возвращает количество сотен
Чуть-чуть о логике: если друг за другом идут оба числа одного и того же порядка или впереди идет меньшего порядка, например, {7, 9} или {7, 90}, то должна происходить просто склейка 79 или 790 соответственно.
Обратим внимание на последовательность {900, 50, 2}: при наборе, где число 3-его, 2-ого и 1-ого порядков необходимо учитывать, что нужно и склеивать, и складывать числа так, что возможны комбинации 952, 900-52, 900-50-2.
Переходим к алгоритму, с пояснениями:
Создаем два списка:
- один числовой и заносим туда сразу все числа из номера телефона;
- один строковый, туда сразу заносим первое число.
Так как нулевой элемент мы уже записали, то запускаем цикл, который пойдет со следующего элемента списка и пишем условия, как уже обсуждалось ранее, т.е. что числа одного порядка или следующее число больше. Если условие выполняется, то все элементы строкового списка перезаписываются с дописанным числом-просто склейка строк, если нет, то тоже самое, но плюс еще и надо к каждому ЧИСЛУ из строкового списка прибавить число ИЗ числового списка.
Получится следующий набор возможных номеров:
Дальше убираем лишние элементы списка, где длина строки не равна 10 символам. Реализуем это в C#: в usingах пишем using System.Linq; а в конце следующее условие:
Результатом отработки получился список из 4 возможных номеров:
Итак, мы получили список возможных номеров телефонов из текста транскрибации.
Такой алгоритм применим, например, и для составления инн или чего-либо похожего из списка чисел при задании правил по длине.