PeY*_*TlL 30 python stemming nltk
我尝试了所有用于词干分析的nltk方法,但它给了我一些奇怪的结果.
例子
当它不应该这样做时,它通常会削减单词的结尾:
或者不是很好:
你知道python中的其他词干库,还是一本好词典?
谢谢
Spa*_*ost 109
你得到的结果(通常)是预期的英语词干分析器.你说你试过"所有nltk方法",但是当我尝试你的例子时,情况似乎并非如此.
以下是使用PorterStemmer的一些示例
import nltk
ps = nltk.stemmer.PorterStemmer()
ps.stem('grows')
'grow'
ps.stem('leaves')
'leav'
ps.stem('fairly')
'fairli'
Run Code Online (Sandbox Code Playgroud)
结果是'成长','leav'和'fairli',即使它们是你想要的,也是原始单词的词干版本.
如果我们切换到Snowball词干分析器,我们必须提供语言作为参数.
import nltk
sno = nltk.stem.SnowballStemmer('english')
sno.stem('grows')
'grow'
sno.stem('leaves')
'leav'
sno.stem('fairly')
'fair'
Run Code Online (Sandbox Code Playgroud)
结果与"成长"和"离开"一样,但"公平"被认为是"公平"
所以在这两种情况下(并且nltk中有两个以上的词干分析器),你说的话实际上并不是词.当提供'easy'或'easy'作为输入时,LancasterStemmer将返回'easy'.
也许你真的想要一个lemmatizer?这将使'article'和'poodle'保持不变.
import nltk
lemma = nltk..wordnet.WordNetLemmatizer()
lemma.lemmatize('article')
'article'
lemma.lemmatize('leaves')
'leaf'
Run Code Online (Sandbox Code Playgroud)
0xF*_*0xF 11
这里讨论的所有这些词干分析器都是算法词干分析器,因此它们总能产生意想不到的结果,例如
In [3]: from nltk.stem.porter import *
In [4]: stemmer = PorterStemmer()
In [5]: stemmer.stem('identified')
Out[5]: u'identifi'
In [6]: stemmer.stem('nonsensical')
Out[6]: u'nonsens'
Run Code Online (Sandbox Code Playgroud)
要正确获取根词,需要一个基于字典的词干提取器,如Hunspell Stemmer.Here是以下链接中的python实现.示例代码在这里
>>> import hunspell
>>> hobj = hunspell.HunSpell('/usr/share/myspell/en_US.dic', '/usr/share/myspell/en_US.aff')
>>> hobj.spell('spookie')
False
>>> hobj.suggest('spookie')
['spookier', 'spookiness', 'spooky', 'spook', 'spoonbill']
>>> hobj.spell('spooky')
True
>>> hobj.analyze('linked')
[' st:link fl:D']
>>> hobj.stem('linked')
['link']
Run Code Online (Sandbox Code Playgroud)
Stemmers 的攻击性各不相同。Porter 是最具侵略性的英语词干分析器之一。我发现它通常伤害大于帮助。在较轻的方面,您可以使用已经建议的 lemmatizer,或者使用较轻的算法词干分析器。lemmatizers 的局限性在于它们无法处理未知单词。
我个人喜欢 Krovetz 词干分析器,它是一种混合解决方案,结合了字典词形还原器和轻量级词干分析器来处理词汇不足的单词。Krovetz 也kstem
或light_stemmer
Elasticsearch 中的选项。pypi https://pypi.org/project/KrovetzStemmer/上有一个 python 实现,尽管这不是我使用过的。
另一种选择是spaCy
. 对spaCy
每个令牌进行处理后都有一个lemma_
属性。(注意下划线lemma
包含 的数字标识符lemma_
) - https://spacy.io/api/token
以下是一些比较各种词干算法的论文:
词干是关于删除后缀(通常只有后缀,据我尝试,没有一个 nltk 词干分析器可以删除前缀,忘记中缀)。所以我们可以清楚地将词干称为一个愚蠢的/不那么智能的程序。它不会检查一个词在词干之前或之后是否有意义。例如。如果你试图去掉“xqaing”,虽然不是一个词,它会删除“-ing”并给你“xqa”。
因此,为了使用更智能的系统,可以使用词形还原器。Lemmatizers 以 wordnet 和字典的形式使用格式良好的引理(单词)。所以它总是返回并使用适当的词。但是,它很慢,因为它会遍历所有单词以找到相关单词。
Ste*_*Lin -8
英语的 Porter、Porter2、Paice-Husk 和 Lovins 词干算法的 Python 实现可在Stemming 包中找到