python - 德语词干分析器不会删除女性后缀“-in”和“-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
. 它返回这些词干:
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
,则它们与动词具有相同的词干。
解决方案
德国雪球词干分析器遵循三个步骤:
- 删除
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
which have en
、in
和之类的单词er
(步骤 3 不检查er
)。我认为你最好的选择是复制并粘贴全部GermanStemmer
(在上面的源代码链接中找到。使用ctrl+f
)并添加一个步骤 2.5 来stem()
检查和删除in/inn
.
推荐阅读
- javascript - JavaScript 代码预计只返回本周的几天,但会跳过第二天
- decimal - 为什么 Mathematica 中的精度不能始终如一地工作,或者有时根本不工作?
- clang++ - 如何使用clang获取标准库c++进行交叉编译
- entity-framework-plus - Entity Framework Plus - 使用 IncludeFilter 和 Include
- typescript - TypeScript 从类型中过滤掉类型
- vue.js - 如何在一个vue项目中同时使用多个app?
- angular - Nativescript Angular将字体真棒图标代码注入字段
- c - C中的字符串比较与运算符
- javascript - 如何使用 PHP while 语句迭代将触发模式弹出窗口的按钮
- html - 网站内容位于工具栏旁边而不是下方