Как получить такие слова, как *olog и *ology, чтобы получить / лемматизировать к одному корню?
Я играл с кучей стеммеров и лемматизаторов в NLTK, но никто не делает то, что я хочу. У меня есть несколько слов, таких как "радиолог", "радиология", "кардиолог", "кардиология" и т. Д., Где я бы хотел, чтобы * олог пошел в то же ведро, что и * ология. Я пробовал PorterStemmer, SnowballStemmer и WordNet Lemmatizer в Python, но ничто не отправляет их в одно и то же ведро. Кажется, что это должно быть достигнуто с помощью стемминга, и это не совсем необычные слова. Как бы вы достигли желаемого результата?
2 ответа
Вы смотрели на Морфессора? Это показывает кучу алгоритмов сегментирования морфа. Видимо, тот анализ, который вы ищете, возможен с помощью этого инструмента. Вот ссылка [1]: http://asr.aalto.fi/morfessordemo/
Что-то вроде этого?
>>> s = 'cardiology'
>>> s = s[:-5] if s.endswith('ology') else s
>>> s = s[:-7] if s.endswith('ologist') else s
>>> s
'cardi'
>>> s = 'cardiologist'
>>> s = s[:-5] if s.endswith('ology') else s
>>> s = s[:-7] if s.endswith('ologist') else s
>>> s
'cardi'
Процесс стемминга / лемматизации предполагает удаление только флективных суффиксов (т.е. удаление -s
суффикс от слова radiologists
), но вы также хотите удалить деривационные суффиксы.
Попробуйте Lingua Robot. Он способен разбивать слова на морфемы. Например, словоsimplifications
сегментируется в базовое слово simple
(Я предполагаю, что это то, что вы хотите получить) и деривационные суффиксы (-ify
, -ation
а также -s
). Ваш случай не так прост, как по APIradiologist
состоит только из аффиксов (radio-
+ -logy
+ -ist
). Каким-то образом вам нужно будет понять, какой аффикс оставить в таких случаях. Я тоже не уверен, хотите ли вы оставлять префиксы или нет (preprocess
â † ' process
). Кроме того, вам нужно будет учитывать составные слова, так как они содержат несколько корней.