我正在做一个项目,在这个项目中,我试图计算多个语料库的屈折形态的百分比,以便进行比较。
我知道如何使用 nltk Porter Stemmer 来获取单词的词根,但如果我可以返回词缀而不是词根,那对我来说会更有帮助。如果我能做到这一点,我可以计算词干分析器截掉的词缀数量("ly"ed"等),并将其与单词总数进行比较。这可能是一个简单的翻转,但我无法弄清楚如何用根做到这一点。
你确定你在谈论屈折形态吗?屈折意味着词性保持不变,单词仅更改以表达某些语法特征(如过去)。屈折词缀总是后缀,如果我们不考虑不规则词,它们的数量有限(-ed
、-ing
、-er
、-est
、-s
、-es
)。
但是,您似乎在谈论派生形态学,因为可能只有一个屈折后缀,因此我计算它们没有意义(如果是引理,则0
,如果是屈折形式,则1
)。
如果你在谈论派生词缀,那么你正在寻找的被称为语素分割/标记化,这不是一件容易的事情,因为单词派生过程受到许多因素的影响并且没有很好的定义。在简单的情况下,我们只是在根后附加一个后缀(或前缀前缀),但是在某些情况下,根中的某些字母被删除(arrive
->arrival
),更改(try
->tried
或更不寻常,如assume
->assumption
)甚至附加(drama
->dramatist
)。此外,您需要拥有一些语义知识数据库,因为没有它,就不可能在所有情况下正确确定语素。例如,单词remember
可以标记为re-
+member
。如果没有语义,这种形态分析看起来相当合理,因为re-
是一个非常流行的前缀,意思是重复,member
是一个现有的词。了解语义关系会告诉我们member
和remember
是不相关的(我相信它们可能在词源上相关,但在现代语言中,这种关系并不那么明显)。
结帐 Lingua Robot 和 Morfessor。第一个是解析英语维基词典并以 JSON 格式提供数据的 API。词缀作为此 JSON 的一部分提供。Morfessor 是一种形态分割工具,因此它完全符合您的需求。
好吧,如果你想获得词缀,只需从原始单词形式中删除根(波特结果)应该可以。
考虑以下伪代码:
word = "hopeful"
stem_word = porter(word) # stem_word should be "hope"
affix = word.remove(stem_word) # affix should be "ful"
其他可能可以帮助您的替代方法是使用"连字符",因为它可能会将单词分成语素,而不仅仅是按词根拆分单词。因此,它可以为您提供更多附加信息。