проблемы в генерации глаголов в python

Я хочу найти основы глаголов. Я помещаю суффиксы, которые хочу удалить в переменной. проблема заключается в том, что он просто удаляет первый элемент в списке и не относится к остальным элементам и возвращает глагол без прерывания. Как мне изменить его, чтобы он мог прочитать все элементы в списке?

def stemming (verb): suffix=["ing", "ed", "es", "s"] for i in suffix: stem=verb.replace(i, "") return stem i+=1 >>> stemming ("wanting") 'want' >>> stemming ("wanted") 'wanted' 

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

 def stemming(verb): suffixes = ["ing", "ed", "es", "s"] for suffix in suffixes: if verb.endswith(suffix): return verb[:-len(suffix)] return verb 

Поэтому он фактически проверяет, заканчивается ли глагол в каждом суффиксе и не возвращается, если он не находит тот, который делает.

Потому что ты return слишком рано. В тот момент, когда Python встречает return внутри функции закрытия; он немедленно вернется к вызываемому ( функция, которая называется stemming ).

Измените свою функцию:

 def stemming (verb): suffixs = ["ing", "ed", "es", "s"] for suffix in suffixs: stem = verb.replace(suffix, "") return stem # XXX: Moving the return outside of the loop 

Вам также не нужно увеличивать здесь; это даже не целое число; вы повторяете список строк. Каждая итерация по suffixes ( я переименовал некоторые переменные, чтобы быть более читаемыми ), в свою очередь, будет строками, указанными в списке.


Если вы действительно хотели использовать вариант счетчика для индексирования suffixes :

 def stemming (verb): suffixs = ["ing", "ed", "es", "s"] i = 0 while i < len(suffixes): stem = verb.replace(suffixs[i], "") i += 1 return stem 

Однако ; это действительно не нужно, поскольку вы можете просто использовать обычную и более Pythonic-итерацию по списку: for suffix in suffixes:


Я также считаю, что ваша функция также должна быть:

Код:

 def stemming(verb): suffixs = ["ing", "ed", "es", "s"] for suffix in suffixs: verb = verb.replace(suffix, "") return verb 

Вывод:

 >>> stemming("singing") '' 

Думаю об этом! 🙂


Также как в стороне; вы действительно должны использовать nltk для создания в любом случае, если только вы не делаете это в образовательных целях.

Смотрите: nltk.stem

Пример:

 >>> from nltk.stem.lancaster import LancasterStemmer >>> st = LancasterStemmer() >>> st.stem("singing") 'sing' # NOT an empty string!!! >>> st.stem("wanting") 'want' >>> st.stem("wanted") 'want' 

Переместите возврат из цикла и удалите i += 1 . Здесь бесполезно:

 def stemming(verb): suffix=["ing", "ed", "es", "s"] for i in suffix: verb=verb.replace(i, "") return verb 

Вы помещаете оператор return внутри цикла, что создает неправильное поведение. Я думаю, вы имели в виду нечто подобное:

 def stemming (verb): suffix=["ing", "ed", "es", "s"] stem = verb for i in suffix: stem=stem.replace(i, "") return stem 

Я также удалил i ++, который на деле бесполезен. Другое дело, конечно, что вы должны работать всегда на одной и той же переменной, чтобы поймать все изменения (либо стебель, либо глагол – я использовал стержень для большей ясности, но вы также можете использовать глагол и избавиться от задания).

Как заметил один комментатор, ваш алгоритм создает какое-то странное поведение на некоторых глаголах.

Я бы предложил изменить его так:

 def stemming (verb): suffixes = ["ing", "ed", "es", "s"] stem = verb for suffix in suffixes: if stem.endswith(suffix): stem = stem[:-len(suffix)] break return stem 

При этом изменении следует удалить только один суффикс (из-за перерыва), а удаление будет происходить только в конце глагола.

return всегда будет заканчивать функцию и возвращаться туда, где вы ее вызывали. Используйте доход вместо return если вы хотите сгенерировать несколько значений.

В качестве дополнительной заметки удалите инкремент i потому что i не является целым числом в вашем коде.