Python 波特词干分析器能返回词缀而不是词干吗?

Python 波特词干分析器能返回词缀而不是词干吗?,python,nlp,nltk,porter-stemmer,Python,Nlp,Nltk,Porter Stemmer,我正在做一个项目,在这个项目中,我试图计算多个语料库中屈折形态的百分比,以便对它们进行比较 我知道如何使用nltk Porter词干分析器来获取单词的词根,但如果我能返回词缀而不是词根,那将对我更有帮助。如果我能做到这一点,我就可以计算词干分析器截取的词缀数量(“ly”“ed”等),并将其与单词总数进行比较。这可能是一个简单的翻转,但我不知道如何处理词根。好吧,如果你想得到词缀,只需从原始单词形式中删除词根(porter result)就可以了 考虑以下伪代码: word = "hopeful"

我正在做一个项目,在这个项目中,我试图计算多个语料库中屈折形态的百分比,以便对它们进行比较


我知道如何使用nltk Porter词干分析器来获取单词的词根,但如果我能返回词缀而不是词根,那将对我更有帮助。如果我能做到这一点,我就可以计算词干分析器截取的词缀数量(“ly”“ed”等),并将其与单词总数进行比较。这可能是一个简单的翻转,但我不知道如何处理词根。

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

考虑以下伪代码:

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

另一个可能对你有帮助的替代方法是使用“连字号”,因为它可以潜在地将单词分成语素,而不仅仅是将单词按词根分开。因此,它可以给你更多的词缀信息。

你确定你说的是屈折形态吗?词形变化意味着词性保持不变,而单词的变化只是为了表达某些语法特征(如过去)。屈折词缀总是后缀,如果我们不考虑不规则词,它们的数量是有限的(
-ed
-ing
-er
-est
-s
-es

然而,你似乎在谈论衍生词法,因为可能只有一个屈折词尾,所以我对它们进行计数是没有意义的(如果是引理,则为
0
,如果是屈折形式,则为
1

如果你说的是派生词缀,那么你要找的就是语素切分/标记化,这不是一件容易的事,因为单词派生过程受许多因素的影响,并且没有很好的定义。在简单的情况下,我们只需在根中添加一个后缀(或前置前缀),但是在某些情况下,根中的一些字母会被删除(
到达
->
到达
),更改(
尝试
->
尝试
或更不寻常,例如
假设
->
假设
)(
戏剧
->
剧作家
)。此外,您需要一些语义知识数据库,因为没有它,不可能在所有情况下正确确定语素。例如,单词
记住
可以标记为
re-
+
成员
。如果没有语义,这样的词法分析看起来非常合理,因为
re-
是一个相当流行的前缀,意思是重复,而
member
是一个已有的词。了解语义关系会告诉我们
member
memory
是不相关的(我相信它们可能在词源上相关,但在现代语言中这种关系并不那么明显)


签出和。第一个是一个API,它解析英语并以JSON格式提供数据。词缀作为JSON的一部分提供。Morfessor是一个用于形态分割的工具,因此它完全可以满足您的需要。

谢谢,这很有意义。但是,我得到了属性错误:str没有属性移除。还有其他方法可以删除吗删除字符串的一部分将最后一行替换为
词缀=word.split(stem_word)[-1]
。这仅在词缀不为空时有效。Hi将,是的,该错误是因为“.remove”是伪代码(它不属于任何编程语言),这只是向您展示这个想法。如果您正在使用python,请尝试@DYZ的建议,它应该会起作用。然后,如果这对您有效,请不要忘记接受我的回答:)一般来说,您想要的是不可能的。例如,据波特报道,“shy”的词干是“shi”,它不是原始单词的适当子集。@DYZ你说得对。也许更通用的自动解决方案是查找输入和输出单词之间的差异。类似于“提取最大子字符串”,然后根据具体需要使用差异。例如:波特(“shy”)=“shi”,然后是“y”-->“i”,所以它标记了它们的词缀或词组。