Единственно-верный вариант здесь: построение "дерева" связей между частями речи (внутри одного предложения), собранное из множества разных текстов с помощью человека на конкретных эталонных примерах.
Т.е., алгоритму нужно чётко знать: где какая часть речи может находиться внутри предложения (с наибольшей долей вероятности) относительно других частей речи (расположенных вокруг, до, после или отсутствующих вовсе).
А задача такого плана решается исключительно только с помощью создания и обучения НС.Пример:
Подаём текст на анализ: "Сервер не включался из-за сломанного блока питания."
Отправляем на вход: "Почему не включался сервер?"
Получить должны: "Был сломан блок питания."
или
Отправляем на вход: "Блок питания был сломан?"
Получить должны: "Да."
Возможно, что автор имел ввиду разделить и заменить местоимения на цельно-выраженные сущности.
"Вот дом, который построил Джек":
1. "Дом" ("вот" - удаляем, т.к. это частица)
2. "Дом построил Джек" ("который" заменяем на управляющее существительное "Дом")
PS: По ссылкам от
Mikhail есть только простой шаблонный/словарный поиск с использованием правил и регулярных выражений - это не решение задачи в том виде, в котором возможно добиться правильной работы и корректного результата.