德语中的每项工作都有女性化和男性化的特点。女性一词通过添加“ -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
这样,上述所有单词分别词干分别为lehr
和arzt
。另外,到目前为止,我尝试过的所有其他“工作形式”都是正确词干的,这意味着男性形式和女性形式具有相同的词干。另外,如果“工作形式”是从动词派生的,例如Lehrer/in
,则它们的动词词干与动词相同。
答案 0 :(得分:1)
德国雪球高手follows a three step process:
ern
,em
,er
,en
,es
,e
,s
后缀est
,en
,er
,st
isch
,lich
,heit
,keit
,end
,ung
,ig
,{{1} }后缀对德语语法了解不多,似乎ik
与步骤3后缀(在NLTK来源中被称为“衍生后缀”)属于同一类。在此后缀列表中添加in
似乎会迫使Snowball提取器将其删除,但是存在两个问题。
第一个问题是,从您的示例中,我看到in
在紧随in
之后变为inn
。可以通过在第3步后缀列表中同时添加en
和in
来解决此问题,但这不能解决第二个问题。
看着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
。另外,由于每个步骤最多都删除了一个后缀,因此将无法正确处理具有innen
,Lehrerinnen
和en
的单词in
(步骤3不会t检查er
)。我认为您最好的选择是复制并粘贴整个er
(在上面的源代码链接中找到。使用GermanStemmer
)并向ctrl+f
添加步骤2.5,以检查和删除stem()
。