德国人的声音没有删除女性后缀“-in”和“-innen”
German stemmer is not removing feminine suffixes "-in" and "-innen"
在德语中,每项工作都有女性化和男性化的版本。阴性的是通过添加“-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
。
return这些词干:
Lehrer -> lehr | Arzt -> arzt
Lehrerin -> lehrerin | Ärztin -> arztin
Lehrer -> lehr | Ärzte -> arzt
Lehrerinnen -> lehrerinn | Ärztinnen -> arztinn
有没有办法让这个词干分析器 return 所有四个版本(女性和男性)都使用相同的词干?或者,还有其他词干分析器在做吗?
更新
我最终添加了“-innen”和“-in”作为步骤 1 后缀元组中的第一个条目,如下所示:
stemmer = GermanStemmer()
stemmer._GermanStemmer__step1_suffixes = ("innen", "in") + stemmer._GermanStemmer__step1_suffixes
这样,上面所有的词都分别被词干化为 lehr
和 arzt
。此外,到目前为止我尝试过的所有其他 "job-forms" 的词干都是正确的,这意味着阳性和阴性形式具有相同的词干。此外,如果 "job-form" 源自动词,例如 Lehrer/in
,它们与动词具有相同的词干。
德国雪球词干分析器follows a three step process:
- 删除
ern
、em
、er
、en
、es
、e
、s
后缀
- 删除
est
、en
、er
、st
后缀
- 删除
isch
、lich
、heit
、keit
、end
、ung
、ig
、ik
后缀
对德语语法了解不多,似乎 in
与第 3 步后缀属于相同的 class(这些在 NLTK 中称为 "derivational suffixes"资源)。似乎将 in
添加到此后缀列表应该会强制 Snowball 词干提取器将其删除,但存在两个问题。
第一个问题是,从您的示例中我看到 in
在后面跟着 en
时变成了 inn
。这可以通过将 in
和 inn
添加到步骤 3 后缀列表来解决,但这并不能解决第二个问题。
查看GermanStemmer.stem()
source,每一步只会删除一个后缀。因此,如果有多个派生后缀(即 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
--编辑--
如果您想将 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 步不t 检查 er
)。我认为你最好的选择是复制并粘贴整个 GermanStemmer
(在上面的源代码 link 中找到。使用 ctrl+f
)并将步骤 2.5 添加到 stem()
检查并删除 in/inn
.
在德语中,每项工作都有女性化和男性化的版本。阴性的是通过添加“-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
。
return这些词干:
Lehrer -> lehr | Arzt -> arzt
Lehrerin -> lehrerin | Ärztin -> arztin
Lehrer -> lehr | Ärzte -> arzt
Lehrerinnen -> lehrerinn | Ärztinnen -> arztinn
有没有办法让这个词干分析器 return 所有四个版本(女性和男性)都使用相同的词干?或者,还有其他词干分析器在做吗?
更新
我最终添加了“-innen”和“-in”作为步骤 1 后缀元组中的第一个条目,如下所示:
stemmer = GermanStemmer()
stemmer._GermanStemmer__step1_suffixes = ("innen", "in") + stemmer._GermanStemmer__step1_suffixes
这样,上面所有的词都分别被词干化为 lehr
和 arzt
。此外,到目前为止我尝试过的所有其他 "job-forms" 的词干都是正确的,这意味着阳性和阴性形式具有相同的词干。此外,如果 "job-form" 源自动词,例如 Lehrer/in
,它们与动词具有相同的词干。
德国雪球词干分析器follows a three step process:
- 删除
ern
、em
、er
、en
、es
、e
、s
后缀 - 删除
est
、en
、er
、st
后缀 - 删除
isch
、lich
、heit
、keit
、end
、ung
、ig
、ik
后缀
对德语语法了解不多,似乎 in
与第 3 步后缀属于相同的 class(这些在 NLTK 中称为 "derivational suffixes"资源)。似乎将 in
添加到此后缀列表应该会强制 Snowball 词干提取器将其删除,但存在两个问题。
第一个问题是,从您的示例中我看到 in
在后面跟着 en
时变成了 inn
。这可以通过将 in
和 inn
添加到步骤 3 后缀列表来解决,但这并不能解决第二个问题。
查看GermanStemmer.stem()
source,每一步只会删除一个后缀。因此,如果有多个派生后缀(即 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
--编辑--
如果您想将 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 步不t 检查 er
)。我认为你最好的选择是复制并粘贴整个 GermanStemmer
(在上面的源代码 link 中找到。使用 ctrl+f
)并将步骤 2.5 添加到 stem()
检查并删除 in/inn
.