德语词干处理器未能去除女性后缀“-in”和“-innen”。

3

在德语中,每个职业都有男性和女性版本。女性版本通过在男性版后加上“-in”后缀来派生而来,在复数形式中变成“-innen”。

示例:

      | English          | German
------+------------------+-----------------------
masc. | teacher  doctor  | Lehrer      Arzt
fem.  | teacher  doctor  | Lehrerin    Ärztin
masc. | teachers doctors | Lehrer      Ärzte
fem.  | teachers doctors | Lehrerinnen Ärztinnen

目前,我正在使用NLTK的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

这样,上述所有单词都被分别转换为 lehrarzt。此外,到目前为止我尝试的所有其他“职业形式”都被正确地转换了,这意味着男性和女性形式具有相同的词干。此外,如果“职业形式”是从动词派生而来的,例如 Lehrer/in,它们与动词具有相同的词干。

1个回答

3
德语Snowball词干提取器遵循三个步骤的过程
  1. 删除 ern, em, er, en, es, e, s 后缀
  2. 删除 est, en, er, st 后缀
  3. 删除 isch, lich, heit, keit, end, ung, ig, ik 后缀

由于不了解德语语法,似乎in应该属于第3步后缀的同类(在NLTK源中被称为“派生后缀”)。添加in到后缀列表中似乎应该强制Snowball词干提取器将其删除,但存在两个问题。

第一个问题是,从你的例子中我看到当后面跟着en时,in会变成inn。可以通过将ininn都添加到步骤3后缀列表中来解决这个问题,但这并不能解决第二个问题。
查看GermanStemmer.stem()源代码,每个步骤只会删除单个后缀。因此,如果有多个派生后缀(例如in加上上面列出的任何一个后缀),只会删除其中的一个。
在这种情况下(我对德语不太了解,不知道这是否真的会发生),您需要手动编辑GermanStemmer.stem()以添加第四个“in去除”步骤。这也将允许更精细地控制复数形式。但说实话,在那时候最好还是通过包装您的GermanStemmer.stem()调用来手动删除in。例如:
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

如果您想在Snowball Stemmer步骤中添加 `in`,可以使用以下方法:
#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这样的单词,其中包含eniner(步骤3不检查er)。我认为您最好的选择是复制并粘贴GermanStemmer的全部内容(在上面的源代码链接中找到。使用ctrl+f),并向stem()添加一个步骤2.5来检查并删除in/inn

谢谢您的回答!我不知道如何将额外的后缀传递给词干提取器。我需要复制并修改源代码吗?此外,我认为-in更应该属于第一步(虽然不确定)。这样第二步仍然会删除男性的“职业后缀”-er,如果有的话,就像在Lehrerin中一样。顺便说一下,您的算法没有做到这一点。也许在去除ininnen之后再次进行词干提取可以解决这个问题? - sebrockm
看我的编辑。我认为你最好的选择是复制并修改GermanStemmer.stem()来添加第2.5步。 - acattle
谢谢!那帮了我很多。实际上,我最终在步骤1的后缀中添加了 ("innen", "in"),看起来完美无瑕。通过将其添加到前面,en 将永远不会从 innen 中删除,因为 innen 首先被处理。我还没有发现任何错误。可能有一些以 in 结尾但并非女性词汇的单词,但它们很少,并且这个问题也会出现在所有其他后缀中。 - sebrockm
看起来,Snowball 似乎会从以 en 结尾的单词中移除它,即使它们并不是复数。 - acattle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接