Как обращаться с гомофонами в распознавании речи? - PullRequest
4 голосов
/ 11 мая 2019

Для тех, кто не знает, что такое гомофон , я привожу следующие примеры:

  • наши & являются
  • привет и высоко
  • до & тоже & два

При использовании Speech API , включенного в iOS, я сталкиваюсь с ситуациями, когда пользователь может произнести одно из этих слов, но он не всегда возвращает желаемое слово.

Я заглянул в свойство [alternativeSubstrings] ( link ), пытаясь понять, поможет ли это, но при тестировании вышеупомянутых слов оно всегда возвращается пустым.

Я также заглянул в Natural Language API , но не смог найти там ничего полезного.

Я понимаю, что когда пользователь добавляет больше слов, Speech API может начать выводить контекст и корректировать их, но мой вариант использования не будет хорошо работать с этим, поскольку ему часто требуется максимум одно или два слова, ограничивая Эффективность контекста.

Пример контекстной обработки:

Используя слова выше, я получаю следующие результаты:

  • есть
  • привет
  • до

Однако, если я соберу следующее предложение, вы увидите, что все они ошибочны:

Я слишком высоко для нашей лестницы

В идеале, я бы либо получил список обратно, содержащий [are, our], [to, too, two], [hi, high] для каждого сегмента транскрипции, либо имел бы способ сравнить строку с функцией, которая поддерживает гомофоны.

Примером этого будет:

if myDetectedWord == "to" then { ... }

Где myDetectedWord может быть [to, too, two], и эта функция будет возвращать true для каждого из них.

1 Ответ

2 голосов
/ 11 мая 2019

Это распространенная дилемма НЛП, и я не очень уверен, какой может быть ваш желаемый результат в этом приложении. Тем не менее, вы можете обойти эту проблему в процессе проектирования / архитектуры, если это возможно и возможно. В противном случае эта проблема превращается в вызов.


Сказано, что, если вы действительно хотите в нее войти, мне нравится ваша идея:

строка против функции

Это может быть более эффективным и дружественным к производительности.

Одним из способов решения этой проблемы было бы то, что вместо обработки бесконечных циклов и массивов используется обработка RegEx. Вы могли бы сначала создать прототипы циклов и массивов и посмотреть, как они работают, тогда вы можете использовать регулярные выражения для увеличения производительности.

Вы можете, например, определить фиксированные массивы в регулярных выражениях и быстро проверить свою строку (слово за словом, возможно, используя обратную ссылку), и вы можете добавить много границ в ваших выражениях для обработки строки, как ты хочешь.

enter image description here

Ваши фиксированные массивы также могут быть спроектированы на основе вероятностей появления определенных слов в определенной части строки. Например,

^I 

против

^eye
  • Вероятность того, что I будет первым словом, намного выше, чем у eye.
  • Вероятность I в любой части строки также выше, чем eye.

Возможно, вы захотите взвесить слова на основе этого.

Я бы сказал, что ключевым моментом будет то, что вы сузите желаемые результаты как можно более сфокусированно и увеличите точность [возможно, даже с 100 словами, если это возможно], если вы хотите иметь хорошее / работающее приложение.

Хороший проект, хотя, я надеюсь, вам понравится / понравится вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...