Распознавание зубной формулы из аудио. Сделано в виде бота. Он принимает войс и аудио файл. Присылает в ответ зубную формулу. Звучит это примерно как "один семь кариес один шесть кариес". Но все говорят по-разному.
- Иногда между зубами говорят "зуб"
- Иногда говорят не "один семь", а "семнадцать", а иногда "тридцать семь"
- Иногда вместо "семнадцать пломба" говорят "семнадцать лечен"
- Иногда говорят "имплант", иногда "искусственный"
- Диагноз может состоять из одного слова или из нескольких, например "зубные отложения", "вторичный кариес" или "подвижность второго типа"
- Диагноз "пломба кариес" - это "П/С", при этом есть отдельные дефекты "пломба" и "кариес"
- Может быть несколько дефектов на один зуб, например "пломба скол"
- Есть детская зубная формула, там зубы начинаются с пятьдесят, есть взрослая, с единицы.
Основной файл с решением -- это ml.py и const.py, где лежат словари. На вход подаётся распознанное аудио через yandex speech kit (файл speech.py).
- Заменяем все ошибки распознавания (словарь REPLACE_MISTAKES), такие как карис => кариес, а так же заменяем синонимы лечен => пломба
- Мы хотим работать с терминами как со словами, поэтому все устойчивые понятия которые звучат в нескольких словах преобразуем в одно (словарь REPLACE_WORDS). Например "дефект пломба" => "дефектпломбы". Замечу что на прошлом этапе мы заменили ошибки и если изначально звучало "дефекты пломбы", то это после двух операций преобразовалось в "дефект пломба", а потом в "дефектпломбы".
- Распознаём названия зубов. Тут есть 3 варианта: "семнадцать" и "один семь", "сорок три". Когда в одном слове произносят сразу полное название зуба, это перечислено в словаре DOUBLE_NUMBER. Если произносят два слова, то они закидрованы в SINGLE_NUMBER, "сорок" имеет такое же значение маппинга как и "четыре".
- Названия зубов мы валидируем. Возможные значения перечислены в VALID_NUMBERS, мы ведь знаем какие номера зубов бывают у детей и взрослых.
- Когда обнаруживаем валидное значение зуба, то добавляем в строку перед ним знак |
- Сплитим по | и обрабатываем каждый зуб отдельно, составляем словарь из названия зуба и распознанных дефектов, которые снова преобразуем по VALUE_MAPPING и объединяем по запятой
- Чтобы вывести формулу, мы понимаем это детская или взрослая, проходимся по списку с зубами и если находим в словаре нужный зуб, то выводим дефект
Тесты в файле test.py