德国词干不删除女性后缀“ -in”和“ -innen”

时间:2018-07-13 01:17:18

标签: python nlp nltk stemming snowball-stemmer

德语中的每项工作都有女性化和男性化的特点。女性一词通过添加“ -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 个答案:

答案 0 :(得分:1)

德国雪球高手follows a three step process

  1. 删除ernemereneses后缀
  2. 删除后缀estenerst
  3. 删除ischlichheitkeitendungig,{{1} }后缀

对德语语法了解不多,似乎ik与步骤3后缀(在NLTK来源中被称为“衍生后缀”)属于同一类。在此后缀列表中添加in似乎会迫使Snowball提取器将其删除,但是存在两个问题。

第一个问题是,从您的示例中,我看到in在紧随in之后变为inn。可以通过在第3步后缀列表中同时添加enin来解决此问题,但这不能解决第二个问题。

看着GermanStemmer.stem() source,每一步只会删除一个后缀。因此,如果存在多个导数后缀(即inn加上上面列出的任何后缀),则仅将其删除。

在这种情况下(而且我对德语不太了解,是否真的会发生),您需要手动编辑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 添加到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的原因,但我已经验证该代码可在Python 3.6.4和NLTK 3.2.5上使用。

但是,

我不会不推荐,因为它不能正确处理__step3_suffixes。另外,由于每个步骤最多都删除了一个后缀,因此将无法正确处理具有innenLehrerinnenen的单词in(步骤3不会t检查er)。我认为您最好的选择是复制并粘贴整个er(在上面的源代码链接中找到。使用GermanStemmer)并向ctrl+f添加步骤2.5,以检查和删除stem()