Это задача обработки естественного языка, т.е. это вопрос, тесно связанный с естественным языком, с которым мы работаем. Вопрос выходит за рамки простых алгоритмических вопросов, потому что алгоритм должен сначала «понимать» или «представлять» то, как перегиб работает на языке, который вы используете.
Эти решения работают со статистическими моделями, что означает, что мы не получим 100% точности. Это просто потому, что естественные языки слишком сложны, чтобы решить это детерминированным алгоритмом и с 100% точностью.
Для английского языка есть пакет Python LemmInflect , который утверждает, что имеет 96,1% точности английских глаголов.
Используя это, мы можем сделать что-то вроде:
import lemminflect
def find_lemmas(word_set: set, test_string: str) -> list:
word_set = set(word_set)
found_lemmas = []
for word in test_string.split(" "):
lemma_dict = lemminflect.getAllLemmas(word)
if lemma_dict:
# values of getAllLemmas are tuples, we need a flat set
lemmas = {y for x in lemma_dict.values() for y in x}
found_lemma = list(lemmas & word_set)
if found_lemma:
found_lemmas.append(found_lemma[0])
return found_lemmas
, что даст нам:
>>> word_set = {"eat", "car", "house", "pick up", "child"}
>>> test_string = """After he ate the cake he left the
house and went to his car. Then he wondered whether picking up the
children now would really be the best idea."""
>>> find_lemmas(word_set=word_set, test_string=test_string)
['eat', 'house', 'child']
Мы можем видеть, что "pick up"
не был признан. Это потому, что мы разбираем слово test_string слово за словом, что разрушает структуру любого составного слова. Таким образом, получение этих составных лемм потребовало бы гораздо более сложной логики.
Мы могли бы разделить элементы из word_set
на их компоненты и проверить наличие каждого компонента отдельно. Тогда нам по-прежнему нужна логика, которая могла бы определить, является ли возникновение перекошенных форм двух компонентов составного слова в word_set
in на самом деле возникновением перекошенной формы составного слова, т.е. нам нужноисключить сценарии, подобные следующему:
"She bent down to pick a penny. Then she looked up and realised she had lost a pound.
"
В этом случае мы найдем форму "pick"
, а также форму "up"
, но это не будетформа "pick up"
.