Porter Stemmer可以返回词缀而不是词干吗?

时间:2019-03-29 21:10:24

标签: python nlp nltk porter-stemmer

我正在一个项目中,我试图计算多个语料库的变形形态百分比以进行比较。

我知道如何使用nltk Porter Stemmer来获得单词的词根,但是如果我可以返回词缀而不是词根,则对我来说将更有帮助。如果可以的话,我可以算出词干截断词缀(“ ly”,“ ed”等)的词缀数量,并将其与单词总数进行比较。这可能是一个简单的翻转,但我不知道该如何从根开始。

2 个答案:

答案 0 :(得分:0)

好吧,如果您想获得词缀,只需从原始单词形式中删除根(porter结果)就可以了。

考虑此伪代码:

word = "hopeful"
stem_word = porter(word)           #  stem_word should be "hope"
affix = word.remove(stem_word)     # affix should be "ful" 

也许可以帮助您的其他替代方法是使用“连字符”,因为它可以将单词分解为词素,而不仅仅是将单词按词根分开。因此,它可以为您提供更多的词缀信息。

答案 1 :(得分:0)

您确定要谈论屈折形态吗?词尾变化意味着词性保持不变,并且单词被更改只是为了表达某些语法特征(如过去)。屈折词缀始终是后缀,如果我们不考虑不规则词,则数量有限(-ed-ing-er-est,{ {1}},-s)。

但是,您似乎在谈论微分形态,因为可能只有一个屈折后缀,所以对它们进行计数对我来说没有任何意义(如果是引理,则为-es,而{{1} }(如果是变体形式)。

如果您在谈论派生词缀,那么您要找的是词素分割/令牌化,这并不是一件容易的事,因为单词派生过程受许多因素影响且定义不明确。在简单的情况下,我们只需在根目录后添加一个后缀(或前缀前缀),但是在某些情况下,根目录中的某些字母会被删除(0-> 1),并被更改({{ 1}}-> arrive或更常见,例如arrival-> try)甚至附加(tried-> assume)。此外,您需要具有一些语义知识数据库,因为没有它,就不可能在所有情况下都正确地确定词素。例如,单词assumption可以标记为drama + dramatist。没有语义,这种形态学分析就显得很合理,因为remember是一个非常流行的前缀,表示重复,而re-是一个现有单词。知道语义关系会告诉我们memberre-是不相关的(我相信它们可能在词源上是相关的,但是在现代语言中,这种关系并不那么明显)。

检出Lingua RobotMorfessor。第一个是解析英语Wiktionary并以JSON提供数据的API。前缀是此JSON的一部分。 Morfessor是用于形态分割的工具,因此它可以满足您的需求。