Я могу думать о 2 подходах.
Сначала шаблон соответствует словам в предложении.Примерно так (псевдокод, хотя он похож на синтаксис синтаксического анализатора фрагментов NLTK):
<some_word>+ (<NN|NNS>) <have|has|had> (<NN|NNS>)
<NN|NNS> (<VB>|was <VB>) (<and|but> (<VB>|was <VB>))* <into|onto|by> (<NN|NNS>)
Эти 2 паттерна могут (примерно) перехватить 2 части вашего первого предложения.Это хороший выбор, если у вас не очень много предложений.Я считаю, что можно получить точность до 90% с помощью правильно подобранных шаблонов.Недостаток в том, что эту модель сложно расширять / модифицировать.
Другой подход заключается в определении зависимостей между словами в предложении, например, с помощью Stanford Dependency Parser .Помимо прочего, он позволяет добывать объект, субъект и предикат, что кажется очень похожим на то, что вы хотите: в вашем первом предложении «робот» является субъектом, «имел» - предикатом, а «сбой» - объектом.