Немецкий стеммер не удаляет женские суффиксы "-in" и "-innen"
На немецком языке каждая работа имеет женскую и мужскую версии. Женский происходит от мужского путем добавления суффикса "-in". В форме множественного числа это превращается в "-inen".
Пример:
| English | German
------+------------------+-----------------------
masc. | teacher doctor | Lehrer Arzt
fem. | teacher doctor | Lehrerin Ärztin
masc. | teachers doctors | Lehrer Ärzte
fem. | teachers doctors | Lehrerinnen Ärztinnen
В настоящее время я использую НЛТК nltk.stem.snowball.GermanStemmer
, Возвращает эти основы:
Lehrer -> lehr | Arzt -> arzt
Lehrerin -> lehrerin | Ärztin -> arztin
Lehrer -> lehr | Ärzte -> arzt
Lehrerinnen -> lehrerinn | Ärztinnen -> arztinn
Есть ли способ заставить этот стеммер возвращать одинаковые стебли для всех четырех версий, женской и мужской? В качестве альтернативы, есть ли другой стеммер, делающий это?
Обновить
В итоге я добавил "-innen" и "-in" в качестве первых записей в суффикс-кортеже шага 1, например так:
stemmer = GermanStemmer()
stemmer._GermanStemmer__step1_suffixes = ("innen", "in") + stemmer._GermanStemmer__step1_suffixes
Таким образом, все вышеперечисленные слова lehr
а также arzt
соответственно. Кроме того, все другие "рабочие формы", которые я пробовал до сих пор, основаны правильно, то есть мужские и женские формы имеют одинаковые основы. Кроме того, если "форма работы" происходит от глагола, как Lehrer/in
они имеют такой же основа, как и глагол.
1 ответ
Немецкий специалист по снежному кому идет в три этапа:
- Удалить
ern
,em
,er
,en
,es
,e
,s
суффиксы - Удалить
est
,en
,er
,st
суффиксы - Удалить
isch
,lich
,heit
,keit
,end
,ung
,ig
,ik
суффиксы
Не зная много о грамматике немецкого языка, кажется, что in
будет принадлежать к тому же классу, что и суффиксы шага 3 (они называются "деривационными суффиксами" в источнике NLTK). Казалось бы, добавление in
к этому списку суффиксов нужно заставить стеблера Snowball удалить его, но есть две проблемы.
Первая проблема в том, что из ваших примеров я вижу, что in
становится inn
когда следует en
, Это можно обойти, добавив оба in
а также inn
к списку суффиксов шага 3, но это не решает вторую проблему.
Глядя на GermanStemmer.stem()
источник, каждый шаг будет удалять только один суффикс. Таким образом, если существует более одного деривационного суффикса (т.е. in
плюс любой из суффиксов, перечисленных выше], будет удален только один.
В таких случаях (и я не знаю достаточно о немецком, чтобы знать, может ли это на самом деле произойти), вам нужно будет отредактировать вручную GermanStemmer.stem()
добавить четвертыйin
удаление ". Это также позволило бы более точный контроль в случае множественного числа. Но, честно говоря, в этот момент, вероятно, лучше просто специальное удаление in
оборачивая GermanStemmer.stem()
вызов. Например:
from nltk.stem.snowball import GermanStemmer
def stem_german(word):
plural = word.endswith("en") #for deciding if we are looking for "in" or "inn"
stemmed_word = GermanStemmer().stem(word)
feminine_suffix = "in" if not plural else "inn"
if stemmed_word.endswith(feminine_suffix):
stemmed_word = stemmed_word[:-len(feminine_suffix)]
return stemmed_word
--Редактировать--
Если вы хотите добавить in
к одному из шагов Snowball Stemmer вы можете сделать это, используя:
#Using nltk.stem.snowball.SnowballStemmer
stemmer = SnowballStemmer("german")
stemmer.stemmer._GermanStemmer__step3_suffixes += ("in",) #add "in" to the step 3 suffixes
#Using nltk.stem.snowball.GermanStemmer
stemmer = GermanStemmer()
stemmer._GermanStemmer__step3_suffixes += ("in",)
Обратите внимание на запятую после "in"
, Этот код не будет работать без него. Вы также можете заменить 3
с каким шагом вы хотите изменить. Я не совсем уверен, почему это _GermanStemmer__step3_suffixes
и не только __step3_suffixes
но я убедился, что этот код работает на Python 3.6.4 и NLTK 3.2.5.
Я бы не рекомендовал такой подход, так как он не будет должным образом иметь дело с innen
, Кроме того, поскольку каждый шаг удаляет не более одного суффикса, он не будет правильно обрабатывать такие слова, как Lehrerinnen
который имеет en
, in
, а также er
(шаг 3 не проверяет er
). Я думаю, что вам лучше всего скопировать и вставить все GermanStemmer
(находится в ссылке на исходный код выше. Используйте ctrl+f
) и добавьте шаг 2.5 к stem()
который проверяет и удаляет in/inn
,